Merge lp:~kenneth-arnold/divisi/svdlibc-cleanup into lp:divisi

Proposed by Ken Arnold
Status: Merged
Merged at revision: not available
Proposed branch: lp:~kenneth-arnold/divisi/svdlibc-cleanup
Merge into: lp:divisi
Diff against target: 8671 lines (+2994/-1908)
20 files modified
csc/divisi/blend.py (+6/-0)
csc/divisi/exceptions.py (+3/-0)
csc/divisi/labeled_view.py (+39/-39)
csc/divisi/normalized_view.py (+68/-30)
csc/divisi/svd.py (+2/-2)
csc/divisi/tensor.py (+39/-7)
svdlib/_svdlib.c (+2388/-1566)
svdlib/_svdlib.pyx (+75/-107)
svdlib/svdlib.c (+17/-1)
svdlib/svdlib.h (+5/-0)
svdlib/svdutil.c (+63/-29)
svdlib/svdutil.h (+4/-2)
svdlib/svdwrapper.c (+4/-8)
test/tensor_util.py (+2/-0)
test/test_blend.py (+3/-0)
test/test_means.py (+46/-0)
test/test_normalization.py (+45/-0)
test/test_offset_svd.py (+77/-0)
test/test_svd.py (+100/-0)
test/tests.py (+8/-117)
To merge this branch: bzr merge lp:~kenneth-arnold/divisi/svdlibc-cleanup
Reviewer Review Type Date Requested Status
Commonsense Computing Pending
Review via email: mp+14316@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Ken Arnold (kenneth-arnold) wrote :

This branch includes the offset SVD code, some cleanups and micro-optimizations to the SVDLIBC wrapper code, and some additional work on the tests. (It also adds a .unnormalized() method to LabeledView.)

I've tested it fairly extensively and regularly use it, but I'd like some review on it and independent testing before merging to trunk. My main concern is that I broke some edge case while cleaning up _svdlibc.pyx, but should also check that normal AnalogySpace and Blending still give correct results.

432. By Ken Arnold

exceptions: move InvalidLayeringException to csc.divisi.exceptions.

433. By Ken Arnold

tests: split out the basic normalization tests.

434. By Ken Arnold

Normalization: normalizing an already-normalized tensor is probably a mistake, so fail early.

435. By Ken Arnold

Normalization: revise the error message from the last commit.

436. By Ken Arnold <kcarnold@kagu>

svd results: u_angles_to uses .norm. (Does anyone actually use this? There are no tests for it. otoh, no tests for u_dotproducts_with.)

437. By Ken Arnold <kcarnold@kagu>

NormalizedView: it's okay to layer a MeanSubtractedview on a NormalizedView. This is really hacky code, though...

438. By Ken Arnold <kcarnold@kagu>

View: add and use stack_contains.

439. By Ken Arnold <kcarnold@kagu>

Blend: complain if we try to Blend a MeanSubtractedView.

440. By Ken Arnold <kcarnold@kagu>

LabeledSVD2DResults: fix types of lesser-used elements, and make Pickle work at decent speed.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'csc/divisi/blend.py'
2--- csc/divisi/blend.py 2009-10-19 22:04:39 +0000
3+++ csc/divisi/blend.py 2009-11-17 23:59:08 +0000
4@@ -1,6 +1,7 @@
5 from csc.divisi.tensor import DictTensor, Tensor
6 from csc.divisi.ordered_set import OrderedSet
7 from csc.divisi.labeled_view import LabeledView
8+from csc.divisi.normalized_view import MeanSubtractedView
9 from itertools import chain, izip
10 import logging
11 from math import sqrt
12@@ -104,6 +105,11 @@
13 names, tensors = zip(*tensors)
14 else:
15 names = map(repr, tensors)
16+
17+ for tensor in tensors:
18+ if tensor.stack_contains(MeanSubtractedView):
19+ raise TypeError("You can't blend MeanSubtractedViews. Try mean-subtracting the resulting blend.")
20+
21 self._tensors = tuple(tensors)
22 self.names = tuple(names)
23 self.logger.info('tensors: %s', ', '.join(self.names))
24
25=== modified file 'csc/divisi/exceptions.py'
26--- csc/divisi/exceptions.py 2009-02-26 22:07:47 +0000
27+++ csc/divisi/exceptions.py 2009-11-17 23:59:08 +0000
28@@ -3,3 +3,6 @@
29
30 class DimensionMismatch(Error):
31 pass
32+
33+class InvalidLayeringException(Error):
34+ pass
35
36=== modified file 'csc/divisi/labeled_view.py'
37--- csc/divisi/labeled_view.py 2009-09-24 01:15:17 +0000
38+++ csc/divisi/labeled_view.py 2009-11-17 23:59:08 +0000
39@@ -1,5 +1,5 @@
40 from csc.divisi.ordered_set import OrderedSet, IdentitySet, indexable_set
41-from csc.divisi.tensor import View, TheEmptySlice
42+from csc.divisi.tensor import View, TheEmptySlice, DictTensor, DenseTensor
43 import copy
44 import heapq
45 from operator import itemgetter
46@@ -31,7 +31,6 @@
47 'tfidf.T': use tf-idf, transposed (matrix is documents by terms)
48 a class: adds that class as a layer.
49 '''
50- from csc.divisi.tensor import DictTensor
51 if labels is None: labels = [OrderedSet() for _ in xrange(ndim)]
52 tensor = LabeledView(DictTensor(ndim), labels)
53 if initial is not None:
54@@ -46,7 +45,6 @@
55
56
57 def make_dense_labeled_tensor(data, labels):
58- from csc.divisi.tensor import DenseTensor
59 return LabeledView(DenseTensor(data), labels)
60
61
62@@ -289,10 +287,16 @@
63 return self.layer_on(-self.tensor)
64
65 def to_dense(self):
66+ '''Change the underlying representation to a dense tensor.'''
67 return self.layer_on(self.tensor.to_dense())
68-
69+
70 def to_sparse(self):
71+ '''Change the underlying representation to a sparse tensor.'''
72 return self.layer_on(self.tensor.to_sparse())
73+
74+ def bake(self):
75+ '''Simplify the representation to a LabeledView of a DictTensor.'''
76+ return make_sparse_labeled_tensor(ndim=self.ndim, initial=self.iteritems())
77
78 def dot(self, other):
79 """
80@@ -361,20 +365,12 @@
81 def layer_on(self, tensor):
82 return LabeledView(tensor, self._labels)
83
84- def zero_mean_normalized(self, mode=0, prefix='-'):
85- # This is a special case, since we must duplicate labels
86- new_tensor = self.tensor.zero_mean_normalized(mode=mode)
87-
88- new_labels = copy.deepcopy(self._labels)
89- # Duplicate labels, preserving the property that
90- # index(label)[mode] = index(prefix label)[mode] - self.tensor.shape[mode]
91- for i in xrange(self.tensor.shape[mode]):
92- l = self.label(mode, i)
93- new_labels[mode].add(prefix + l)
94-
95- return LabeledView(new_tensor, new_labels)
96-
97-
98+ def unnormalized(self):
99+ '''
100+ Remove the topmost layer of normalization from this tensor stack.
101+ '''
102+ return self.layer_on(self.tensor.unnormalized())
103+
104 def array_op(self, op, labels=None, *args, **kwargs):
105 """
106 Apply an operation to the tensor inside (which must be a
107@@ -397,7 +393,7 @@
108 labels = self.label_list(0)
109 return dict((labels[i], float(self.tensor[i])) for i in xrange(self.shape[0]))
110
111- def top_items(self, n=10, largest=True, key=None, abs_val=None):
112+ def top_items(self, n=10, largest=True, key=None):
113 '''
114 For each of the top n items with greatest values, return a pair of
115 the item and its value.
116@@ -410,12 +406,6 @@
117 If the tensor is 1D, gives indices instead of one-item tuples.
118 Always expresses the output in floats directly.
119 '''
120- if abs_val is not None:
121- import warnings
122- warnings.warn(DeprecationWarning('abs_val is deprecated. use key=abs.'))
123- assert key is None
124- key = abs
125-
126 if key is not None:
127 extreme_key = lambda ent: key(ent[1])
128 else:
129@@ -429,17 +419,6 @@
130 else:
131 return [(k, float(v)) for k, v in items]
132
133- def bake(self):
134- '''
135- Simplify the representation.
136- '''
137- return make_sparse_labeled_tensor(ndim=self.ndim, initial=self.iteritems())
138-
139- def to_dense(self):
140- '''Change the underlying representation to a dense tensor.'''
141- return LabeledView(self.tensor.to_dense(), self._labels)
142-
143-
144 def concatenate(self, other):
145 concat_dense = self.tensor.concatenate(other.tensor)
146 newlabels = OrderedSet(list(self.label_list(0)) +
147@@ -466,6 +445,14 @@
148 [LabeledView(mag, [labels]) for mag, labels
149 in izip(magnitudes, self.label_sets())])
150
151+ def means(self):
152+ '''
153+ Computes the labeled by-slice means for each dimension.
154+ '''
155+ means = self.tensor.means()
156+ return [make_dense_labeled_tensor(means, [labels])
157+ for means, labels in zip(means, self.label_lists())]
158+
159
160 from csc.divisi.svd import SVD2DResults
161 class LabeledSVD2DResults(SVD2DResults):
162@@ -509,7 +496,6 @@
163 @classmethod
164 def load_pytables(cls, filename, copy=False):
165 import numpy as np
166- from csc.divisi.tensor import DenseTensor
167 from csc.divisi.pyt_utils import get_pyt_handle
168 fileh = get_pyt_handle(filename)
169
170@@ -522,9 +508,23 @@
171 return wrapped_tensor(name).labeled(list(getattr(root, label_name)))
172 u = wrapped_labeled_tensor('u', 'u_labels')
173 v = wrapped_labeled_tensor('v', 'v_labels')
174- svals = root.svals.read()
175+ svals = wrapped_tensor('svals')
176 svd = cls(u, v, svals)
177 svd._weighted_u = wrapped_tensor('weighted_u').labeled(u.label_lists())
178 svd._weighted_v = wrapped_tensor('weighted_v').labeled(v.label_lists())
179- svd._core = DenseTensor(root.core)
180+ svd._core = wrapped_tensor('core')
181 return svd
182+
183+ # Pickle also works for loading and saving.
184+ def __getstate__(self):
185+ return dict(
186+ u=self.u,
187+ v=self.v,
188+ svals=self.svals)
189+ def __setstate__(self, state):
190+ self.u = state['u']
191+ self.v = state['v']
192+ self.svals = state['svals']
193+ self.clear_cache()
194+
195+
196
197=== modified file 'csc/divisi/normalized_view.py'
198--- csc/divisi/normalized_view.py 2009-10-22 18:49:23 +0000
199+++ csc/divisi/normalized_view.py 2009-11-17 23:59:08 +0000
200@@ -1,4 +1,5 @@
201-from csc.divisi.tensor import View, InvalidLayeringException
202+from csc.divisi.tensor import View
203+from csc.divisi.exceptions import InvalidLayeringException
204
205 EPSILON = 0.000000001 # for floating point comparisons
206
207@@ -15,7 +16,10 @@
208 input_is_numeric = True
209 output_is_numeric = True
210
211- def __init__(self, tensor, mode=0):
212+ # Default to normalizing on mode 0.
213+ default_modes = 0
214+
215+ def __init__(self, tensor, mode=None):
216 '''
217 * tensor: tensor to view.
218 * mode: which mode to normalize over (0 = rows, 1 = columns, etc.)
219@@ -23,6 +27,10 @@
220 if len(tensor) == 0:
221 raise ValueError('Tensor ' + repr(tensor) + ' is empty.')
222
223+ # If this isn't a MeanSubtractedView, the underlying tensor can't be a normalized view.
224+ if not isinstance(self, MeanSubtractedView) and tensor.stack_contains(BaseNormalizedView):
225+ raise TypeError('Already normalized; .unnormalized() first.')
226+
227 # The underlying tensor must be numeric.
228 for part in tensor.example_key():
229 if not isinstance(part, (int, long)):
230@@ -43,12 +51,16 @@
231 raise TypeError('Normalized views are read-only.')
232
233 @property
234- def normalize_mode(self):
235+ def normalize_modes(self):
236 """
237- Which mode of the tensor is normalized (0 for rows, 1 for columns,
238+ Which modes of the tensor is normalized (0 for rows, 1 for columns,
239 etc.)
240 """
241- return self._normalize_mode
242+ modes = self._normalize_mode
243+ if modes is None: modes = self.default_modes
244+ if not isinstance(modes, (list, tuple)):
245+ modes = [modes]
246+ return modes
247
248 @property
249 def norms(self):
250@@ -56,11 +68,18 @@
251 A list of the normalization factors that were computed for each
252 row/column/whatever.
253 """
254+ # FIXME: this method should be in a subclass only.
255 return self._norms
256
257 def item_changed(self, indices, oldvalue, newvalue):
258+ # FIXME: nobody ever even complained that this doesn't
259+ # work. Maybe change notification just isn't worth it, and
260+ # normalized views are just immutable.
261 self.update_norm(indices, oldvalue, newvalue)
262
263+ def update_norm(self, indices, prev, current):
264+ raise NotImplementedError
265+
266 def refresh_norms():
267 """
268 Compute all of the normalization factors from scratch.
269@@ -104,16 +123,9 @@
270 You can also supply a list of modes to normalize over.
271 '''
272
273- @property
274- def modes(self):
275- modes = self._normalize_mode
276- if not isinstance(modes, (list, tuple)):
277- modes = [modes]
278- return modes
279-
280 def refresh_norms(self):
281 tensor = self.tensor
282- modes = self.modes
283+ modes = self.normalize_modes
284 norms = [zeros((tensor.shape[mode],)) for mode in modes]
285 for key, value in self.tensor.iteritems():
286 for mode in modes:
287@@ -124,7 +136,7 @@
288 self._norms = norms
289
290 def update_norm(self, indices, prev, current):
291- modes = self.modes
292+ modes = self.normalize_modes
293 # Handle growing the norms array.
294 for i_mode, mode in enumerate(modes):
295 index = indices[mode]
296@@ -133,9 +145,10 @@
297 self._norms[i_mode][index] += (current*current - prev*prev)
298
299 def __getitem__(self, indices):
300+ # FIXME: this doesn't work well for slices.
301 if not isinstance(indices, (list, tuple)):
302 indices = (indices,)
303- modes = self.modes
304+ modes = self.normalize_modes
305 norm = self.base ** 2 + sum(self._norms[i_mode][indices[mode]]
306 for i_mode, mode in enumerate(modes))
307 data = self.tensor[indices]
308@@ -143,8 +156,7 @@
309 return data / sqrt(norm)
310
311 def iteritems(self):
312- modes = self._normalize_mode
313- if not isinstance(modes, (list, tuple)): modes = [modes]
314+ modes = self.normalize_modes
315 base_squared = self.base ** 2
316 for indices, value in self.tensor.iteritems():
317 norm = base_squared + sum(self._norms[i_mode][indices[mode]]
318@@ -152,9 +164,6 @@
319 yield indices, value / sqrt(norm)
320
321 ### Extraction and views
322- def normalized(self, mode=0):
323- return NormalizedView(self.tensor, mode)
324-
325 def unnormalized(self):
326 return self.tensor
327
328@@ -163,19 +172,54 @@
329 return NormalizedView(self.tensor, self.modes)
330
331 def _svd(self, **kw):
332- if self.normalize_mode == 0:
333+ if list(self.normalize_modes) == [0]:
334 return self.tensor._svd(row_factors=self.norms[0], **kw)
335 return super(NormalizedView, self)._svd(**kw)
336
337 def _isvd(self, **kw):
338- if self.normalize_mode == 0:
339+ if list(self.normalize_modes) == [0]:
340 return self.tensor._isvd(row_factors=self.norms[0], **kw)
341 return super(NormalizedView, self)._isvd(**kw)
342
343 # All other operations fall back to the tensor.
344
345
346-class AvgNormalizedView(BaseNormalizedView):
347+class MeanSubtractedView(BaseNormalizedView):
348+ '''Subtracts out the mean of each row and/or column.
349+
350+ Uses offset parameters to the SVD to compute this efficiently.
351+ '''
352+ default_modes = 0
353+ def refresh_norms(self):
354+ self.means = self.tensor.means()
355+
356+ def __getitem__(self, indices):
357+ # FIXME: slices.
358+ data = self.tensor[indices]
359+ for mode in self.normalize_modes:
360+ # not in-place, in case of slicing.
361+ data = data - self.means[mode][indices[mode]]
362+ return data
363+
364+ # FIXME: iteritems is incorrect if the tensor is not dense, since
365+ # unspecified items will probably be non-zero.
366+
367+ def _svd(self, **kw):
368+ modes = self.normalize_modes
369+ if not all(0 <= m <= 1 for m in modes):
370+ raise NotImplementedError
371+ if 0 in modes:
372+ kw['offset_for_row'] = -self.means[0]
373+ if 1 in modes:
374+ kw['offset_for_col'] = -self.means[1]
375+ print kw
376+ return self.tensor._svd(**kw)
377+
378+ def _isvd(self, **kw):
379+ raise NotImplementedError
380+
381+
382+class OldAvgNormalizedView(BaseNormalizedView):
383 '''A NormalizedView that makes the average to be zero, instead of using a Euclidean norm.'''
384 def refresh_norms(self):
385 tensor = self.tensor
386@@ -190,9 +234,6 @@
387 norms[modes.index(mode)][key[mode]][1] += 1
388 self._norms = norms
389
390- def update_norm(self, indices, prev, current):
391- raise NotImplementedError
392-
393 def __getitem__(self, indices):
394 mode = self._normalize_mode
395 if not isinstance(mode, list): modes = [mode]
396@@ -222,7 +263,7 @@
397 '''
398 self.transposed = transposed # before the super call because
399 # super calls refresh_norms.
400- super(TfIdfView, self).__init__(tensor, 0) # We only support mode 0.
401+ super(TfIdfView, self).__init__(tensor) # Modes don't really make sense.
402
403 def __repr__(self):
404 return 'TfIdfView(%r, transposed=%r)' % (self.tensor, self.transposed)
405@@ -244,9 +285,6 @@
406 counts_for_document[document] += value
407 num_docs_that_contain_term[term] += 1
408
409- def update_norm(self, indices, prev, current):
410- raise NotImplementedError
411-
412 def tf(self, term, document):
413 if self.transposed:
414 term_count = self.tensor[document, term]
415
416=== modified file 'csc/divisi/svd.py'
417--- csc/divisi/svd.py 2009-10-29 03:17:08 +0000
418+++ csc/divisi/svd.py 2009-11-17 23:59:09 +0000
419@@ -172,10 +172,10 @@
420 '''
421 u = self.weighted_u
422 angles = self.u_dotproducts_with(vec)
423- vec_magnitude = sqrt(vec*vec)
424+ vec_magnitude = vec.norm()
425 # Normalize distances to get the cos(angles)
426 for key, value in angles.iteritems():
427- u_vector_magnitude = sqrt(u[key[0], :]*u[key[0], :])
428+ u_vector_magnitude = self.weighted_u_vec(key[0]).norm()
429 angles[key] = float(value)/(u_vector_magnitude*vec_magnitude)
430
431 return angles
432
433=== modified file 'csc/divisi/tensor.py'
434--- csc/divisi/tensor.py 2009-09-29 15:49:05 +0000
435+++ csc/divisi/tensor.py 2009-11-17 23:59:09 +0000
436@@ -15,7 +15,7 @@
437 import numpy, sys
438 from csc.divisi.dict_mixin import MyDictMixin
439 import copy, random, math
440-from csc.divisi.exceptions import DimensionMismatch
441+from csc.divisi.exceptions import DimensionMismatch, InvalidLayeringException
442 from csc.divisi._svdlib import svd, dictSvd, isvd, dictIsvd
443 from warnings import warn
444 import logging
445@@ -179,6 +179,20 @@
446 """
447 return cls(self, *a, **kw)
448
449+ def stack_contains(self, cls):
450+ '''
451+ Check if the tensor stack below here includes an instance of ``cls``.
452+
453+ You may pass a tuple of classes as well, which will check if
454+ the stack contains _any_ of those classes.
455+ '''
456+ if isinstance(self, cls):
457+ return True
458+ if hasattr(self, 'tensor'):
459+ return self.tensor.stack_contains(cls)
460+ else:
461+ return False
462+
463 def unfolded(self, mode):
464 """
465 Get an :class:`UnfoldedView <divisi.unfolded_view.UnfoldedView>` of
466@@ -228,9 +242,9 @@
467 raise TypeError('Unknown normalization parameter %r' % mode)
468
469
470- def zero_mean_normalized(self, mode=0):
471- from csc.divisi.normalized_view import ZeroMeanView
472- return self.add_layer(ZeroMeanView, mode)
473+ def mean_subtracted(self, mode=0):
474+ from csc.divisi.normalized_view import MeanSubtractedView
475+ return self.add_layer(MeanSubtractedView, mode)
476
477 # Math
478 def __add__(self, other):
479@@ -559,6 +573,27 @@
480 else:
481 return res
482
483+ def means(self):
484+ '''
485+ Computes the by-slice means for each dimension.
486+
487+ Returns numpy arrays, not DenseTensors.
488+ '''
489+ import numpy as np
490+ accumulator_for_mode = [numpy.zeros(n) for n in self.shape]
491+ for k, v in self.iteritems():
492+ for accumulator, key in izip(accumulator_for_mode, k):
493+ accumulator[key] += v
494+
495+ # Divide by the number of items that could have gone into each
496+ # accumulator slot.
497+ total_possible_items = np.product(self.shape)
498+ for mode, accumulator in enumerate(accumulator_for_mode):
499+ possible_items = total_possible_items / self.shape[mode]
500+ accumulator /= possible_items
501+ return accumulator_for_mode
502+
503+
504 def label_histograms(self):
505 '''
506 Counts the number and magnitude of items in each row / column
507@@ -577,9 +612,6 @@
508 map(DenseTensor, magnitudes))
509
510
511-class InvalidLayeringException(StandardError):
512- pass
513-
514 forward_to_tensor = set([
515 'shape', 'ndim', 'has_key', 'default_value', 'density'])
516
517
518=== modified file 'svdlib/_svdlib.c'
519--- svdlib/_svdlib.c 2009-08-05 22:25:54 +0000
520+++ svdlib/_svdlib.c 2009-11-17 23:59:09 +0000
521@@ -1,11 +1,11 @@
522-/* Generated by Cython 0.11.2 on Wed Aug 5 18:22:59 2009 */
523+/* Generated by Cython 0.11.3 on Thu Oct 29 00:14:04 2009 */
524
525 #define PY_SSIZE_T_CLEAN
526 #include "Python.h"
527 #include "structmember.h"
528 #ifndef Py_PYTHON_H
529 #error Python headers needed to compile C extensions, please install development version of Python.
530-#endif
531+#else
532 #ifndef PY_LONG_LONG
533 #define PY_LONG_LONG LONG_LONG
534 #endif
535@@ -133,10 +133,12 @@
536 #include <math.h>
537 #define __PYX_HAVE_API__svdlib___svdlib
538 #include "stdlib.h"
539+#include "stdio.h"
540 #include "numpy/arrayobject.h"
541 #include "svdlib.h"
542 #include "svdwrapper.h"
543 #include "math.h"
544+#include "svdutil.h"
545 #define __PYX_USE_C99_COMPLEX defined(_Complex_I)
546
547
548@@ -167,6 +169,9 @@
549 #define __Pyx_PyBytes_AsString PyBytes_AsString
550 #endif
551
552+#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s)
553+#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) __Pyx_PyBytes_AsString(s))
554+
555 #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
556 static INLINE int __Pyx_PyObject_IsTrue(PyObject*);
557 static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
558@@ -186,6 +191,40 @@
559 #endif
560 #endif
561
562+
563+#if !defined(T_ULONGLONG)
564+#define __Pyx_T_UNSIGNED_INT(x) \
565+ ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
566+ ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
567+ ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
568+ ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1))))
569+#else
570+#define __Pyx_T_UNSIGNED_INT(x) \
571+ ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
572+ ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
573+ ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
574+ ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \
575+ ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
576+#endif
577+#if !defined(T_LONGLONG)
578+#define __Pyx_T_SIGNED_INT(x) \
579+ ((sizeof(x) == sizeof(char)) ? T_BYTE : \
580+ ((sizeof(x) == sizeof(short)) ? T_SHORT : \
581+ ((sizeof(x) == sizeof(int)) ? T_INT : \
582+ ((sizeof(x) == sizeof(long)) ? T_LONG : -1))))
583+#else
584+#define __Pyx_T_SIGNED_INT(x) \
585+ ((sizeof(x) == sizeof(char)) ? T_BYTE : \
586+ ((sizeof(x) == sizeof(short)) ? T_SHORT : \
587+ ((sizeof(x) == sizeof(int)) ? T_INT : \
588+ ((sizeof(x) == sizeof(long)) ? T_LONG : \
589+ ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))))
590+#endif
591+
592+#define __Pyx_T_FLOATING(x) \
593+ ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
594+ ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
595+
596 #if !defined(T_SIZET)
597 #if !defined(T_ULONGLONG)
598 #define T_SIZET \
599@@ -223,6 +262,7 @@
600 static PyObject *__pyx_m;
601 static PyObject *__pyx_b;
602 static PyObject *__pyx_empty_tuple;
603+static PyObject *__pyx_empty_bytes;
604 static int __pyx_lineno;
605 static int __pyx_clineno = 0;
606 static const char * __pyx_cfilenm= __FILE__;
607@@ -268,6 +308,64 @@
608
609 static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/
610
611+static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
612+
613+/* Run-time type information about structs used with buffers */
614+struct __Pyx_StructField_;
615+
616+typedef struct {
617+ const char* name; /* for error messages only */
618+ struct __Pyx_StructField_* fields;
619+ size_t size; /* sizeof(type) */
620+ char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
621+} __Pyx_TypeInfo;
622+
623+typedef struct __Pyx_StructField_ {
624+ __Pyx_TypeInfo* type;
625+ const char* name;
626+ size_t offset;
627+} __Pyx_StructField;
628+
629+typedef struct {
630+ __Pyx_StructField* field;
631+ size_t parent_offset;
632+} __Pyx_BufFmt_StackElem;
633+
634+
635+static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
636+static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
637+
638+static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
639+static void __Pyx_RaiseBufferIndexError(int axis); /*proto*/
640+#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
641+
642+#define __Pyx_SetItemInt(o, i, v, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
643+ __Pyx_SetItemInt_Fast(o, i, v, size <= sizeof(long)) : \
644+ __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
645+
646+static INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
647+ int r;
648+ if (!j) return -1;
649+ r = PyObject_SetItem(o, j, v);
650+ Py_DECREF(j);
651+ return r;
652+}
653+
654+static INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int fits_long) {
655+ if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
656+ Py_INCREF(v);
657+ Py_DECREF(PyList_GET_ITEM(o, i));
658+ PyList_SET_ITEM(o, i, v);
659+ return 1;
660+ }
661+ else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
662+ return PySequence_SetItem(o, i, v);
663+ else {
664+ PyObject *j = fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i);
665+ return __Pyx_SetItemInt_Generic(o, j, v);
666+ }
667+}
668+
669
670 static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
671 PyObject *r;
672@@ -342,36 +440,17 @@
673 return r;
674 }
675
676-static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
677-
678-/* Run-time type information about structs used with buffers */
679-struct __Pyx_StructField_;
680-
681-typedef struct {
682- const char* name; /* for error messages only */
683- struct __Pyx_StructField_* fields;
684- size_t size; /* sizeof(type) */
685- char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
686-} __Pyx_TypeInfo;
687-
688-typedef struct __Pyx_StructField_ {
689- __Pyx_TypeInfo* type;
690- const char* name;
691- size_t offset;
692-} __Pyx_StructField;
693-
694-typedef struct {
695- __Pyx_StructField* field;
696- size_t parent_offset;
697-} __Pyx_BufFmt_StackElem;
698-
699-
700-static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
701-static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
702-#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1)
703-
704 static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
705 static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
706+#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1)
707+
708+static INLINE void __Pyx_RaiseNoneNotIterableError(void);
709+
710+static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
711+
712+static INLINE void __Pyx_RaiseTooManyValuesError(void);
713+
714+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
715 #if PY_MAJOR_VERSION < 3
716 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
717 static void __Pyx_ReleaseBuffer(Py_buffer *view);
718@@ -389,10 +468,6 @@
719
720 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
721
722-static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
723-
724-static INLINE void __Pyx_RaiseTooManyValuesError(void);
725-
726 static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
727 static int __Pyx_EndUnpack(PyObject *); /*proto*/
728
729@@ -618,8 +693,6 @@
730
731 #endif
732
733-static INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
734-
735 static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
736
737 static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
738@@ -684,9 +757,9 @@
739
740 typedef npy_float64 __pyx_t_5numpy_float64_t;
741
742-typedef npy_complex64 __pyx_t_5numpy_complex64_t;
743+typedef __pyx_t_float_complex __pyx_t_5numpy_complex64_t;
744
745-typedef npy_complex128 __pyx_t_5numpy_complex128_t;
746+typedef __pyx_t_double_complex __pyx_t_5numpy_complex128_t;
747
748 typedef npy_long __pyx_t_5numpy_int_t;
749
750@@ -710,35 +783,62 @@
751
752 typedef npy_cdouble __pyx_t_5numpy_complex_t;
753
754-typedef __pyx_t_5numpy_float_t __pyx_t_6svdlib_7_svdlib_DTYPE_t;
755-
756-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":130
757- * ###### Python functions ######
758+typedef __pyx_t_5numpy_float64_t __pyx_t_6svdlib_7_svdlib_DTYPE_t;
759+
760+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
761+ * self.offset_for_col = offset_for_col
762+ *
763+ * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
764+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
765+ * cdef long row, col, index, cols, col_len, rowk
766+ */
767+
768+struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack {
769+ int __pyx_n;
770+ PyObject *row_norms;
771+};
772+
773+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
774+ * return temp
775+ *
776+ * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
777+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
778+ * if row_norms is None:
779+ */
780+
781+struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack {
782+ int __pyx_n;
783+ PyObject *row_norms;
784+};
785+
786+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":74
787+ *
788 *
789 * cdef class CSCMatrix: # <<<<<<<<<<<<<<
790- * __slots__ = ['cmatrix']
791 * cdef object tensor #holds our Python tensor
792+ * cdef object offset_for_row, offset_for_col
793 */
794
795 struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix {
796 PyObject_HEAD
797 struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtab;
798 PyObject *tensor;
799- PyObject *row_factors;
800+ PyObject *offset_for_row;
801+ PyObject *offset_for_col;
802 struct smat *cmatrix;
803- struct svdrec *svdrec;
804 int transposed;
805- int rows;
806- int cols;
807- int nonZero;
808+ long rows;
809+ long cols;
810+ long nonZero;
811 };
812
813
814 struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix {
815- PyObject *(*pack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch);
816- PyObject *(*dictPack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch);
817+ PyObject *(*pack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch, struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack *__pyx_optional_args);
818+ double *(*toVector)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, PyObject *);
819+ PyObject *(*dictPack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch, struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack *__pyx_optional_args);
820 void (*setColumnSize)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int);
821- void (*setValue)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int, float);
822+ void (*setValue)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int, double);
823 PyObject *(*svdA)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int __pyx_skip_dispatch);
824 };
825 static struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtabptr_6svdlib_7_svdlib_CSCMatrix;
826@@ -748,11 +848,15 @@
827
828 /* Module declarations from stdlib */
829
830+/* Module declarations from stdio */
831+
832 /* Module declarations from numpy */
833
834 /* Module declarations from numpy */
835
836 static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
837+static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
838+static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
839 static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
840 static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
841 /* Module declarations from svdlib._svdlib */
842@@ -768,12 +872,8 @@
843 static PyObject *__pyx_int_50;
844 static PyObject *__pyx_int_100;
845 static PyObject *__pyx_int_2;
846-static PyObject *__pyx_int_0;
847-static PyObject *__pyx_int_1;
848 static char __pyx_k___main__[] = "__main__";
849 static PyObject *__pyx_kp___main__;
850-static char __pyx_k___slots__[] = "__slots__";
851-static PyObject *__pyx_kp___slots__;
852 static char __pyx_k___init__[] = "__init__";
853 static PyObject *__pyx_kp___init__;
854 static char __pyx_k_pack[] = "pack";
855@@ -790,8 +890,12 @@
856 static PyObject *__pyx_kp_isvd;
857 static char __pyx_k_pyTensor[] = "pyTensor";
858 static PyObject *__pyx_kp_pyTensor;
859-static char __pyx_k_row_factors[] = "row_factors";
860-static PyObject *__pyx_kp_row_factors;
861+static char __pyx_k_offset_for_row[] = "offset_for_row";
862+static PyObject *__pyx_kp_offset_for_row;
863+static char __pyx_k_offset_for_col[] = "offset_for_col";
864+static PyObject *__pyx_kp_offset_for_col;
865+static char __pyx_k_row_norms[] = "row_norms";
866+static PyObject *__pyx_kp_row_norms;
867 static char __pyx_k_k[] = "k";
868 static PyObject *__pyx_kp_k;
869 static char __pyx_k_niter[] = "niter";
870@@ -800,24 +904,34 @@
871 static PyObject *__pyx_kp_lrate;
872 static char __pyx_k_tensor[] = "tensor";
873 static PyObject *__pyx_kp_tensor;
874+static char __pyx_k_row_factors[] = "row_factors";
875+static PyObject *__pyx_kp_row_factors;
876 static char __pyx_k_warnings[] = "warnings";
877 static PyObject *__pyx_kp_warnings;
878 static char __pyx_k_numpy[] = "numpy";
879 static PyObject *__pyx_kp_numpy;
880 static char __pyx_k_np[] = "np";
881 static PyObject *__pyx_kp_np;
882-static char __pyx_k_float[] = "float";
883-static PyObject *__pyx_kp_float;
884+static char __pyx_k_31[] = "float64";
885+static PyObject *__pyx_kp_31;
886 static char __pyx_k_DTYPE[] = "DTYPE";
887 static PyObject *__pyx_kp_DTYPE;
888-static char __pyx_k_31[] = "cmatrix";
889-static PyObject *__pyx_kp_31;
890 static char __pyx_k_ndim[] = "ndim";
891 static PyObject *__pyx_kp_ndim;
892 static char __pyx_k_ValueError[] = "ValueError";
893 static PyObject *__pyx_kp_ValueError;
894 static char __pyx_k_shape[] = "shape";
895 static PyObject *__pyx_kp_shape;
896+static char __pyx_k_ones[] = "ones";
897+static PyObject *__pyx_kp_ones;
898+static char __pyx_k_reciprocal[] = "reciprocal";
899+static PyObject *__pyx_kp_reciprocal;
900+static char __pyx_k_sqrt[] = "sqrt";
901+static PyObject *__pyx_kp_sqrt;
902+static char __pyx_k_array[] = "array";
903+static PyObject *__pyx_kp_array;
904+static char __pyx_k_dtype[] = "dtype";
905+static PyObject *__pyx_kp_dtype;
906 static char __pyx_k_iteritems[] = "iteritems";
907 static PyObject *__pyx_kp_iteritems;
908 static char __pyx_k_setdefault[] = "setdefault";
909@@ -830,24 +944,20 @@
910 static PyObject *__pyx_kp_sorted;
911 static char __pyx_k_keys[] = "keys";
912 static PyObject *__pyx_kp_keys;
913+static char __pyx_k_range[] = "range";
914+static PyObject *__pyx_kp_range;
915 static char __pyx_k__data[] = "_data";
916 static PyObject *__pyx_kp__data;
917 static char __pyx_k_warn[] = "warn";
918 static PyObject *__pyx_kp_warn;
919-static char __pyx_k_38[] = "csc.divisi.tensor";
920-static PyObject *__pyx_kp_38;
921+static char __pyx_k_39[] = "csc.divisi.tensor";
922+static PyObject *__pyx_kp_39;
923 static char __pyx_k_DenseTensor[] = "DenseTensor";
924 static PyObject *__pyx_kp_DenseTensor;
925 static char __pyx_k_add[] = "add";
926 static PyObject *__pyx_kp_add;
927 static char __pyx_k_zeros[] = "zeros";
928 static PyObject *__pyx_kp_zeros;
929-static char __pyx_k_dtype[] = "dtype";
930-static PyObject *__pyx_kp_dtype;
931-static char __pyx_k_range[] = "range";
932-static PyObject *__pyx_kp_range;
933-static char __pyx_k_sqrt[] = "sqrt";
934-static PyObject *__pyx_kp_sqrt;
935 static char __pyx_k_reduce[] = "reduce";
936 static PyObject *__pyx_kp_reduce;
937 static char __pyx_k_multiply[] = "multiply";
938@@ -860,18 +970,19 @@
939 static PyObject *__pyx_builtin_range;
940 static PyObject *__pyx_kp_34;
941 static char __pyx_k_34[] = "You can only pack a 2 dimensional tensor";
942-static PyObject *__pyx_kp_35;
943-static char __pyx_k_35[] = "<CSCMatrix>";
944+static char __pyx_k_35[] = "toVector";
945 static PyObject *__pyx_kp_36;
946-static char __pyx_k_36[] = "Column %d is empty";
947+static char __pyx_k_36[] = "<CSCMatrix>";
948 static PyObject *__pyx_kp_37;
949-static char __pyx_k_37[] = "Matrix has zero value (row %d, index %d)";
950-static PyObject *__pyx_kp_39;
951+static char __pyx_k_37[] = "Column %d is empty";
952+static PyObject *__pyx_kp_38;
953+static char __pyx_k_38[] = "Matrix has zero value (row %d, index %d)";
954 static PyObject *__pyx_kp_40;
955 static PyObject *__pyx_kp_41;
956-static char __pyx_k_39[] = "COMPUTING INCREMENTAL SVD";
957-static char __pyx_k_40[] = "ROWS: %d, COLUMNS: %d, VALS: %d";
958-static char __pyx_k_41[] = "K: %d, LEARNING_RATE: %r, ITERATIONS: %d";
959+static PyObject *__pyx_kp_42;
960+static char __pyx_k_40[] = "COMPUTING INCREMENTAL SVD";
961+static char __pyx_k_41[] = "ROWS: %d, COLUMNS: %d, VALS: %d";
962+static char __pyx_k_42[] = "K: %d, LEARNING_RATE: %r, ITERATIONS: %d";
963 static PyObject *__pyx_int_15;
964 static char __pyx_k___getbuffer__[] = "__getbuffer__";
965 static PyObject *__pyx_kp___getbuffer__;
966@@ -881,8 +992,6 @@
967 static PyObject *__pyx_kp_info;
968 static char __pyx_k_flags[] = "flags";
969 static PyObject *__pyx_kp_flags;
970-static char __pyx_k_itervalues[] = "itervalues";
971-static PyObject *__pyx_kp_itervalues;
972 static char __pyx_k_RuntimeError[] = "RuntimeError";
973 static PyObject *__pyx_kp_RuntimeError;
974 static PyObject *__pyx_kp_1;
975@@ -925,34 +1034,37 @@
976 static char __pyx_k_29[] = "Format string allocated too short.";
977 static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
978
979-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":139
980- * cdef int rows, cols
981- * cdef int nonZero #number of non zero entries in matrix
982- * def __init__(self, pyTensor, row_factors=None): # <<<<<<<<<<<<<<
983+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":81
984+ * cdef long rows, cols
985+ * cdef long nonZero #number of non zero entries in matrix
986+ * def __init__(self, pyTensor, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
987 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing
988- * #the row _factors to divide by
989+ * #the row_factors to divide by
990 */
991
992 static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
993 static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
994 PyObject *__pyx_v_pyTensor = 0;
995- PyObject *__pyx_v_row_factors = 0;
996+ PyObject *__pyx_v_offset_for_row = 0;
997+ PyObject *__pyx_v_offset_for_col = 0;
998 int __pyx_r;
999 PyObject *__pyx_1 = 0;
1000 PyObject *__pyx_2 = 0;
1001 PyObject *__pyx_t_1 = NULL;
1002 PyObject *__pyx_t_2 = NULL;
1003 int __pyx_t_3;
1004- int __pyx_t_4;
1005- int __pyx_t_5;
1006+ long __pyx_t_4;
1007+ long __pyx_t_5;
1008 Py_ssize_t __pyx_t_6;
1009- static PyObject **__pyx_pyargnames[] = {&__pyx_kp_pyTensor,&__pyx_kp_row_factors,0};
1010+ static PyObject **__pyx_pyargnames[] = {&__pyx_kp_pyTensor,&__pyx_kp_offset_for_row,&__pyx_kp_offset_for_col,0};
1011 __Pyx_SetupRefcountContext("__init__");
1012 if (unlikely(__pyx_kwds)) {
1013 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
1014- PyObject* values[2] = {0,0};
1015+ PyObject* values[3] = {0,0,0};
1016 values[1] = Py_None;
1017+ values[2] = Py_None;
1018 switch (PyTuple_GET_SIZE(__pyx_args)) {
1019+ case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
1020 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
1021 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
1022 case 0: break;
1023@@ -965,19 +1077,27 @@
1024 else goto __pyx_L5_argtuple_error;
1025 case 1:
1026 if (kw_args > 1) {
1027- PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);
1028+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
1029 if (unlikely(value)) { values[1] = value; kw_args--; }
1030 }
1031+ case 2:
1032+ if (kw_args > 1) {
1033+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
1034+ if (unlikely(value)) { values[2] = value; kw_args--; }
1035+ }
1036 }
1037 if (unlikely(kw_args > 0)) {
1038- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1039+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1040 }
1041 __pyx_v_pyTensor = values[0];
1042- __pyx_v_row_factors = values[1];
1043+ __pyx_v_offset_for_row = values[1];
1044+ __pyx_v_offset_for_col = values[2];
1045 } else {
1046- __pyx_v_row_factors = Py_None;
1047+ __pyx_v_offset_for_row = Py_None;
1048+ __pyx_v_offset_for_col = Py_None;
1049 switch (PyTuple_GET_SIZE(__pyx_args)) {
1050- case 2: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 1);
1051+ case 3: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 2);
1052+ case 2: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 1);
1053 case 1: __pyx_v_pyTensor = PyTuple_GET_ITEM(__pyx_args, 0);
1054 break;
1055 default: goto __pyx_L5_argtuple_error;
1056@@ -985,15 +1105,15 @@
1057 }
1058 goto __pyx_L4_argument_unpacking_done;
1059 __pyx_L5_argtuple_error:;
1060- __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1061+ __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
1062 __pyx_L3_error:;
1063 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.__init__");
1064 return -1;
1065 __pyx_L4_argument_unpacking_done:;
1066
1067- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":142
1068+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":84
1069 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing
1070- * #the row _factors to divide by
1071+ * #the row_factors to divide by
1072 * self.tensor = pyTensor # <<<<<<<<<<<<<<
1073 * self.transposed = 0
1074 *
1075@@ -1004,8 +1124,8 @@
1076 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor);
1077 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor = __pyx_v_pyTensor;
1078
1079- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":143
1080- * #the row _factors to divide by
1081+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":85
1082+ * #the row_factors to divide by
1083 * self.tensor = pyTensor
1084 * self.transposed = 0 # <<<<<<<<<<<<<<
1085 *
1086@@ -1013,118 +1133,131 @@
1087 */
1088 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed = 0;
1089
1090- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":145
1091+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":87
1092 * self.transposed = 0
1093 *
1094 * if self.tensor.ndim != 2: # <<<<<<<<<<<<<<
1095 * raise ValueError("You can only pack a 2 dimensional tensor")
1096 * self.rows, self.cols = self.tensor.shape
1097 */
1098- __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor, __pyx_kp_ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1099+ __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor, __pyx_kp_ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1100 __Pyx_GOTREF(__pyx_t_1);
1101- __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_2, Py_NE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1102+ __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_2, Py_NE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1103 __Pyx_GOTREF(__pyx_t_2);
1104 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1105- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1106+ __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1107 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1108 if (__pyx_t_3) {
1109
1110- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":146
1111+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":88
1112 *
1113 * if self.tensor.ndim != 2:
1114 * raise ValueError("You can only pack a 2 dimensional tensor") # <<<<<<<<<<<<<<
1115 * self.rows, self.cols = self.tensor.shape
1116 * self.nonZero = len(self.tensor)
1117 */
1118- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1119+ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1120 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
1121 __Pyx_INCREF(__pyx_kp_34);
1122 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_34);
1123 __Pyx_GIVEREF(__pyx_kp_34);
1124- __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1125+ __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1126 __Pyx_GOTREF(__pyx_t_1);
1127 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1128 __Pyx_Raise(__pyx_t_1, 0, 0);
1129 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1130- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1131+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1132 goto __pyx_L6;
1133 }
1134 __pyx_L6:;
1135
1136- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":147
1137+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":89
1138 * if self.tensor.ndim != 2:
1139 * raise ValueError("You can only pack a 2 dimensional tensor")
1140 * self.rows, self.cols = self.tensor.shape # <<<<<<<<<<<<<<
1141 * self.nonZero = len(self.tensor)
1142 * assert self.nonZero != 0
1143 */
1144- __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor, __pyx_kp_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1145+ __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor, __pyx_kp_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1146 __Pyx_GOTREF(__pyx_t_1);
1147 if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 2)) {
1148 PyObject* tuple = __pyx_t_1;
1149 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);
1150- __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1151+ __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_2); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1152 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1153 __pyx_2 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_2);
1154- __pyx_t_5 = __Pyx_PyInt_AsInt(__pyx_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1155+ __pyx_t_5 = __Pyx_PyInt_AsLong(__pyx_2); if (unlikely((__pyx_t_5 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1156 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1157 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1158 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_4;
1159 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_5;
1160 } else {
1161- __pyx_1 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1162+ __pyx_1 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1163 __Pyx_GOTREF(__pyx_1);
1164 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1165- __pyx_2 = __Pyx_UnpackItem(__pyx_1, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1166- __Pyx_GOTREF(__pyx_2);
1167- __pyx_t_5 = __Pyx_PyInt_AsInt(__pyx_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1168- __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1169- __pyx_2 = __Pyx_UnpackItem(__pyx_1, 1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1170- __Pyx_GOTREF(__pyx_2);
1171- __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1172- __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1173- if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1174+ __pyx_2 = __Pyx_UnpackItem(__pyx_1, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1175+ __Pyx_GOTREF(__pyx_2);
1176+ __pyx_t_5 = __Pyx_PyInt_AsLong(__pyx_2); if (unlikely((__pyx_t_5 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1177+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1178+ __pyx_2 = __Pyx_UnpackItem(__pyx_1, 1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1179+ __Pyx_GOTREF(__pyx_2);
1180+ __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_2); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1181+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1182+ if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1183 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1184 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_5;
1185 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_4;
1186 }
1187
1188- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":148
1189+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":90
1190 * raise ValueError("You can only pack a 2 dimensional tensor")
1191 * self.rows, self.cols = self.tensor.shape
1192 * self.nonZero = len(self.tensor) # <<<<<<<<<<<<<<
1193 * assert self.nonZero != 0
1194 *
1195 */
1196- __pyx_t_6 = PyObject_Length(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1197+ __pyx_t_6 = PyObject_Length(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1198 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero = __pyx_t_6;
1199
1200- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":149
1201+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":91
1202 * self.rows, self.cols = self.tensor.shape
1203 * self.nonZero = len(self.tensor)
1204 * assert self.nonZero != 0 # <<<<<<<<<<<<<<
1205 *
1206- * self.row_factors = row_factors
1207+ * self.offset_for_row = offset_for_row
1208 */
1209 #ifndef PYREX_WITHOUT_ASSERTIONS
1210 if (unlikely(!(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero != 0))) {
1211 PyErr_SetNone(PyExc_AssertionError);
1212- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1213+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1214 }
1215 #endif
1216
1217- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":151
1218+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":93
1219 * assert self.nonZero != 0
1220 *
1221- * self.row_factors = row_factors # <<<<<<<<<<<<<<
1222- *
1223- * cpdef pack(self):
1224- */
1225- __Pyx_INCREF(__pyx_v_row_factors);
1226- __Pyx_GIVEREF(__pyx_v_row_factors);
1227- __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors);
1228- __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors);
1229- ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors = __pyx_v_row_factors;
1230+ * self.offset_for_row = offset_for_row # <<<<<<<<<<<<<<
1231+ * self.offset_for_col = offset_for_col
1232+ *
1233+ */
1234+ __Pyx_INCREF(__pyx_v_offset_for_row);
1235+ __Pyx_GIVEREF(__pyx_v_offset_for_row);
1236+ __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row);
1237+ __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row);
1238+ ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row = __pyx_v_offset_for_row;
1239+
1240+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":94
1241+ *
1242+ * self.offset_for_row = offset_for_row
1243+ * self.offset_for_col = offset_for_col # <<<<<<<<<<<<<<
1244+ *
1245+ * cpdef pack(self, row_norms=None):
1246+ */
1247+ __Pyx_INCREF(__pyx_v_offset_for_col);
1248+ __Pyx_GIVEREF(__pyx_v_offset_for_col);
1249+ __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col);
1250+ __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col);
1251+ ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col = __pyx_v_offset_for_col;
1252
1253 __pyx_r = 0;
1254 goto __pyx_L0;
1255@@ -1140,82 +1273,236 @@
1256 return __pyx_r;
1257 }
1258
1259-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":153
1260- * self.row_factors = row_factors
1261+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
1262+ * self.offset_for_col = offset_for_col
1263 *
1264- * cpdef pack(self): # <<<<<<<<<<<<<<
1265- * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1266- * self.transposed = 0
1267+ * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
1268+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
1269+ * cdef long row, col, index, cols, col_len, rowk
1270 */
1271
1272-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
1273-static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_pack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch) {
1274+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
1275+static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_pack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack *__pyx_optional_args) {
1276+ PyObject *__pyx_v_row_norms = Py_None;
1277+ PyArrayObject *__pyx_v_row_factors;
1278+ long __pyx_v_row;
1279+ long __pyx_v_col;
1280+ long __pyx_v_index;
1281+ long __pyx_v_cols;
1282+ long __pyx_v_col_len;
1283+ long __pyx_v_rowk;
1284+ double __pyx_v_value;
1285 PyObject *__pyx_v_columnDict;
1286- PyObject *__pyx_v_cols;
1287- PyObject *__pyx_v_row;
1288- PyObject *__pyx_v_column;
1289- PyObject *__pyx_v_value;
1290- PyObject *__pyx_v_index;
1291- PyObject *__pyx_v_colnum;
1292- PyObject *__pyx_v_col_len;
1293- PyObject *__pyx_v_rowk;
1294+ Py_buffer __pyx_bstruct_row_factors;
1295+ Py_ssize_t __pyx_bstride_0_row_factors = 0;
1296+ Py_ssize_t __pyx_bshape_0_row_factors = 0;
1297 PyObject *__pyx_r = NULL;
1298 PyObject *__pyx_1 = 0;
1299 PyObject *__pyx_2 = 0;
1300 PyObject *__pyx_3 = 0;
1301 PyObject *__pyx_4 = 0;
1302- PyObject *__pyx_5 = 0;
1303- PyObject *__pyx_6 = 0;
1304 PyObject *__pyx_t_1 = NULL;
1305- Py_ssize_t __pyx_t_2;
1306- PyObject *__pyx_t_3 = NULL;
1307- int __pyx_t_4;
1308- double __pyx_t_5;
1309- PyObject *__pyx_t_6 = NULL;
1310+ PyObject *__pyx_t_2 = NULL;
1311+ int __pyx_t_3;
1312+ PyObject *__pyx_t_4 = NULL;
1313+ PyArrayObject *__pyx_t_5 = NULL;
1314+ int __pyx_t_6;
1315 PyObject *__pyx_t_7 = NULL;
1316- Py_ssize_t __pyx_t_8;
1317- int __pyx_t_9;
1318- int __pyx_t_10;
1319- float __pyx_t_11;
1320+ PyObject *__pyx_t_8 = NULL;
1321+ PyObject *__pyx_t_9 = NULL;
1322+ PyObject *__pyx_t_10 = NULL;
1323+ PyObject *__pyx_t_11 = NULL;
1324+ Py_ssize_t __pyx_t_12;
1325+ double __pyx_t_13;
1326+ long __pyx_t_14;
1327+ long __pyx_t_15;
1328+ long __pyx_t_16;
1329 __Pyx_SetupRefcountContext("pack");
1330+ if (__pyx_optional_args) {
1331+ if (__pyx_optional_args->__pyx_n > 0) {
1332+ __pyx_v_row_norms = __pyx_optional_args->row_norms;
1333+ }
1334+ }
1335+ __pyx_v_row_factors = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None);
1336 __pyx_v_columnDict = Py_None; __Pyx_INCREF(Py_None);
1337- __pyx_v_cols = Py_None; __Pyx_INCREF(Py_None);
1338- __pyx_v_row = Py_None; __Pyx_INCREF(Py_None);
1339- __pyx_v_column = Py_None; __Pyx_INCREF(Py_None);
1340- __pyx_v_value = Py_None; __Pyx_INCREF(Py_None);
1341- __pyx_v_index = Py_None; __Pyx_INCREF(Py_None);
1342- __pyx_v_colnum = Py_None; __Pyx_INCREF(Py_None);
1343- __pyx_v_col_len = Py_None; __Pyx_INCREF(Py_None);
1344- __pyx_v_rowk = Py_None; __Pyx_INCREF(Py_None);
1345+ __pyx_bstruct_row_factors.buf = NULL;
1346 /* Check if called by wrapper */
1347 if (unlikely(__pyx_skip_dispatch)) ;
1348 /* Check if overriden in Python */
1349 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
1350- __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_pack); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1351+ __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_pack); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1352 __Pyx_GOTREF(__pyx_1);
1353 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack)) {
1354 __Pyx_XDECREF(__pyx_r);
1355- __pyx_t_1 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1356- __Pyx_GOTREF(__pyx_t_1);
1357+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1358+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
1359+ __Pyx_INCREF(__pyx_v_row_norms);
1360+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_norms);
1361+ __Pyx_GIVEREF(__pyx_v_row_norms);
1362+ __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1363+ __Pyx_GOTREF(__pyx_t_2);
1364 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1365- __pyx_r = __pyx_t_1;
1366- __pyx_t_1 = 0;
1367+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
1368+ __pyx_r = __pyx_t_2;
1369+ __pyx_t_2 = 0;
1370 goto __pyx_L0;
1371 }
1372 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1373 }
1374
1375- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":154
1376- *
1377- * cpdef pack(self):
1378+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":100
1379+ * cdef long row, col, index, cols, col_len, rowk
1380+ * cdef double value
1381+ * if row_norms is None: # <<<<<<<<<<<<<<
1382+ * row_factors = np.ones(self.rows)
1383+ * else:
1384+ */
1385+ __pyx_t_3 = (__pyx_v_row_norms == Py_None);
1386+ if (__pyx_t_3) {
1387+
1388+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":101
1389+ * cdef double value
1390+ * if row_norms is None:
1391+ * row_factors = np.ones(self.rows) # <<<<<<<<<<<<<<
1392+ * else:
1393+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
1394+ */
1395+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1396+ __Pyx_GOTREF(__pyx_1);
1397+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_ones); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1398+ __Pyx_GOTREF(__pyx_t_2);
1399+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1400+ __pyx_t_1 = PyInt_FromLong(__pyx_v_self->rows); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1401+ __Pyx_GOTREF(__pyx_t_1);
1402+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1403+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
1404+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
1405+ __Pyx_GIVEREF(__pyx_t_1);
1406+ __pyx_t_1 = 0;
1407+ __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1408+ __Pyx_GOTREF(__pyx_t_1);
1409+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1410+ __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
1411+ if (!(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1412+ __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
1413+ {
1414+ __Pyx_BufFmt_StackElem __pyx_stack[1];
1415+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1416+ __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
1417+ if (unlikely(__pyx_t_6 < 0)) {
1418+ PyErr_Fetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
1419+ if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_v_row_factors, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
1420+ Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);
1421+ __Pyx_RaiseBufferFallbackError();
1422+ } else {
1423+ PyErr_Restore(__pyx_t_7, __pyx_t_8, __pyx_t_9);
1424+ }
1425+ }
1426+ __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
1427+ __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
1428+ if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1429+ }
1430+ __pyx_t_5 = 0;
1431+ __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
1432+ __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_1);
1433+ __pyx_t_1 = 0;
1434+ goto __pyx_L3;
1435+ }
1436+ /*else*/ {
1437+
1438+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":103
1439+ * row_factors = np.ones(self.rows)
1440+ * else:
1441+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE))) # <<<<<<<<<<<<<<
1442+ *
1443+ * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1444+ */
1445+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1446+ __Pyx_GOTREF(__pyx_1);
1447+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_reciprocal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1448+ __Pyx_GOTREF(__pyx_t_1);
1449+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1450+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1451+ __Pyx_GOTREF(__pyx_1);
1452+ __pyx_t_4 = PyObject_GetAttr(__pyx_1, __pyx_kp_sqrt); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1453+ __Pyx_GOTREF(__pyx_t_4);
1454+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1455+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1456+ __Pyx_GOTREF(__pyx_1);
1457+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1458+ __Pyx_GOTREF(__pyx_t_2);
1459+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1460+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1461+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
1462+ __Pyx_INCREF(__pyx_v_row_norms);
1463+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_row_norms);
1464+ __Pyx_GIVEREF(__pyx_v_row_norms);
1465+ __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1466+ __Pyx_GOTREF(((PyObject *)__pyx_1));
1467+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1468+ __Pyx_GOTREF(__pyx_2);
1469+ if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1470+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1471+ __pyx_t_11 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_10), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1472+ __Pyx_GOTREF(__pyx_t_11);
1473+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1474+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
1475+ __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
1476+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1477+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
1478+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
1479+ __Pyx_GIVEREF(__pyx_t_11);
1480+ __pyx_t_11 = 0;
1481+ __pyx_t_11 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1482+ __Pyx_GOTREF(__pyx_t_11);
1483+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1484+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
1485+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1486+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
1487+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
1488+ __Pyx_GIVEREF(__pyx_t_11);
1489+ __pyx_t_11 = 0;
1490+ __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1491+ __Pyx_GOTREF(__pyx_t_11);
1492+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1493+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
1494+ if (!(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1495+ __pyx_t_5 = ((PyArrayObject *)__pyx_t_11);
1496+ {
1497+ __Pyx_BufFmt_StackElem __pyx_stack[1];
1498+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1499+ __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
1500+ if (unlikely(__pyx_t_6 < 0)) {
1501+ PyErr_Fetch(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);
1502+ if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_v_row_factors, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
1503+ Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);
1504+ __Pyx_RaiseBufferFallbackError();
1505+ } else {
1506+ PyErr_Restore(__pyx_t_9, __pyx_t_8, __pyx_t_7);
1507+ }
1508+ }
1509+ __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
1510+ __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
1511+ if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1512+ }
1513+ __pyx_t_5 = 0;
1514+ __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
1515+ __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_11);
1516+ __pyx_t_11 = 0;
1517+ }
1518+ __pyx_L3:;
1519+
1520+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":105
1521+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
1522+ *
1523 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero) # <<<<<<<<<<<<<<
1524 * self.transposed = 0
1525 * columnDict = {}
1526 */
1527 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->rows, __pyx_v_self->cols, __pyx_v_self->nonZero);
1528
1529- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":155
1530- * cpdef pack(self):
1531+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":106
1532+ *
1533 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1534 * self.transposed = 0 # <<<<<<<<<<<<<<
1535 * columnDict = {}
1536@@ -1223,439 +1510,391 @@
1537 */
1538 __pyx_v_self->transposed = 0;
1539
1540- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":156
1541+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":107
1542 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1543 * self.transposed = 0
1544 * columnDict = {} # <<<<<<<<<<<<<<
1545 * cols = self.cols
1546- * for (row, column), value in self.tensor.iteritems():
1547+ * for (row, col), value in self.tensor.iteritems():
1548 */
1549- __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1550- __Pyx_GOTREF(((PyObject *)__pyx_1));
1551+ __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1552+ __Pyx_GOTREF(((PyObject *)__pyx_2));
1553 __Pyx_DECREF(__pyx_v_columnDict);
1554- __pyx_v_columnDict = ((PyObject *)__pyx_1);
1555- __pyx_1 = 0;
1556+ __pyx_v_columnDict = ((PyObject *)__pyx_2);
1557+ __pyx_2 = 0;
1558
1559- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":157
1560+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":108
1561 * self.transposed = 0
1562 * columnDict = {}
1563 * cols = self.cols # <<<<<<<<<<<<<<
1564- * for (row, column), value in self.tensor.iteritems():
1565- * if self.row_factors is not None:
1566+ * for (row, col), value in self.tensor.iteritems():
1567+ * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1568 */
1569- __pyx_t_1 = PyInt_FromLong(__pyx_v_self->cols); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1570- __Pyx_GOTREF(__pyx_t_1);
1571- __Pyx_DECREF(__pyx_v_cols);
1572- __pyx_v_cols = __pyx_t_1;
1573- __pyx_t_1 = 0;
1574+ __pyx_v_cols = __pyx_v_self->cols;
1575
1576- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":158
1577+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":109
1578 * columnDict = {}
1579 * cols = self.cols
1580- * for (row, column), value in self.tensor.iteritems(): # <<<<<<<<<<<<<<
1581- * if self.row_factors is not None:
1582- * value /= sqrt(self.row_factors[row])
1583+ * for (row, col), value in self.tensor.iteritems(): # <<<<<<<<<<<<<<
1584+ * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1585+ * assert len(columnDict) <= cols
1586 */
1587- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp_iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1588- __Pyx_GOTREF(__pyx_t_1);
1589- __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1590- __Pyx_GOTREF(__pyx_t_3);
1591- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1592- if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
1593- __pyx_t_2 = 0; __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1);
1594+ __pyx_t_11 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp_iteritems); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1595+ __Pyx_GOTREF(__pyx_t_11);
1596+ __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1597+ __Pyx_GOTREF(__pyx_t_10);
1598+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1599+ if (PyList_CheckExact(__pyx_t_10) || PyTuple_CheckExact(__pyx_t_10)) {
1600+ __pyx_t_12 = 0; __pyx_t_11 = __pyx_t_10; __Pyx_INCREF(__pyx_t_11);
1601 } else {
1602- __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1603- __Pyx_GOTREF(__pyx_t_1);
1604+ __pyx_t_12 = -1; __pyx_t_11 = PyObject_GetIter(__pyx_t_10); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1605+ __Pyx_GOTREF(__pyx_t_11);
1606 }
1607- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1608+ __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1609 for (;;) {
1610- if (likely(PyList_CheckExact(__pyx_t_1))) {
1611- if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
1612- __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
1613- } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
1614- if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
1615- __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
1616+ if (likely(PyList_CheckExact(__pyx_t_11))) {
1617+ if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_11)) break;
1618+ __pyx_t_10 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_12); __Pyx_INCREF(__pyx_t_10); __pyx_t_12++;
1619+ } else if (likely(PyTuple_CheckExact(__pyx_t_11))) {
1620+ if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_11)) break;
1621+ __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_11, __pyx_t_12); __Pyx_INCREF(__pyx_t_10); __pyx_t_12++;
1622 } else {
1623- __pyx_t_3 = PyIter_Next(__pyx_t_1);
1624- if (!__pyx_t_3) {
1625- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1626+ __pyx_t_10 = PyIter_Next(__pyx_t_11);
1627+ if (!__pyx_t_10) {
1628+ if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1629 break;
1630 }
1631- __Pyx_GOTREF(__pyx_t_3);
1632+ __Pyx_GOTREF(__pyx_t_10);
1633 }
1634- if (PyTuple_CheckExact(__pyx_t_3) && likely(PyTuple_GET_SIZE(__pyx_t_3) == 2)) {
1635- PyObject* tuple = __pyx_t_3;
1636+ if (PyTuple_CheckExact(__pyx_t_10) && likely(PyTuple_GET_SIZE(__pyx_t_10) == 2)) {
1637+ PyObject* tuple = __pyx_t_10;
1638 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);
1639 __pyx_3 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_3);
1640- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1641+ __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1642+ __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1643+ __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1644 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {
1645 PyObject* tuple = __pyx_2;
1646- __pyx_5 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_5);
1647- __pyx_6 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_6);
1648+ __pyx_4 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_4);
1649+ __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1650+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1651+ __pyx_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_4);
1652+ __pyx_t_15 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_15 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1653+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1654 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1655- __Pyx_DECREF(__pyx_v_row);
1656- __pyx_v_row = __pyx_5;
1657- __pyx_5 = 0;
1658- __Pyx_DECREF(__pyx_v_column);
1659- __pyx_v_column = __pyx_6;
1660- __pyx_6 = 0;
1661+ __pyx_v_row = __pyx_t_14;
1662+ __pyx_v_col = __pyx_t_15;
1663 } else {
1664- __pyx_4 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1665- __Pyx_GOTREF(__pyx_4);
1666+ __pyx_3 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1667+ __Pyx_GOTREF(__pyx_3);
1668 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1669- __pyx_5 = __Pyx_UnpackItem(__pyx_4, 0); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1670- __Pyx_GOTREF(__pyx_5);
1671- __pyx_6 = __Pyx_UnpackItem(__pyx_4, 1); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1672- __Pyx_GOTREF(__pyx_6);
1673- if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1674- __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1675- __Pyx_DECREF(__pyx_v_row);
1676- __pyx_v_row = __pyx_5;
1677- __pyx_5 = 0;
1678- __Pyx_DECREF(__pyx_v_column);
1679- __pyx_v_column = __pyx_6;
1680- __pyx_6 = 0;
1681+ __pyx_4 = __Pyx_UnpackItem(__pyx_3, 0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1682+ __Pyx_GOTREF(__pyx_4);
1683+ __pyx_t_15 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_15 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1684+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1685+ __pyx_4 = __Pyx_UnpackItem(__pyx_3, 1); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1686+ __Pyx_GOTREF(__pyx_4);
1687+ __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1688+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1689+ if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1690+ __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1691+ __pyx_v_row = __pyx_t_15;
1692+ __pyx_v_col = __pyx_t_14;
1693 }
1694- __Pyx_DECREF(__pyx_v_value);
1695- __pyx_v_value = __pyx_3;
1696- __pyx_3 = 0;
1697+ __pyx_v_value = __pyx_t_13;
1698 } else {
1699- __pyx_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1700+ __pyx_1 = PyObject_GetIter(__pyx_t_10); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1701 __Pyx_GOTREF(__pyx_1);
1702- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1703- __pyx_2 = __Pyx_UnpackItem(__pyx_1, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1704+ __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1705+ __pyx_2 = __Pyx_UnpackItem(__pyx_1, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1706 __Pyx_GOTREF(__pyx_2);
1707- __pyx_3 = __Pyx_UnpackItem(__pyx_1, 1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1708+ __pyx_3 = __Pyx_UnpackItem(__pyx_1, 1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1709 __Pyx_GOTREF(__pyx_3);
1710- if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1711+ __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1712+ __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1713+ if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1714 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1715 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {
1716 PyObject* tuple = __pyx_2;
1717- __pyx_5 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_5);
1718- __pyx_6 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_6);
1719+ __pyx_4 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_4);
1720+ __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1721+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1722+ __pyx_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_4);
1723+ __pyx_t_15 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_15 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1724+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1725 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1726- __Pyx_DECREF(__pyx_v_row);
1727- __pyx_v_row = __pyx_5;
1728- __pyx_5 = 0;
1729- __Pyx_DECREF(__pyx_v_column);
1730- __pyx_v_column = __pyx_6;
1731- __pyx_6 = 0;
1732+ __pyx_v_row = __pyx_t_14;
1733+ __pyx_v_col = __pyx_t_15;
1734 } else {
1735- __pyx_4 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1736- __Pyx_GOTREF(__pyx_4);
1737+ __pyx_3 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1738+ __Pyx_GOTREF(__pyx_3);
1739 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1740- __pyx_5 = __Pyx_UnpackItem(__pyx_4, 0); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1741- __Pyx_GOTREF(__pyx_5);
1742- __pyx_6 = __Pyx_UnpackItem(__pyx_4, 1); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1743- __Pyx_GOTREF(__pyx_6);
1744- if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1745- __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1746- __Pyx_DECREF(__pyx_v_row);
1747- __pyx_v_row = __pyx_5;
1748- __pyx_5 = 0;
1749- __Pyx_DECREF(__pyx_v_column);
1750- __pyx_v_column = __pyx_6;
1751- __pyx_6 = 0;
1752+ __pyx_4 = __Pyx_UnpackItem(__pyx_3, 0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1753+ __Pyx_GOTREF(__pyx_4);
1754+ __pyx_t_15 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_15 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1755+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1756+ __pyx_4 = __Pyx_UnpackItem(__pyx_3, 1); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1757+ __Pyx_GOTREF(__pyx_4);
1758+ __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_4); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1759+ __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1760+ if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1761+ __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1762+ __pyx_v_row = __pyx_t_15;
1763+ __pyx_v_col = __pyx_t_14;
1764 }
1765- __Pyx_DECREF(__pyx_v_value);
1766- __pyx_v_value = __pyx_3;
1767- __pyx_3 = 0;
1768+ __pyx_v_value = __pyx_t_13;
1769 }
1770
1771- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":159
1772+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":110
1773 * cols = self.cols
1774- * for (row, column), value in self.tensor.iteritems():
1775- * if self.row_factors is not None: # <<<<<<<<<<<<<<
1776- * value /= sqrt(self.row_factors[row])
1777- * columnDict.setdefault(column, {})[row] = value
1778- */
1779- __pyx_t_4 = (__pyx_v_self->row_factors != Py_None);
1780- if (__pyx_t_4) {
1781-
1782- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":160
1783- * for (row, column), value in self.tensor.iteritems():
1784- * if self.row_factors is not None:
1785- * value /= sqrt(self.row_factors[row]) # <<<<<<<<<<<<<<
1786- * columnDict.setdefault(column, {})[row] = value
1787- * assert len(columnDict) <= cols
1788- */
1789- __pyx_5 = PyObject_GetItem(__pyx_v_self->row_factors, __pyx_v_row); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1790- __Pyx_GOTREF(__pyx_5);
1791- __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_5); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1792- __Pyx_DECREF(__pyx_5); __pyx_5 = 0;
1793- __pyx_t_3 = PyFloat_FromDouble(sqrt(__pyx_t_5)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1794- __Pyx_GOTREF(__pyx_t_3);
1795- __pyx_4 = PyNumber_InPlaceDivide(__pyx_v_value, __pyx_t_3); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1796- __Pyx_GOTREF(__pyx_4);
1797- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1798- __Pyx_DECREF(__pyx_v_value);
1799- __pyx_v_value = __pyx_4;
1800- __pyx_4 = 0;
1801- goto __pyx_L5;
1802- }
1803- __pyx_L5:;
1804-
1805- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":161
1806- * if self.row_factors is not None:
1807- * value /= sqrt(self.row_factors[row])
1808- * columnDict.setdefault(column, {})[row] = value # <<<<<<<<<<<<<<
1809+ * for (row, col), value in self.tensor.iteritems():
1810+ * columnDict.setdefault(col, {})[row] = value * row_factors[row] # <<<<<<<<<<<<<<
1811 * assert len(columnDict) <= cols
1812 * index = 0
1813 */
1814- __pyx_t_3 = PyObject_GetAttr(__pyx_v_columnDict, __pyx_kp_setdefault); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1815- __Pyx_GOTREF(__pyx_t_3);
1816- __pyx_6 = PyDict_New(); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1817- __Pyx_GOTREF(((PyObject *)__pyx_6));
1818- __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1819- __Pyx_GOTREF(((PyObject *)__pyx_t_6));
1820- __Pyx_INCREF(__pyx_v_column);
1821- PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_column);
1822- __Pyx_GIVEREF(__pyx_v_column);
1823- PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_6));
1824- __Pyx_GIVEREF(((PyObject *)__pyx_6));
1825- __pyx_6 = 0;
1826- __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1827- __Pyx_GOTREF(__pyx_t_7);
1828- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1829- __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
1830- if (PyObject_SetItem(__pyx_t_7, __pyx_v_row, __pyx_v_value) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1831- __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
1832+ __pyx_t_14 = __pyx_v_row;
1833+ __pyx_t_6 = -1;
1834+ if (__pyx_t_14 < 0) {
1835+ __pyx_t_14 += __pyx_bshape_0_row_factors;
1836+ if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 0;
1837+ } else if (unlikely(__pyx_t_14 >= __pyx_bshape_0_row_factors)) __pyx_t_6 = 0;
1838+ if (unlikely(__pyx_t_6 != -1)) {
1839+ __Pyx_RaiseBufferIndexError(__pyx_t_6);
1840+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1841+ }
1842+ __pyx_t_10 = PyFloat_FromDouble((__pyx_v_value * (*__Pyx_BufPtrStrided1d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_row_factors.buf, __pyx_t_14, __pyx_bstride_0_row_factors)))); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1843+ __Pyx_GOTREF(__pyx_t_10);
1844+ __pyx_t_1 = PyObject_GetAttr(__pyx_v_columnDict, __pyx_kp_setdefault); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1845+ __Pyx_GOTREF(__pyx_t_1);
1846+ __pyx_t_4 = PyInt_FromLong(__pyx_v_col); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1847+ __Pyx_GOTREF(__pyx_t_4);
1848+ __pyx_4 = PyDict_New(); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1849+ __Pyx_GOTREF(((PyObject *)__pyx_4));
1850+ __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1851+ __Pyx_GOTREF(((PyObject *)__pyx_t_2));
1852+ PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
1853+ __Pyx_GIVEREF(__pyx_t_4);
1854+ PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_4));
1855+ __Pyx_GIVEREF(((PyObject *)__pyx_4));
1856+ __pyx_t_4 = 0;
1857+ __pyx_4 = 0;
1858+ __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1859+ __Pyx_GOTREF(__pyx_t_4);
1860+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1861+ __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1862+ if (__Pyx_SetItemInt(__pyx_t_4, __pyx_v_row, __pyx_t_10, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1863+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1864+ __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1865 }
1866- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1867+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1868
1869- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":162
1870- * value /= sqrt(self.row_factors[row])
1871- * columnDict.setdefault(column, {})[row] = value
1872+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":111
1873+ * for (row, col), value in self.tensor.iteritems():
1874+ * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1875 * assert len(columnDict) <= cols # <<<<<<<<<<<<<<
1876 * index = 0
1877- * for colnum in xrange(cols):
1878+ * for col in xrange(cols):
1879 */
1880 #ifndef PYREX_WITHOUT_ASSERTIONS
1881- __pyx_t_2 = PyObject_Length(__pyx_v_columnDict); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1882- __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1883- __Pyx_GOTREF(__pyx_t_1);
1884- __pyx_t_7 = PyObject_RichCompare(__pyx_t_1, __pyx_v_cols, Py_LE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1885- __Pyx_GOTREF(__pyx_t_7);
1886- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1887- __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1888- __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
1889- if (unlikely(!__pyx_t_4)) {
1890+ __pyx_t_12 = PyObject_Length(__pyx_v_columnDict); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1891+ if (unlikely(!(__pyx_t_12 <= __pyx_v_cols))) {
1892 PyErr_SetNone(PyExc_AssertionError);
1893- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1894+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1895 }
1896 #endif
1897
1898- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":163
1899- * columnDict.setdefault(column, {})[row] = value
1900+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":112
1901+ * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1902 * assert len(columnDict) <= cols
1903 * index = 0 # <<<<<<<<<<<<<<
1904- * for colnum in xrange(cols):
1905- * col_len = len(columnDict.get(colnum, []))
1906+ * for col in xrange(cols):
1907+ * col_len = len(columnDict.get(col, []))
1908 */
1909- __Pyx_INCREF(__pyx_int_0);
1910- __Pyx_DECREF(__pyx_v_index);
1911- __pyx_v_index = __pyx_int_0;
1912+ __pyx_v_index = 0;
1913
1914- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":164
1915+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":113
1916 * assert len(columnDict) <= cols
1917 * index = 0
1918- * for colnum in xrange(cols): # <<<<<<<<<<<<<<
1919- * col_len = len(columnDict.get(colnum, []))
1920- * self.setColumnSize(colnum, col_len)
1921+ * for col in xrange(cols): # <<<<<<<<<<<<<<
1922+ * col_len = len(columnDict.get(col, []))
1923+ * self.setColumnSize(col, col_len)
1924 */
1925- __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1926- __Pyx_GOTREF(((PyObject *)__pyx_t_7));
1927- __Pyx_INCREF(__pyx_v_cols);
1928- PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_cols);
1929- __Pyx_GIVEREF(__pyx_v_cols);
1930- __pyx_t_1 = PyObject_Call(__pyx_builtin_xrange, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1931- __Pyx_GOTREF(__pyx_t_1);
1932- __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
1933- if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
1934- __pyx_t_2 = 0; __pyx_t_7 = __pyx_t_1; __Pyx_INCREF(__pyx_t_7);
1935- } else {
1936- __pyx_t_2 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1937- __Pyx_GOTREF(__pyx_t_7);
1938- }
1939- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1940- for (;;) {
1941- if (likely(PyList_CheckExact(__pyx_t_7))) {
1942- if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_7)) break;
1943- __pyx_t_1 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
1944- } else if (likely(PyTuple_CheckExact(__pyx_t_7))) {
1945- if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
1946- __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
1947- } else {
1948- __pyx_t_1 = PyIter_Next(__pyx_t_7);
1949- if (!__pyx_t_1) {
1950- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1951- break;
1952- }
1953- __Pyx_GOTREF(__pyx_t_1);
1954- }
1955- __Pyx_DECREF(__pyx_v_colnum);
1956- __pyx_v_colnum = __pyx_t_1;
1957- __pyx_t_1 = 0;
1958+ for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_v_cols; __pyx_t_15+=1) {
1959+ __pyx_v_col = __pyx_t_15;
1960
1961- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":165
1962+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":114
1963 * index = 0
1964- * for colnum in xrange(cols):
1965- * col_len = len(columnDict.get(colnum, [])) # <<<<<<<<<<<<<<
1966- * self.setColumnSize(colnum, col_len)
1967- * if col_len == 0: continue
1968- */
1969- __pyx_t_1 = PyObject_GetAttr(__pyx_v_columnDict, __pyx_kp_get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1970- __Pyx_GOTREF(__pyx_t_1);
1971- __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1972- __Pyx_GOTREF(((PyObject *)__pyx_t_6));
1973- __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1974- __Pyx_GOTREF(((PyObject *)__pyx_t_3));
1975- __Pyx_INCREF(__pyx_v_colnum);
1976- PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_colnum);
1977- __Pyx_GIVEREF(__pyx_v_colnum);
1978- PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_t_6));
1979- __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
1980- __pyx_t_6 = 0;
1981- __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1982- __Pyx_GOTREF(__pyx_t_6);
1983- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1984- __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
1985- __pyx_t_8 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1986- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
1987- __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1988- __Pyx_GOTREF(__pyx_t_6);
1989- __Pyx_DECREF(__pyx_v_col_len);
1990- __pyx_v_col_len = __pyx_t_6;
1991- __pyx_t_6 = 0;
1992-
1993- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":166
1994- * for colnum in xrange(cols):
1995- * col_len = len(columnDict.get(colnum, []))
1996- * self.setColumnSize(colnum, col_len) # <<<<<<<<<<<<<<
1997- * if col_len == 0: continue
1998- * for rowk in sorted(columnDict[colnum].keys()):
1999- */
2000- __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_colnum); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2001- __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_col_len); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2002- ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_t_9, __pyx_t_10);
2003-
2004- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":167
2005- * col_len = len(columnDict.get(colnum, []))
2006- * self.setColumnSize(colnum, col_len)
2007+ * for col in xrange(cols):
2008+ * col_len = len(columnDict.get(col, [])) # <<<<<<<<<<<<<<
2009+ * self.setColumnSize(col, col_len)
2010+ * if col_len == 0: continue
2011+ */
2012+ __pyx_t_11 = PyObject_GetAttr(__pyx_v_columnDict, __pyx_kp_get); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2013+ __Pyx_GOTREF(__pyx_t_11);
2014+ __pyx_t_10 = PyInt_FromLong(__pyx_v_col); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2015+ __Pyx_GOTREF(__pyx_t_10);
2016+ __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2017+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2018+ __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2019+ __Pyx_GOTREF(((PyObject *)__pyx_t_2));
2020+ PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
2021+ __Pyx_GIVEREF(__pyx_t_10);
2022+ PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_4));
2023+ __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
2024+ __pyx_t_10 = 0;
2025+ __pyx_t_4 = 0;
2026+ __pyx_t_4 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2027+ __Pyx_GOTREF(__pyx_t_4);
2028+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
2029+ __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
2030+ __pyx_t_12 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2031+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2032+ __pyx_v_col_len = __pyx_t_12;
2033+
2034+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":115
2035+ * for col in xrange(cols):
2036+ * col_len = len(columnDict.get(col, []))
2037+ * self.setColumnSize(col, col_len) # <<<<<<<<<<<<<<
2038+ * if col_len == 0: continue
2039+ * for rowk in sorted(columnDict[col].keys()):
2040+ */
2041+ ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_v_col, __pyx_v_col_len);
2042+
2043+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":116
2044+ * col_len = len(columnDict.get(col, []))
2045+ * self.setColumnSize(col, col_len)
2046 * if col_len == 0: continue # <<<<<<<<<<<<<<
2047- * for rowk in sorted(columnDict[colnum].keys()):
2048- * self.setValue(index, rowk,
2049+ * for rowk in sorted(columnDict[col].keys()):
2050+ * self.setValue(index, rowk, columnDict[col][rowk])
2051 */
2052- __pyx_t_6 = PyObject_RichCompare(__pyx_v_col_len, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2053- __Pyx_GOTREF(__pyx_t_6);
2054- __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2055- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
2056- if (__pyx_t_4) {
2057+ __pyx_t_3 = (__pyx_v_col_len == 0);
2058+ if (__pyx_t_3) {
2059 goto __pyx_L6_continue;
2060 goto __pyx_L8;
2061 }
2062 __pyx_L8:;
2063
2064- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":168
2065- * self.setColumnSize(colnum, col_len)
2066+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":117
2067+ * self.setColumnSize(col, col_len)
2068 * if col_len == 0: continue
2069- * for rowk in sorted(columnDict[colnum].keys()): # <<<<<<<<<<<<<<
2070- * self.setValue(index, rowk,
2071- * float(columnDict[colnum][rowk]))
2072+ * for rowk in sorted(columnDict[col].keys()): # <<<<<<<<<<<<<<
2073+ * self.setValue(index, rowk, columnDict[col][rowk])
2074+ * index += 1
2075 */
2076- __pyx_1 = PyObject_GetItem(__pyx_v_columnDict, __pyx_v_colnum); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2077- __Pyx_GOTREF(__pyx_1);
2078- __pyx_t_6 = PyObject_GetAttr(__pyx_1, __pyx_kp_keys); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2079- __Pyx_GOTREF(__pyx_t_6);
2080- __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2081- __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2082- __Pyx_GOTREF(__pyx_t_3);
2083- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
2084- __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2085- __Pyx_GOTREF(((PyObject *)__pyx_t_6));
2086- PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);
2087- __Pyx_GIVEREF(__pyx_t_3);
2088- __pyx_t_3 = 0;
2089- __pyx_t_3 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2090- __Pyx_GOTREF(__pyx_t_3);
2091- __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
2092- if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
2093- __pyx_t_8 = 0; __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6);
2094+ __pyx_3 = __Pyx_GetItemInt(__pyx_v_columnDict, __pyx_v_col, sizeof(long), PyInt_FromLong); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2095+ __Pyx_GOTREF(__pyx_3);
2096+ __pyx_t_4 = PyObject_GetAttr(__pyx_3, __pyx_kp_keys); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2097+ __Pyx_GOTREF(__pyx_t_4);
2098+ __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
2099+ __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2100+ __Pyx_GOTREF(__pyx_t_2);
2101+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2102+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2103+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2104+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
2105+ __Pyx_GIVEREF(__pyx_t_2);
2106+ __pyx_t_2 = 0;
2107+ __pyx_t_2 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2108+ __Pyx_GOTREF(__pyx_t_2);
2109+ __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
2110+ if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
2111+ __pyx_t_12 = 0; __pyx_t_4 = __pyx_t_2; __Pyx_INCREF(__pyx_t_4);
2112 } else {
2113- __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2114- __Pyx_GOTREF(__pyx_t_6);
2115+ __pyx_t_12 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2116+ __Pyx_GOTREF(__pyx_t_4);
2117 }
2118- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2119+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2120 for (;;) {
2121- if (likely(PyList_CheckExact(__pyx_t_6))) {
2122- if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
2123- __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
2124- } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {
2125- if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
2126- __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
2127+ if (likely(PyList_CheckExact(__pyx_t_4))) {
2128+ if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_4)) break;
2129+ __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_12); __Pyx_INCREF(__pyx_t_2); __pyx_t_12++;
2130+ } else if (likely(PyTuple_CheckExact(__pyx_t_4))) {
2131+ if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
2132+ __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_12); __Pyx_INCREF(__pyx_t_2); __pyx_t_12++;
2133 } else {
2134- __pyx_t_3 = PyIter_Next(__pyx_t_6);
2135- if (!__pyx_t_3) {
2136- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2137+ __pyx_t_2 = PyIter_Next(__pyx_t_4);
2138+ if (!__pyx_t_2) {
2139+ if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2140 break;
2141 }
2142- __Pyx_GOTREF(__pyx_t_3);
2143+ __Pyx_GOTREF(__pyx_t_2);
2144 }
2145- __Pyx_DECREF(__pyx_v_rowk);
2146- __pyx_v_rowk = __pyx_t_3;
2147- __pyx_t_3 = 0;
2148+ __pyx_t_16 = __Pyx_PyInt_AsLong(__pyx_t_2); if (unlikely((__pyx_t_16 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2149+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2150+ __pyx_v_rowk = __pyx_t_16;
2151
2152- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":169
2153+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":118
2154 * if col_len == 0: continue
2155- * for rowk in sorted(columnDict[colnum].keys()):
2156- * self.setValue(index, rowk, # <<<<<<<<<<<<<<
2157- * float(columnDict[colnum][rowk]))
2158- * index += 1
2159- */
2160- __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_index); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2161- __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_rowk); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2162-
2163- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":170
2164- * for rowk in sorted(columnDict[colnum].keys()):
2165- * self.setValue(index, rowk,
2166- * float(columnDict[colnum][rowk])) # <<<<<<<<<<<<<<
2167- * index += 1
2168- *
2169- */
2170- __pyx_2 = PyObject_GetItem(__pyx_v_columnDict, __pyx_v_colnum); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2171+ * for rowk in sorted(columnDict[col].keys()):
2172+ * self.setValue(index, rowk, columnDict[col][rowk]) # <<<<<<<<<<<<<<
2173+ * index += 1
2174+ * if self.offset_for_row is not None:
2175+ */
2176+ __pyx_1 = __Pyx_GetItemInt(__pyx_v_columnDict, __pyx_v_col, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2177+ __Pyx_GOTREF(__pyx_1);
2178+ __pyx_2 = __Pyx_GetItemInt(__pyx_1, __pyx_v_rowk, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2179 __Pyx_GOTREF(__pyx_2);
2180- __pyx_3 = PyObject_GetItem(__pyx_2, __pyx_v_rowk); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2181- __Pyx_GOTREF(__pyx_3);
2182+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2183+ __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2184 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2185- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2186- __Pyx_GOTREF(((PyObject *)__pyx_t_3));
2187- PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_3);
2188- __Pyx_GIVEREF(__pyx_3);
2189- __pyx_3 = 0;
2190- __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)&PyFloat_Type)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2191- __Pyx_GOTREF(__pyx_t_1);
2192- __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
2193- __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2194- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2195- ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setValue(__pyx_v_self, __pyx_t_10, __pyx_t_9, __pyx_t_11);
2196+ ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setValue(__pyx_v_self, __pyx_v_index, __pyx_v_rowk, __pyx_t_13);
2197
2198- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":171
2199- * self.setValue(index, rowk,
2200- * float(columnDict[colnum][rowk]))
2201+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":119
2202+ * for rowk in sorted(columnDict[col].keys()):
2203+ * self.setValue(index, rowk, columnDict[col][rowk])
2204 * index += 1 # <<<<<<<<<<<<<<
2205- *
2206- * cpdef dictPack(self):
2207+ * if self.offset_for_row is not None:
2208+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
2209 */
2210- __pyx_5 = PyNumber_InPlaceAdd(__pyx_v_index, __pyx_int_1); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2211- __Pyx_GOTREF(__pyx_5);
2212- __Pyx_DECREF(__pyx_v_index);
2213- __pyx_v_index = __pyx_5;
2214- __pyx_5 = 0;
2215+ __pyx_v_index += 1;
2216 }
2217- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
2218+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2219 __pyx_L6_continue:;
2220 }
2221- __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
2222+
2223+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":120
2224+ * self.setValue(index, rowk, columnDict[col][rowk])
2225+ * index += 1
2226+ * if self.offset_for_row is not None: # <<<<<<<<<<<<<<
2227+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
2228+ * if self.offset_for_col is not None:
2229+ */
2230+ __pyx_t_3 = (__pyx_v_self->offset_for_row != Py_None);
2231+ if (__pyx_t_3) {
2232+
2233+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":121
2234+ * index += 1
2235+ * if self.offset_for_row is not None:
2236+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row) # <<<<<<<<<<<<<<
2237+ * if self.offset_for_col is not None:
2238+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
2239+ */
2240+ __pyx_v_self->cmatrix->offset_for_row = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->toVector(__pyx_v_self, __pyx_v_self->offset_for_row);
2241+ goto __pyx_L11;
2242+ }
2243+ __pyx_L11:;
2244+
2245+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":122
2246+ * if self.offset_for_row is not None:
2247+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
2248+ * if self.offset_for_col is not None: # <<<<<<<<<<<<<<
2249+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
2250+ *
2251+ */
2252+ __pyx_t_3 = (__pyx_v_self->offset_for_col != Py_None);
2253+ if (__pyx_t_3) {
2254+
2255+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":123
2256+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
2257+ * if self.offset_for_col is not None:
2258+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col) # <<<<<<<<<<<<<<
2259+ *
2260+ * cdef double *toVector(self, vec):
2261+ */
2262+ __pyx_v_self->cmatrix->offset_for_col = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->toVector(__pyx_v_self, __pyx_v_self->offset_for_col);
2263+ goto __pyx_L12;
2264+ }
2265+ __pyx_L12:;
2266
2267 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
2268 goto __pyx_L0;
2269@@ -1664,44 +1903,83 @@
2270 __Pyx_XDECREF(__pyx_2);
2271 __Pyx_XDECREF(__pyx_3);
2272 __Pyx_XDECREF(__pyx_4);
2273- __Pyx_XDECREF(__pyx_5);
2274- __Pyx_XDECREF(__pyx_6);
2275 __Pyx_XDECREF(__pyx_t_1);
2276- __Pyx_XDECREF(__pyx_t_3);
2277- __Pyx_XDECREF(__pyx_t_6);
2278- __Pyx_XDECREF(__pyx_t_7);
2279+ __Pyx_XDECREF(__pyx_t_2);
2280+ __Pyx_XDECREF(__pyx_t_4);
2281+ __Pyx_XDECREF(__pyx_t_10);
2282+ __Pyx_XDECREF(__pyx_t_11);
2283+ { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
2284+ __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
2285+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2286+ __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
2287 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.pack");
2288 __pyx_r = 0;
2289+ goto __pyx_L2;
2290 __pyx_L0:;
2291+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2292+ __pyx_L2:;
2293+ __Pyx_DECREF((PyObject *)__pyx_v_row_factors);
2294 __Pyx_DECREF(__pyx_v_columnDict);
2295- __Pyx_DECREF(__pyx_v_cols);
2296- __Pyx_DECREF(__pyx_v_row);
2297- __Pyx_DECREF(__pyx_v_column);
2298- __Pyx_DECREF(__pyx_v_value);
2299- __Pyx_DECREF(__pyx_v_index);
2300- __Pyx_DECREF(__pyx_v_colnum);
2301- __Pyx_DECREF(__pyx_v_col_len);
2302- __Pyx_DECREF(__pyx_v_rowk);
2303 __Pyx_XGIVEREF(__pyx_r);
2304 __Pyx_FinishRefcountContext();
2305 return __pyx_r;
2306 }
2307
2308-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":153
2309- * self.row_factors = row_factors
2310+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
2311+ * self.offset_for_col = offset_for_col
2312 *
2313- * cpdef pack(self): # <<<<<<<<<<<<<<
2314- * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
2315- * self.transposed = 0
2316+ * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
2317+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2318+ * cdef long row, col, index, cols, col_len, rowk
2319 */
2320
2321-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
2322-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused) {
2323+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
2324+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
2325+ PyObject *__pyx_v_row_norms = 0;
2326 PyObject *__pyx_r = NULL;
2327+ struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack __pyx_1;
2328 PyObject *__pyx_t_1 = NULL;
2329+ static PyObject **__pyx_pyargnames[] = {&__pyx_kp_row_norms,0};
2330 __Pyx_SetupRefcountContext("pack");
2331+ if (unlikely(__pyx_kwds)) {
2332+ Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
2333+ PyObject* values[1] = {0};
2334+ values[0] = Py_None;
2335+ switch (PyTuple_GET_SIZE(__pyx_args)) {
2336+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
2337+ case 0: break;
2338+ default: goto __pyx_L5_argtuple_error;
2339+ }
2340+ switch (PyTuple_GET_SIZE(__pyx_args)) {
2341+ case 0:
2342+ if (kw_args > 1) {
2343+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_norms);
2344+ if (unlikely(value)) { values[0] = value; kw_args--; }
2345+ }
2346+ }
2347+ if (unlikely(kw_args > 0)) {
2348+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "pack") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
2349+ }
2350+ __pyx_v_row_norms = values[0];
2351+ } else {
2352+ __pyx_v_row_norms = Py_None;
2353+ switch (PyTuple_GET_SIZE(__pyx_args)) {
2354+ case 1: __pyx_v_row_norms = PyTuple_GET_ITEM(__pyx_args, 0);
2355+ case 0: break;
2356+ default: goto __pyx_L5_argtuple_error;
2357+ }
2358+ }
2359+ goto __pyx_L4_argument_unpacking_done;
2360+ __pyx_L5_argtuple_error:;
2361+ __Pyx_RaiseArgtupleInvalid("pack", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
2362+ __pyx_L3_error:;
2363+ __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.pack");
2364+ return NULL;
2365+ __pyx_L4_argument_unpacking_done:;
2366 __Pyx_XDECREF(__pyx_r);
2367- __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->pack(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2368+ __pyx_1.__pyx_n = 1;
2369+ __pyx_1.row_norms = __pyx_v_row_norms;
2370+ __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->pack(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), 1, &__pyx_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2371 __Pyx_GOTREF(__pyx_t_1);
2372 __pyx_r = __pyx_t_1;
2373 __pyx_t_1 = 0;
2374@@ -1719,66 +1997,355 @@
2375 return __pyx_r;
2376 }
2377
2378-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":173
2379- * index += 1
2380- *
2381- * cpdef dictPack(self): # <<<<<<<<<<<<<<
2382- * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
2383- * self.transposed = 1
2384- */
2385-
2386-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
2387-static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_dictPack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch) {
2388+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":125
2389+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
2390+ *
2391+ * cdef double *toVector(self, vec): # <<<<<<<<<<<<<<
2392+ * cdef long n = len(vec)
2393+ * cdef double *temp = svd_doubleArray(n, False, "toVector")
2394+ */
2395+
2396+static double *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_toVector(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, PyObject *__pyx_v_vec) {
2397+ long __pyx_v_n;
2398+ double *__pyx_v_temp;
2399+ PyObject *__pyx_v_i;
2400+ double *__pyx_r;
2401+ PyObject *__pyx_1 = 0;
2402+ Py_ssize_t __pyx_t_1;
2403+ PyObject *__pyx_t_2 = NULL;
2404+ PyObject *__pyx_t_3 = NULL;
2405+ double __pyx_t_4;
2406+ Py_ssize_t __pyx_t_5;
2407+ __Pyx_SetupRefcountContext("toVector");
2408+ __pyx_v_i = Py_None; __Pyx_INCREF(Py_None);
2409+
2410+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":126
2411+ *
2412+ * cdef double *toVector(self, vec):
2413+ * cdef long n = len(vec) # <<<<<<<<<<<<<<
2414+ * cdef double *temp = svd_doubleArray(n, False, "toVector")
2415+ * for i in range(n):
2416+ */
2417+ __pyx_t_1 = PyObject_Length(__pyx_v_vec); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2418+ __pyx_v_n = __pyx_t_1;
2419+
2420+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":127
2421+ * cdef double *toVector(self, vec):
2422+ * cdef long n = len(vec)
2423+ * cdef double *temp = svd_doubleArray(n, False, "toVector") # <<<<<<<<<<<<<<
2424+ * for i in range(n):
2425+ * temp[i] = vec[i]
2426+ */
2427+ __pyx_v_temp = svd_doubleArray(__pyx_v_n, 0, __pyx_k_35);
2428+
2429+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":128
2430+ * cdef long n = len(vec)
2431+ * cdef double *temp = svd_doubleArray(n, False, "toVector")
2432+ * for i in range(n): # <<<<<<<<<<<<<<
2433+ * temp[i] = vec[i]
2434+ * return temp
2435+ */
2436+ __pyx_t_2 = PyInt_FromLong(__pyx_v_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2437+ __Pyx_GOTREF(__pyx_t_2);
2438+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2439+ __Pyx_GOTREF(((PyObject *)__pyx_t_3));
2440+ PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
2441+ __Pyx_GIVEREF(__pyx_t_2);
2442+ __pyx_t_2 = 0;
2443+ __pyx_t_2 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2444+ __Pyx_GOTREF(__pyx_t_2);
2445+ __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
2446+ if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
2447+ __pyx_t_1 = 0; __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3);
2448+ } else {
2449+ __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2450+ __Pyx_GOTREF(__pyx_t_3);
2451+ }
2452+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2453+ for (;;) {
2454+ if (likely(PyList_CheckExact(__pyx_t_3))) {
2455+ if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break;
2456+ __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
2457+ } else if (likely(PyTuple_CheckExact(__pyx_t_3))) {
2458+ if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
2459+ __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
2460+ } else {
2461+ __pyx_t_2 = PyIter_Next(__pyx_t_3);
2462+ if (!__pyx_t_2) {
2463+ if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2464+ break;
2465+ }
2466+ __Pyx_GOTREF(__pyx_t_2);
2467+ }
2468+ __Pyx_DECREF(__pyx_v_i);
2469+ __pyx_v_i = __pyx_t_2;
2470+ __pyx_t_2 = 0;
2471+
2472+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":129
2473+ * cdef double *temp = svd_doubleArray(n, False, "toVector")
2474+ * for i in range(n):
2475+ * temp[i] = vec[i] # <<<<<<<<<<<<<<
2476+ * return temp
2477+ *
2478+ */
2479+ __pyx_1 = PyObject_GetItem(__pyx_v_vec, __pyx_v_i); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2480+ __Pyx_GOTREF(__pyx_1);
2481+ __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2482+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2483+ __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2484+ (__pyx_v_temp[__pyx_t_5]) = __pyx_t_4;
2485+ }
2486+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2487+
2488+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":130
2489+ * for i in range(n):
2490+ * temp[i] = vec[i]
2491+ * return temp # <<<<<<<<<<<<<<
2492+ *
2493+ * cpdef dictPack(self, row_norms=None):
2494+ */
2495+ __pyx_r = __pyx_v_temp;
2496+ goto __pyx_L0;
2497+
2498+ __pyx_r = 0;
2499+ goto __pyx_L0;
2500+ __pyx_L1_error:;
2501+ __Pyx_XDECREF(__pyx_1);
2502+ __Pyx_XDECREF(__pyx_t_2);
2503+ __Pyx_XDECREF(__pyx_t_3);
2504+ __Pyx_WriteUnraisable("svdlib._svdlib.CSCMatrix.toVector");
2505+ __pyx_r = 0;
2506+ __pyx_L0:;
2507+ __Pyx_DECREF(__pyx_v_i);
2508+ __Pyx_FinishRefcountContext();
2509+ return __pyx_r;
2510+}
2511+
2512+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
2513+ * return temp
2514+ *
2515+ * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
2516+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2517+ * if row_norms is None:
2518+ */
2519+
2520+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
2521+static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_dictPack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack *__pyx_optional_args) {
2522+ PyObject *__pyx_v_row_norms = Py_None;
2523+ PyArrayObject *__pyx_v_row_factors;
2524 PyObject *__pyx_v_rowDict = 0;
2525 int __pyx_v_rows;
2526 int __pyx_v_colk;
2527 int __pyx_v_index;
2528 int __pyx_v_rownum;
2529 int __pyx_v_row_len;
2530- float __pyx_v_val;
2531+ double __pyx_v_val;
2532+ Py_buffer __pyx_bstruct_row_factors;
2533+ Py_ssize_t __pyx_bstride_0_row_factors = 0;
2534+ Py_ssize_t __pyx_bshape_0_row_factors = 0;
2535 PyObject *__pyx_r = NULL;
2536 PyObject *__pyx_1 = 0;
2537 PyObject *__pyx_2 = 0;
2538 PyObject *__pyx_t_1 = NULL;
2539- int __pyx_t_2;
2540- Py_ssize_t __pyx_t_3;
2541+ PyObject *__pyx_t_2 = NULL;
2542+ int __pyx_t_3;
2543 PyObject *__pyx_t_4 = NULL;
2544- PyObject *__pyx_t_5 = NULL;
2545- PyObject *__pyx_t_6 = NULL;
2546- int __pyx_t_7;
2547- int __pyx_t_8;
2548- float __pyx_t_9;
2549- double __pyx_t_10;
2550+ PyArrayObject *__pyx_t_5 = NULL;
2551+ int __pyx_t_6;
2552+ PyObject *__pyx_t_7 = NULL;
2553+ PyObject *__pyx_t_8 = NULL;
2554+ PyObject *__pyx_t_9 = NULL;
2555+ PyObject *__pyx_t_10 = NULL;
2556+ PyObject *__pyx_t_11 = NULL;
2557+ Py_ssize_t __pyx_t_12;
2558+ int __pyx_t_13;
2559+ int __pyx_t_14;
2560+ double __pyx_t_15;
2561 __Pyx_SetupRefcountContext("dictPack");
2562+ if (__pyx_optional_args) {
2563+ if (__pyx_optional_args->__pyx_n > 0) {
2564+ __pyx_v_row_norms = __pyx_optional_args->row_norms;
2565+ }
2566+ }
2567+ __pyx_v_row_factors = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None);
2568+ __pyx_bstruct_row_factors.buf = NULL;
2569 /* Check if called by wrapper */
2570 if (unlikely(__pyx_skip_dispatch)) ;
2571 /* Check if overriden in Python */
2572 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
2573- __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dictPack); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2574+ __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dictPack); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2575 __Pyx_GOTREF(__pyx_1);
2576 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack)) {
2577 __Pyx_XDECREF(__pyx_r);
2578- __pyx_t_1 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2579- __Pyx_GOTREF(__pyx_t_1);
2580+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2581+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2582+ __Pyx_INCREF(__pyx_v_row_norms);
2583+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_norms);
2584+ __Pyx_GIVEREF(__pyx_v_row_norms);
2585+ __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2586+ __Pyx_GOTREF(__pyx_t_2);
2587 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2588- __pyx_r = __pyx_t_1;
2589- __pyx_t_1 = 0;
2590+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2591+ __pyx_r = __pyx_t_2;
2592+ __pyx_t_2 = 0;
2593 goto __pyx_L0;
2594 }
2595 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2596 }
2597
2598- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":174
2599- *
2600- * cpdef dictPack(self):
2601+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":134
2602+ * cpdef dictPack(self, row_norms=None):
2603+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2604+ * if row_norms is None: # <<<<<<<<<<<<<<
2605+ * row_factors = np.ones(self.rows)
2606+ * else:
2607+ */
2608+ __pyx_t_3 = (__pyx_v_row_norms == Py_None);
2609+ if (__pyx_t_3) {
2610+
2611+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":135
2612+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2613+ * if row_norms is None:
2614+ * row_factors = np.ones(self.rows) # <<<<<<<<<<<<<<
2615+ * else:
2616+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
2617+ */
2618+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2619+ __Pyx_GOTREF(__pyx_1);
2620+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_ones); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2621+ __Pyx_GOTREF(__pyx_t_2);
2622+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2623+ __pyx_t_1 = PyInt_FromLong(__pyx_v_self->rows); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2624+ __Pyx_GOTREF(__pyx_t_1);
2625+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2626+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2627+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
2628+ __Pyx_GIVEREF(__pyx_t_1);
2629+ __pyx_t_1 = 0;
2630+ __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2631+ __Pyx_GOTREF(__pyx_t_1);
2632+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2633+ __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
2634+ if (!(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2635+ __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
2636+ {
2637+ __Pyx_BufFmt_StackElem __pyx_stack[1];
2638+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2639+ __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
2640+ if (unlikely(__pyx_t_6 < 0)) {
2641+ PyErr_Fetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
2642+ if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_v_row_factors, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
2643+ Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);
2644+ __Pyx_RaiseBufferFallbackError();
2645+ } else {
2646+ PyErr_Restore(__pyx_t_7, __pyx_t_8, __pyx_t_9);
2647+ }
2648+ }
2649+ __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
2650+ __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
2651+ if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2652+ }
2653+ __pyx_t_5 = 0;
2654+ __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
2655+ __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_1);
2656+ __pyx_t_1 = 0;
2657+ goto __pyx_L3;
2658+ }
2659+ /*else*/ {
2660+
2661+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":137
2662+ * row_factors = np.ones(self.rows)
2663+ * else:
2664+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE))) # <<<<<<<<<<<<<<
2665+ *
2666+ * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
2667+ */
2668+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2669+ __Pyx_GOTREF(__pyx_1);
2670+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_reciprocal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2671+ __Pyx_GOTREF(__pyx_t_1);
2672+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2673+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2674+ __Pyx_GOTREF(__pyx_1);
2675+ __pyx_t_4 = PyObject_GetAttr(__pyx_1, __pyx_kp_sqrt); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2676+ __Pyx_GOTREF(__pyx_t_4);
2677+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2678+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2679+ __Pyx_GOTREF(__pyx_1);
2680+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2681+ __Pyx_GOTREF(__pyx_t_2);
2682+ __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2683+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2684+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2685+ __Pyx_INCREF(__pyx_v_row_norms);
2686+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_row_norms);
2687+ __Pyx_GIVEREF(__pyx_v_row_norms);
2688+ __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2689+ __Pyx_GOTREF(((PyObject *)__pyx_1));
2690+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2691+ __Pyx_GOTREF(__pyx_2);
2692+ if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2693+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2694+ __pyx_t_11 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_10), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2695+ __Pyx_GOTREF(__pyx_t_11);
2696+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2697+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2698+ __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
2699+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2700+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2701+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
2702+ __Pyx_GIVEREF(__pyx_t_11);
2703+ __pyx_t_11 = 0;
2704+ __pyx_t_11 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2705+ __Pyx_GOTREF(__pyx_t_11);
2706+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2707+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2708+ __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2709+ __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2710+ PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
2711+ __Pyx_GIVEREF(__pyx_t_11);
2712+ __pyx_t_11 = 0;
2713+ __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2714+ __Pyx_GOTREF(__pyx_t_11);
2715+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2716+ __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2717+ if (!(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2718+ __pyx_t_5 = ((PyArrayObject *)__pyx_t_11);
2719+ {
2720+ __Pyx_BufFmt_StackElem __pyx_stack[1];
2721+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2722+ __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
2723+ if (unlikely(__pyx_t_6 < 0)) {
2724+ PyErr_Fetch(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);
2725+ if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_row_factors, (PyObject*)__pyx_v_row_factors, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
2726+ Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);
2727+ __Pyx_RaiseBufferFallbackError();
2728+ } else {
2729+ PyErr_Restore(__pyx_t_9, __pyx_t_8, __pyx_t_7);
2730+ }
2731+ }
2732+ __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
2733+ __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
2734+ if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2735+ }
2736+ __pyx_t_5 = 0;
2737+ __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
2738+ __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_11);
2739+ __pyx_t_11 = 0;
2740+ }
2741+ __pyx_L3:;
2742+
2743+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":139
2744+ * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
2745+ *
2746 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero) # <<<<<<<<<<<<<<
2747 * self.transposed = 1
2748 * cdef object rowDict = self.tensor._data
2749 */
2750 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->cols, __pyx_v_self->rows, __pyx_v_self->nonZero);
2751
2752- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":175
2753- * cpdef dictPack(self):
2754+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":140
2755+ *
2756 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
2757 * self.transposed = 1 # <<<<<<<<<<<<<<
2758 * cdef object rowDict = self.tensor._data
2759@@ -1786,35 +2353,35 @@
2760 */
2761 __pyx_v_self->transposed = 1;
2762
2763- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":176
2764+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":141
2765 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
2766 * self.transposed = 1
2767 * cdef object rowDict = self.tensor._data # <<<<<<<<<<<<<<
2768 * cdef int rows = self.tensor.shape[0]
2769 * cdef int colk
2770 */
2771- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp__data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2772- __Pyx_GOTREF(__pyx_t_1);
2773- __pyx_v_rowDict = __pyx_t_1;
2774- __pyx_t_1 = 0;
2775+ __pyx_t_11 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp__data); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2776+ __Pyx_GOTREF(__pyx_t_11);
2777+ __pyx_v_rowDict = __pyx_t_11;
2778+ __pyx_t_11 = 0;
2779
2780- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":177
2781+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":142
2782 * self.transposed = 1
2783 * cdef object rowDict = self.tensor._data
2784 * cdef int rows = self.tensor.shape[0] # <<<<<<<<<<<<<<
2785 * cdef int colk
2786 * cdef int index = 0
2787 */
2788- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2789- __Pyx_GOTREF(__pyx_t_1);
2790- __pyx_1 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2791- __Pyx_GOTREF(__pyx_1);
2792- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2793- __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2794- __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2795- __pyx_v_rows = __pyx_t_2;
2796+ __pyx_t_11 = PyObject_GetAttr(__pyx_v_self->tensor, __pyx_kp_shape); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2797+ __Pyx_GOTREF(__pyx_t_11);
2798+ __pyx_2 = __Pyx_GetItemInt(__pyx_t_11, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2799+ __Pyx_GOTREF(__pyx_2);
2800+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
2801+ __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2802+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2803+ __pyx_v_rows = __pyx_t_6;
2804
2805- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":179
2806+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":144
2807 * cdef int rows = self.tensor.shape[0]
2808 * cdef int colk
2809 * cdef int index = 0 # <<<<<<<<<<<<<<
2810@@ -1823,61 +2390,61 @@
2811 */
2812 __pyx_v_index = 0;
2813
2814- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":183
2815+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":148
2816 * cdef int row_len
2817- * cdef float val
2818+ * cdef double val
2819 * assert len(rowDict) <= rows # <<<<<<<<<<<<<<
2820 * for rownum from 0 <= rownum < rows:
2821 * row_len = len(rowDict.get(rownum, []))
2822 */
2823 #ifndef PYREX_WITHOUT_ASSERTIONS
2824- __pyx_t_3 = PyObject_Length(__pyx_v_rowDict); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2825- if (unlikely(!(__pyx_t_3 <= __pyx_v_rows))) {
2826+ __pyx_t_12 = PyObject_Length(__pyx_v_rowDict); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2827+ if (unlikely(!(__pyx_t_12 <= __pyx_v_rows))) {
2828 PyErr_SetNone(PyExc_AssertionError);
2829- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2830+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2831 }
2832 #endif
2833
2834- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":184
2835- * cdef float val
2836+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":149
2837+ * cdef double val
2838 * assert len(rowDict) <= rows
2839 * for rownum from 0 <= rownum < rows: # <<<<<<<<<<<<<<
2840 * row_len = len(rowDict.get(rownum, []))
2841 * self.setColumnSize(rownum, row_len)
2842 */
2843- __pyx_t_2 = __pyx_v_rows;
2844- for (__pyx_v_rownum = 0; __pyx_v_rownum < __pyx_t_2; __pyx_v_rownum++) {
2845+ __pyx_t_6 = __pyx_v_rows;
2846+ for (__pyx_v_rownum = 0; __pyx_v_rownum < __pyx_t_6; __pyx_v_rownum++) {
2847
2848- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":185
2849+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":150
2850 * assert len(rowDict) <= rows
2851 * for rownum from 0 <= rownum < rows:
2852 * row_len = len(rowDict.get(rownum, [])) # <<<<<<<<<<<<<<
2853 * self.setColumnSize(rownum, row_len)
2854 * if row_len == 0: continue
2855 */
2856- __pyx_t_1 = PyObject_GetAttr(__pyx_v_rowDict, __pyx_kp_get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2857+ __pyx_t_11 = PyObject_GetAttr(__pyx_v_rowDict, __pyx_kp_get); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2858+ __Pyx_GOTREF(__pyx_t_11);
2859+ __pyx_t_10 = PyInt_FromLong(__pyx_v_rownum); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2860+ __Pyx_GOTREF(__pyx_t_10);
2861+ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2862+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2863+ __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2864+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2865+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
2866+ __Pyx_GIVEREF(__pyx_t_10);
2867+ PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_1));
2868+ __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
2869+ __pyx_t_10 = 0;
2870+ __pyx_t_1 = 0;
2871+ __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2872 __Pyx_GOTREF(__pyx_t_1);
2873- __pyx_t_4 = PyInt_FromLong(__pyx_v_rownum); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2874- __Pyx_GOTREF(__pyx_t_4);
2875- __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2876- __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2877- __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2878- __Pyx_GOTREF(((PyObject *)__pyx_t_6));
2879- PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
2880- __Pyx_GIVEREF(__pyx_t_4);
2881- PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_t_5));
2882- __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
2883- __pyx_t_4 = 0;
2884- __pyx_t_5 = 0;
2885- __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2886- __Pyx_GOTREF(__pyx_t_5);
2887+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
2888+ __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
2889+ __pyx_t_12 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2890 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2891- __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
2892- __pyx_t_3 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2893- __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
2894- __pyx_v_row_len = __pyx_t_3;
2895+ __pyx_v_row_len = __pyx_t_12;
2896
2897- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":186
2898+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":151
2899 * for rownum from 0 <= rownum < rows:
2900 * row_len = len(rowDict.get(rownum, []))
2901 * self.setColumnSize(rownum, row_len) # <<<<<<<<<<<<<<
2902@@ -1886,140 +2453,174 @@
2903 */
2904 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_v_rownum, __pyx_v_row_len);
2905
2906- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":187
2907+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":152
2908 * row_len = len(rowDict.get(rownum, []))
2909 * self.setColumnSize(rownum, row_len)
2910 * if row_len == 0: continue # <<<<<<<<<<<<<<
2911 * for colk in sorted(rowDict[rownum].keys()):
2912- * val = float(rowDict[rownum][colk])
2913+ * val = float(rowDict[rownum][colk]) * row_factors[rownum]
2914 */
2915- __pyx_t_7 = (__pyx_v_row_len == 0);
2916- if (__pyx_t_7) {
2917- goto __pyx_L3_continue;
2918- goto __pyx_L5;
2919+ __pyx_t_3 = (__pyx_v_row_len == 0);
2920+ if (__pyx_t_3) {
2921+ goto __pyx_L4_continue;
2922+ goto __pyx_L6;
2923 }
2924- __pyx_L5:;
2925+ __pyx_L6:;
2926
2927- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":188
2928+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":153
2929 * self.setColumnSize(rownum, row_len)
2930 * if row_len == 0: continue
2931 * for colk in sorted(rowDict[rownum].keys()): # <<<<<<<<<<<<<<
2932- * val = float(rowDict[rownum][colk])
2933- * if self.row_factors is not None:
2934+ * val = float(rowDict[rownum][colk]) * row_factors[rownum]
2935+ * self.setValue(index, colk, val)
2936 */
2937- __pyx_1 = __Pyx_GetItemInt(__pyx_v_rowDict, __pyx_v_rownum, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2938+ __pyx_1 = __Pyx_GetItemInt(__pyx_v_rowDict, __pyx_v_rownum, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2939 __Pyx_GOTREF(__pyx_1);
2940- __pyx_t_5 = PyObject_GetAttr(__pyx_1, __pyx_kp_keys); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2941- __Pyx_GOTREF(__pyx_t_5);
2942+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_keys); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2943+ __Pyx_GOTREF(__pyx_t_1);
2944 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2945- __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2946- __Pyx_GOTREF(__pyx_t_6);
2947- __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
2948- __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2949- __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2950- PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
2951- __Pyx_GIVEREF(__pyx_t_6);
2952- __pyx_t_6 = 0;
2953- __pyx_t_6 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2954- __Pyx_GOTREF(__pyx_t_6);
2955- __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
2956- if (PyList_CheckExact(__pyx_t_6) || PyTuple_CheckExact(__pyx_t_6)) {
2957- __pyx_t_3 = 0; __pyx_t_5 = __pyx_t_6; __Pyx_INCREF(__pyx_t_5);
2958+ __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2959+ __Pyx_GOTREF(__pyx_t_4);
2960+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2961+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2962+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2963+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
2964+ __Pyx_GIVEREF(__pyx_t_4);
2965+ __pyx_t_4 = 0;
2966+ __pyx_t_4 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2967+ __Pyx_GOTREF(__pyx_t_4);
2968+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2969+ if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
2970+ __pyx_t_12 = 0; __pyx_t_1 = __pyx_t_4; __Pyx_INCREF(__pyx_t_1);
2971 } else {
2972- __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2973- __Pyx_GOTREF(__pyx_t_5);
2974+ __pyx_t_12 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2975+ __Pyx_GOTREF(__pyx_t_1);
2976 }
2977- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
2978+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2979 for (;;) {
2980- if (likely(PyList_CheckExact(__pyx_t_5))) {
2981- if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
2982- __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++;
2983- } else if (likely(PyTuple_CheckExact(__pyx_t_5))) {
2984- if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
2985- __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++;
2986+ if (likely(PyList_CheckExact(__pyx_t_1))) {
2987+ if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_1)) break;
2988+ __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_12); __Pyx_INCREF(__pyx_t_4); __pyx_t_12++;
2989+ } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
2990+ if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
2991+ __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_12); __Pyx_INCREF(__pyx_t_4); __pyx_t_12++;
2992 } else {
2993- __pyx_t_6 = PyIter_Next(__pyx_t_5);
2994- if (!__pyx_t_6) {
2995- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2996+ __pyx_t_4 = PyIter_Next(__pyx_t_1);
2997+ if (!__pyx_t_4) {
2998+ if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2999 break;
3000 }
3001- __Pyx_GOTREF(__pyx_t_6);
3002+ __Pyx_GOTREF(__pyx_t_4);
3003 }
3004- __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3005- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
3006- __pyx_v_colk = __pyx_t_8;
3007+ __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3008+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
3009+ __pyx_v_colk = __pyx_t_13;
3010
3011- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":189
3012+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":154
3013 * if row_len == 0: continue
3014 * for colk in sorted(rowDict[rownum].keys()):
3015- * val = float(rowDict[rownum][colk]) # <<<<<<<<<<<<<<
3016- * if self.row_factors is not None:
3017- * val /= sqrt(self.row_factors[rownum])
3018+ * val = float(rowDict[rownum][colk]) * row_factors[rownum] # <<<<<<<<<<<<<<
3019+ * self.setValue(index, colk, val)
3020+ * index += 1
3021 */
3022- __pyx_1 = __Pyx_GetItemInt(__pyx_v_rowDict, __pyx_v_rownum, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3023+ __pyx_2 = __Pyx_GetItemInt(__pyx_v_rowDict, __pyx_v_rownum, sizeof(int), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3024+ __Pyx_GOTREF(__pyx_2);
3025+ __pyx_1 = __Pyx_GetItemInt(__pyx_2, __pyx_v_colk, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3026 __Pyx_GOTREF(__pyx_1);
3027- __pyx_2 = __Pyx_GetItemInt(__pyx_1, __pyx_v_colk, sizeof(int), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3028- __Pyx_GOTREF(__pyx_2);
3029- __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3030- __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3031- __Pyx_GOTREF(((PyObject *)__pyx_t_6));
3032- PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_2);
3033- __Pyx_GIVEREF(__pyx_2);
3034- __pyx_2 = 0;
3035- __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)&PyFloat_Type)), ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3036- __Pyx_GOTREF(__pyx_t_1);
3037- __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
3038- __pyx_t_9 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3039- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3040- __pyx_v_val = __pyx_t_9;
3041+ __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3042+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3043+ __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3044+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_1);
3045+ __Pyx_GIVEREF(__pyx_1);
3046+ __pyx_1 = 0;
3047+ __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)&PyFloat_Type)), ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3048+ __Pyx_GOTREF(__pyx_t_11);
3049+ __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
3050+ __pyx_t_13 = __pyx_v_rownum;
3051+ __pyx_t_14 = -1;
3052+ if (__pyx_t_13 < 0) {
3053+ __pyx_t_13 += __pyx_bshape_0_row_factors;
3054+ if (unlikely(__pyx_t_13 < 0)) __pyx_t_14 = 0;
3055+ } else if (unlikely(__pyx_t_13 >= __pyx_bshape_0_row_factors)) __pyx_t_14 = 0;
3056+ if (unlikely(__pyx_t_14 != -1)) {
3057+ __Pyx_RaiseBufferIndexError(__pyx_t_14);
3058+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3059+ }
3060+ __pyx_t_4 = PyFloat_FromDouble((*__Pyx_BufPtrStrided1d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_row_factors.buf, __pyx_t_13, __pyx_bstride_0_row_factors))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3061+ __Pyx_GOTREF(__pyx_t_4);
3062+ __pyx_t_10 = PyNumber_Multiply(__pyx_t_11, __pyx_t_4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3063+ __Pyx_GOTREF(__pyx_t_10);
3064+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
3065+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
3066+ __pyx_t_15 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3067+ __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
3068+ __pyx_v_val = __pyx_t_15;
3069
3070- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":190
3071+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":155
3072 * for colk in sorted(rowDict[rownum].keys()):
3073- * val = float(rowDict[rownum][colk])
3074- * if self.row_factors is not None: # <<<<<<<<<<<<<<
3075- * val /= sqrt(self.row_factors[rownum])
3076- * self.setValue(index, colk, val)
3077- */
3078- __pyx_t_7 = (__pyx_v_self->row_factors != Py_None);
3079- if (__pyx_t_7) {
3080-
3081- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":191
3082- * val = float(rowDict[rownum][colk])
3083- * if self.row_factors is not None:
3084- * val /= sqrt(self.row_factors[rownum]) # <<<<<<<<<<<<<<
3085- * self.setValue(index, colk, val)
3086- * index += 1
3087- */
3088- __pyx_1 = __Pyx_GetItemInt(__pyx_v_self->row_factors, __pyx_v_rownum, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3089- __Pyx_GOTREF(__pyx_1);
3090- __pyx_t_10 = __pyx_PyFloat_AsDouble(__pyx_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3091- __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3092- __pyx_v_val /= sqrt(__pyx_t_10);
3093- goto __pyx_L8;
3094- }
3095- __pyx_L8:;
3096-
3097- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":192
3098- * if self.row_factors is not None:
3099- * val /= sqrt(self.row_factors[rownum])
3100+ * val = float(rowDict[rownum][colk]) * row_factors[rownum]
3101 * self.setValue(index, colk, val) # <<<<<<<<<<<<<<
3102 * index += 1
3103- *
3104+ * # Transposed offset vectors.
3105 */
3106 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setValue(__pyx_v_self, __pyx_v_index, __pyx_v_colk, __pyx_v_val);
3107
3108- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":193
3109- * val /= sqrt(self.row_factors[rownum])
3110+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":156
3111+ * val = float(rowDict[rownum][colk]) * row_factors[rownum]
3112 * self.setValue(index, colk, val)
3113 * index += 1 # <<<<<<<<<<<<<<
3114- *
3115- *
3116+ * # Transposed offset vectors.
3117+ * if self.offset_for_row is not None:
3118 */
3119 __pyx_v_index += 1;
3120 }
3121- __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
3122- __pyx_L3_continue:;
3123- }
3124+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3125+ __pyx_L4_continue:;
3126+ }
3127+
3128+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":158
3129+ * index += 1
3130+ * # Transposed offset vectors.
3131+ * if self.offset_for_row is not None: # <<<<<<<<<<<<<<
3132+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
3133+ * if self.offset_for_col is not None:
3134+ */
3135+ __pyx_t_3 = (__pyx_v_self->offset_for_row != Py_None);
3136+ if (__pyx_t_3) {
3137+
3138+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":159
3139+ * # Transposed offset vectors.
3140+ * if self.offset_for_row is not None:
3141+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row) # <<<<<<<<<<<<<<
3142+ * if self.offset_for_col is not None:
3143+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col)
3144+ */
3145+ __pyx_v_self->cmatrix->offset_for_col = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->toVector(__pyx_v_self, __pyx_v_self->offset_for_row);
3146+ goto __pyx_L9;
3147+ }
3148+ __pyx_L9:;
3149+
3150+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":160
3151+ * if self.offset_for_row is not None:
3152+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
3153+ * if self.offset_for_col is not None: # <<<<<<<<<<<<<<
3154+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col)
3155+ *
3156+ */
3157+ __pyx_t_3 = (__pyx_v_self->offset_for_col != Py_None);
3158+ if (__pyx_t_3) {
3159+
3160+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":161
3161+ * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
3162+ * if self.offset_for_col is not None:
3163+ * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col) # <<<<<<<<<<<<<<
3164+ *
3165+ *
3166+ */
3167+ __pyx_v_self->cmatrix->offset_for_row = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->toVector(__pyx_v_self, __pyx_v_self->offset_for_col);
3168+ goto __pyx_L10;
3169+ }
3170+ __pyx_L10:;
3171
3172 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
3173 goto __pyx_L0;
3174@@ -2027,33 +2628,82 @@
3175 __Pyx_XDECREF(__pyx_1);
3176 __Pyx_XDECREF(__pyx_2);
3177 __Pyx_XDECREF(__pyx_t_1);
3178+ __Pyx_XDECREF(__pyx_t_2);
3179 __Pyx_XDECREF(__pyx_t_4);
3180- __Pyx_XDECREF(__pyx_t_5);
3181- __Pyx_XDECREF(__pyx_t_6);
3182+ __Pyx_XDECREF(__pyx_t_10);
3183+ __Pyx_XDECREF(__pyx_t_11);
3184+ { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
3185+ __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
3186+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
3187+ __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
3188 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.dictPack");
3189 __pyx_r = 0;
3190+ goto __pyx_L2;
3191 __pyx_L0:;
3192+ __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
3193+ __pyx_L2:;
3194+ __Pyx_DECREF((PyObject *)__pyx_v_row_factors);
3195 __Pyx_XDECREF(__pyx_v_rowDict);
3196 __Pyx_XGIVEREF(__pyx_r);
3197 __Pyx_FinishRefcountContext();
3198 return __pyx_r;
3199 }
3200
3201-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":173
3202- * index += 1
3203+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
3204+ * return temp
3205 *
3206- * cpdef dictPack(self): # <<<<<<<<<<<<<<
3207- * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
3208- * self.transposed = 1
3209+ * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
3210+ * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
3211+ * if row_norms is None:
3212 */
3213
3214-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
3215-static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused) {
3216+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
3217+static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
3218+ PyObject *__pyx_v_row_norms = 0;
3219 PyObject *__pyx_r = NULL;
3220+ struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack __pyx_1;
3221 PyObject *__pyx_t_1 = NULL;
3222+ static PyObject **__pyx_pyargnames[] = {&__pyx_kp_row_norms,0};
3223 __Pyx_SetupRefcountContext("dictPack");
3224+ if (unlikely(__pyx_kwds)) {
3225+ Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
3226+ PyObject* values[1] = {0};
3227+ values[0] = Py_None;
3228+ switch (PyTuple_GET_SIZE(__pyx_args)) {
3229+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
3230+ case 0: break;
3231+ default: goto __pyx_L5_argtuple_error;
3232+ }
3233+ switch (PyTuple_GET_SIZE(__pyx_args)) {
3234+ case 0:
3235+ if (kw_args > 1) {
3236+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_norms);
3237+ if (unlikely(value)) { values[0] = value; kw_args--; }
3238+ }
3239+ }
3240+ if (unlikely(kw_args > 0)) {
3241+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dictPack") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3242+ }
3243+ __pyx_v_row_norms = values[0];
3244+ } else {
3245+ __pyx_v_row_norms = Py_None;
3246+ switch (PyTuple_GET_SIZE(__pyx_args)) {
3247+ case 1: __pyx_v_row_norms = PyTuple_GET_ITEM(__pyx_args, 0);
3248+ case 0: break;
3249+ default: goto __pyx_L5_argtuple_error;
3250+ }
3251+ }
3252+ goto __pyx_L4_argument_unpacking_done;
3253+ __pyx_L5_argtuple_error:;
3254+ __Pyx_RaiseArgtupleInvalid("dictPack", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3255+ __pyx_L3_error:;
3256+ __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.dictPack");
3257+ return NULL;
3258+ __pyx_L4_argument_unpacking_done:;
3259 __Pyx_XDECREF(__pyx_r);
3260- __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->dictPack(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3261+ __pyx_1.__pyx_n = 1;
3262+ __pyx_1.row_norms = __pyx_v_row_norms;
3263+ __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->dictPack(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), 1, &__pyx_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3264 __Pyx_GOTREF(__pyx_t_1);
3265 __pyx_r = __pyx_t_1;
3266 __pyx_t_1 = 0;
3267@@ -2071,7 +2721,7 @@
3268 return __pyx_r;
3269 }
3270
3271-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":196
3272+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":164
3273 *
3274 *
3275 * def __repr__(self): # <<<<<<<<<<<<<<
3276@@ -2084,7 +2734,7 @@
3277 PyObject *__pyx_r = NULL;
3278 __Pyx_SetupRefcountContext("__repr__");
3279
3280- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":197
3281+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":165
3282 *
3283 * def __repr__(self):
3284 * return u'<CSCMatrix>' # <<<<<<<<<<<<<<
3285@@ -2092,8 +2742,8 @@
3286 * def __dealloc__(self):
3287 */
3288 __Pyx_XDECREF(__pyx_r);
3289- __Pyx_INCREF(((PyObject *)__pyx_kp_35));
3290- __pyx_r = ((PyObject *)__pyx_kp_35);
3291+ __Pyx_INCREF(((PyObject *)__pyx_kp_36));
3292+ __pyx_r = ((PyObject *)__pyx_kp_36);
3293 goto __pyx_L0;
3294
3295 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
3296@@ -2103,7 +2753,7 @@
3297 return __pyx_r;
3298 }
3299
3300-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":199
3301+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":167
3302 * return u'<CSCMatrix>'
3303 *
3304 * def __dealloc__(self): # <<<<<<<<<<<<<<
3305@@ -2115,7 +2765,7 @@
3306 static void __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___dealloc__(PyObject *__pyx_v_self) {
3307 __Pyx_SetupRefcountContext("__dealloc__");
3308
3309- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":200
3310+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":168
3311 *
3312 * def __dealloc__(self):
3313 * svdFreeSMat(self.cmatrix) # <<<<<<<<<<<<<<
3314@@ -2127,7 +2777,7 @@
3315 __Pyx_FinishRefcountContext();
3316 }
3317
3318-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":202
3319+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":170
3320 * svdFreeSMat(self.cmatrix)
3321 *
3322 * cdef void setColumnSize(self, int col, int size): # <<<<<<<<<<<<<<
3323@@ -2143,7 +2793,7 @@
3324 PyObject *__pyx_t_4 = NULL;
3325 __Pyx_SetupRefcountContext("setColumnSize");
3326
3327- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":203
3328+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":171
3329 *
3330 * cdef void setColumnSize(self, int col, int size):
3331 * if size == 0: # <<<<<<<<<<<<<<
3332@@ -2153,29 +2803,29 @@
3333 __pyx_t_1 = (__pyx_v_size == 0);
3334 if (__pyx_t_1) {
3335
3336- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":204
3337+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":172
3338 * cdef void setColumnSize(self, int col, int size):
3339 * if size == 0:
3340 * warnings.warn('Column %d is empty' % col) # <<<<<<<<<<<<<<
3341 * self.cmatrix[0].pointr[0] = 0
3342 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size
3343 */
3344- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_warnings); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3345+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_warnings); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3346 __Pyx_GOTREF(__pyx_1);
3347- __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_warn); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3348+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_warn); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3349 __Pyx_GOTREF(__pyx_t_2);
3350 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3351- __pyx_t_3 = PyInt_FromLong(__pyx_v_col); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3352+ __pyx_t_3 = PyInt_FromLong(__pyx_v_col); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3353 __Pyx_GOTREF(__pyx_t_3);
3354- __pyx_t_4 = PyNumber_Remainder(__pyx_kp_36, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3355+ __pyx_t_4 = PyNumber_Remainder(__pyx_kp_37, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3356 __Pyx_GOTREF(__pyx_t_4);
3357 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3358- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3359+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3360 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3361 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
3362 __Pyx_GIVEREF(__pyx_t_4);
3363 __pyx_t_4 = 0;
3364- __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3365+ __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3366 __Pyx_GOTREF(__pyx_t_4);
3367 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3368 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3369@@ -2184,7 +2834,7 @@
3370 }
3371 __pyx_L3:;
3372
3373- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":205
3374+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":173
3375 * if size == 0:
3376 * warnings.warn('Column %d is empty' % col)
3377 * self.cmatrix[0].pointr[0] = 0 # <<<<<<<<<<<<<<
3378@@ -2193,12 +2843,12 @@
3379 */
3380 ((__pyx_v_self->cmatrix[0]).pointr[0]) = 0;
3381
3382- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":206
3383+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":174
3384 * warnings.warn('Column %d is empty' % col)
3385 * self.cmatrix[0].pointr[0] = 0
3386 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size # <<<<<<<<<<<<<<
3387 *
3388- * cdef void setValue(self, int index, int rowind, float value):
3389+ * cdef void setValue(self, int index, int rowind, double value):
3390 */
3391 (__pyx_v_self->cmatrix->pointr[(__pyx_v_col + 1)]) = ((__pyx_v_self->cmatrix->pointr[__pyx_v_col]) + __pyx_v_size);
3392
3393@@ -2213,15 +2863,15 @@
3394 __Pyx_FinishRefcountContext();
3395 }
3396
3397-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":208
3398+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":176
3399 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size
3400 *
3401- * cdef void setValue(self, int index, int rowind, float value): # <<<<<<<<<<<<<<
3402+ * cdef void setValue(self, int index, int rowind, double value): # <<<<<<<<<<<<<<
3403 * if value == 0:
3404 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
3405 */
3406
3407-static void __pyx_f_6svdlib_7_svdlib_9CSCMatrix_setValue(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_v_index, int __pyx_v_rowind, float __pyx_v_value) {
3408+static void __pyx_f_6svdlib_7_svdlib_9CSCMatrix_setValue(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_v_index, int __pyx_v_rowind, double __pyx_v_value) {
3409 PyObject *__pyx_1 = 0;
3410 int __pyx_t_1;
3411 PyObject *__pyx_t_2 = NULL;
3412@@ -2230,9 +2880,9 @@
3413 PyObject *__pyx_t_5 = NULL;
3414 __Pyx_SetupRefcountContext("setValue");
3415
3416- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":209
3417+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":177
3418 *
3419- * cdef void setValue(self, int index, int rowind, float value):
3420+ * cdef void setValue(self, int index, int rowind, double value):
3421 * if value == 0: # <<<<<<<<<<<<<<
3422 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
3423 * self.cmatrix.rowind[index] = rowind
3424@@ -2240,23 +2890,23 @@
3425 __pyx_t_1 = (__pyx_v_value == 0);
3426 if (__pyx_t_1) {
3427
3428- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":210
3429- * cdef void setValue(self, int index, int rowind, float value):
3430+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":178
3431+ * cdef void setValue(self, int index, int rowind, double value):
3432 * if value == 0:
3433 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index)) # <<<<<<<<<<<<<<
3434 * self.cmatrix.rowind[index] = rowind
3435 * self.cmatrix.value[index] = value
3436 */
3437- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_warnings); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3438+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_warnings); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3439 __Pyx_GOTREF(__pyx_1);
3440- __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_warn); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3441+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_warn); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3442 __Pyx_GOTREF(__pyx_t_2);
3443 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3444- __pyx_t_3 = PyInt_FromLong(__pyx_v_rowind); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3445+ __pyx_t_3 = PyInt_FromLong(__pyx_v_rowind); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3446 __Pyx_GOTREF(__pyx_t_3);
3447- __pyx_t_4 = PyInt_FromLong(__pyx_v_index); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3448+ __pyx_t_4 = PyInt_FromLong(__pyx_v_index); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3449 __Pyx_GOTREF(__pyx_t_4);
3450- __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3451+ __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3452 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
3453 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
3454 __Pyx_GIVEREF(__pyx_t_3);
3455@@ -2264,15 +2914,15 @@
3456 __Pyx_GIVEREF(__pyx_t_4);
3457 __pyx_t_3 = 0;
3458 __pyx_t_4 = 0;
3459- __pyx_t_4 = PyNumber_Remainder(__pyx_kp_37, ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3460+ __pyx_t_4 = PyNumber_Remainder(__pyx_kp_38, ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3461 __Pyx_GOTREF(__pyx_t_4);
3462 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
3463- __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3464+ __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3465 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
3466 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
3467 __Pyx_GIVEREF(__pyx_t_4);
3468 __pyx_t_4 = 0;
3469- __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3470+ __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3471 __Pyx_GOTREF(__pyx_t_4);
3472 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3473 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
3474@@ -2281,7 +2931,7 @@
3475 }
3476 __pyx_L3:;
3477
3478- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":211
3479+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":179
3480 * if value == 0:
3481 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
3482 * self.cmatrix.rowind[index] = rowind # <<<<<<<<<<<<<<
3483@@ -2290,7 +2940,7 @@
3484 */
3485 (__pyx_v_self->cmatrix->rowind[__pyx_v_index]) = __pyx_v_rowind;
3486
3487- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":212
3488+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":180
3489 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
3490 * self.cmatrix.rowind[index] = rowind
3491 * self.cmatrix.value[index] = value # <<<<<<<<<<<<<<
3492@@ -2311,7 +2961,7 @@
3493 __Pyx_FinishRefcountContext();
3494 }
3495
3496-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":220
3497+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":188
3498 *
3499 *
3500 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<
3501@@ -2331,18 +2981,18 @@
3502 if (unlikely(__pyx_skip_dispatch)) ;
3503 /* Check if overriden in Python */
3504 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
3505- __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_svdA); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3506+ __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_svdA); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3507 __Pyx_GOTREF(__pyx_1);
3508 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_svdA)) {
3509 __Pyx_XDECREF(__pyx_r);
3510- __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3511+ __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3512 __Pyx_GOTREF(__pyx_t_1);
3513- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3514+ __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;}
3515 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
3516 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
3517 __Pyx_GIVEREF(__pyx_t_1);
3518 __pyx_t_1 = 0;
3519- __pyx_t_1 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3520+ __pyx_t_1 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3521 __Pyx_GOTREF(__pyx_t_1);
3522 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3523 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
3524@@ -2353,7 +3003,7 @@
3525 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3526 }
3527
3528- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":222
3529+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":190
3530 * cpdef object svdA(self, int k):
3531 * cdef svdrec *svdrec
3532 * svdrec = svdLAS2A(self.cmatrix, k) # <<<<<<<<<<<<<<
3533@@ -2362,7 +3012,7 @@
3534 */
3535 __pyx_v_svdrec = svdLAS2A(__pyx_v_self->cmatrix, __pyx_v_k);
3536
3537- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":223
3538+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":191
3539 * cdef svdrec *svdrec
3540 * svdrec = svdLAS2A(self.cmatrix, k)
3541 * return wrapSVDrec(svdrec, self.transposed) # <<<<<<<<<<<<<<
3542@@ -2370,7 +3020,7 @@
3543 * @cython.boundscheck(False)
3544 */
3545 __Pyx_XDECREF(__pyx_r);
3546- __pyx_t_1 = wrapSVDrec(__pyx_v_svdrec, __pyx_v_self->transposed); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3547+ __pyx_t_1 = wrapSVDrec(__pyx_v_svdrec, __pyx_v_self->transposed); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3548 __Pyx_GOTREF(__pyx_t_1);
3549 __pyx_r = __pyx_t_1;
3550 __pyx_t_1 = 0;
3551@@ -2390,7 +3040,7 @@
3552 return __pyx_r;
3553 }
3554
3555-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":220
3556+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":188
3557 *
3558 *
3559 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<
3560@@ -2405,7 +3055,7 @@
3561 PyObject *__pyx_t_1 = NULL;
3562 __Pyx_SetupRefcountContext("svdA");
3563 assert(__pyx_arg_k); {
3564- __pyx_v_k = __Pyx_PyInt_AsInt(__pyx_arg_k); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3565+ __pyx_v_k = __Pyx_PyInt_AsInt(__pyx_arg_k); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3566 }
3567 goto __pyx_L4_argument_unpacking_done;
3568 __pyx_L3_error:;
3569@@ -2413,7 +3063,7 @@
3570 return NULL;
3571 __pyx_L4_argument_unpacking_done:;
3572 __Pyx_XDECREF(__pyx_r);
3573- __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->svdA(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), __pyx_v_k, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3574+ __pyx_t_1 = ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->__pyx_vtab)->svdA(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self), __pyx_v_k, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3575 __Pyx_GOTREF(__pyx_t_1);
3576 __pyx_r = __pyx_t_1;
3577 __pyx_t_1 = 0;
3578@@ -2431,7 +3081,7 @@
3579 return __pyx_r;
3580 }
3581
3582-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":226
3583+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":194
3584 *
3585 * @cython.boundscheck(False)
3586 * def isvd(self, int k=50, int niter=100, double lrate=.001): # <<<<<<<<<<<<<<
3587@@ -2533,20 +3183,20 @@
3588 }
3589 }
3590 if (unlikely(kw_args > 0)) {
3591- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "isvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3592+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "isvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3593 }
3594 if (values[0]) {
3595- __pyx_v_k = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3596+ __pyx_v_k = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3597 } else {
3598 __pyx_v_k = 50;
3599 }
3600 if (values[1]) {
3601- __pyx_v_niter = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_niter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3602+ __pyx_v_niter = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_niter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3603 } else {
3604 __pyx_v_niter = 100;
3605 }
3606 if (values[2]) {
3607- __pyx_v_lrate = __pyx_PyFloat_AsDouble(values[2]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3608+ __pyx_v_lrate = __pyx_PyFloat_AsDouble(values[2]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3609 } else {
3610 __pyx_v_lrate = 0.001;
3611 }
3612@@ -2555,16 +3205,16 @@
3613 __pyx_v_niter = 100;
3614 __pyx_v_lrate = 0.001;
3615 switch (PyTuple_GET_SIZE(__pyx_args)) {
3616- case 3: __pyx_v_lrate = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 2)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3617- case 2: __pyx_v_niter = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_niter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3618- case 1: __pyx_v_k = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3619+ case 3: __pyx_v_lrate = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 2)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3620+ case 2: __pyx_v_niter = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_niter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3621+ case 1: __pyx_v_k = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_k == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3622 case 0: break;
3623 default: goto __pyx_L5_argtuple_error;
3624 }
3625 }
3626 goto __pyx_L4_argument_unpacking_done;
3627 __pyx_L5_argtuple_error:;
3628- __Pyx_RaiseArgtupleInvalid("isvd", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3629+ __Pyx_RaiseArgtupleInvalid("isvd", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
3630 __pyx_L3_error:;
3631 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.isvd");
3632 return NULL;
3633@@ -2578,29 +3228,29 @@
3634 __pyx_bstruct_u.buf = NULL;
3635 __pyx_bstruct_v.buf = NULL;
3636
3637- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":227
3638+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":195
3639 * @cython.boundscheck(False)
3640 * def isvd(self, int k=50, int niter=100, double lrate=.001):
3641 * from csc.divisi.tensor import DenseTensor # <<<<<<<<<<<<<<
3642 * cdef smat* A = self.cmatrix
3643 * print "COMPUTING INCREMENTAL SVD"
3644 */
3645- __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3646+ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3647 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3648 __Pyx_INCREF(__pyx_kp_DenseTensor);
3649 PyList_SET_ITEM(__pyx_t_1, 0, __pyx_kp_DenseTensor);
3650 __Pyx_GIVEREF(__pyx_kp_DenseTensor);
3651- __pyx_1 = __Pyx_Import(__pyx_kp_38, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3652+ __pyx_1 = __Pyx_Import(__pyx_kp_39, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3653 __Pyx_GOTREF(__pyx_1);
3654 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3655- __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_DenseTensor); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3656+ __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_DenseTensor); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3657 __Pyx_GOTREF(__pyx_2);
3658 __Pyx_DECREF(__pyx_v_DenseTensor);
3659 __pyx_v_DenseTensor = __pyx_2;
3660 __pyx_2 = 0;
3661 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3662
3663- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":228
3664+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":196
3665 * def isvd(self, int k=50, int niter=100, double lrate=.001):
3666 * from csc.divisi.tensor import DenseTensor
3667 * cdef smat* A = self.cmatrix # <<<<<<<<<<<<<<
3668@@ -2609,29 +3259,29 @@
3669 */
3670 __pyx_v_A = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cmatrix;
3671
3672- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":229
3673+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":197
3674 * from csc.divisi.tensor import DenseTensor
3675 * cdef smat* A = self.cmatrix
3676 * print "COMPUTING INCREMENTAL SVD" # <<<<<<<<<<<<<<
3677 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)
3678 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
3679 */
3680- if (__Pyx_PrintOne(__pyx_kp_39) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3681+ if (__Pyx_PrintOne(__pyx_kp_40) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3682
3683- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":230
3684+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":198
3685 * cdef smat* A = self.cmatrix
3686 * print "COMPUTING INCREMENTAL SVD"
3687 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<
3688 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
3689 *
3690 */
3691- __pyx_t_1 = PyInt_FromLong(__pyx_v_A->rows); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3692+ __pyx_t_1 = PyInt_FromLong(__pyx_v_A->rows); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3693 __Pyx_GOTREF(__pyx_t_1);
3694- __pyx_t_2 = PyInt_FromLong(__pyx_v_A->cols); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3695+ __pyx_t_2 = PyInt_FromLong(__pyx_v_A->cols); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3696 __Pyx_GOTREF(__pyx_t_2);
3697- __pyx_t_3 = PyInt_FromLong(__pyx_v_A->vals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3698+ __pyx_t_3 = PyInt_FromLong(__pyx_v_A->vals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3699 __Pyx_GOTREF(__pyx_t_3);
3700- __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3701+ __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3702 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3703 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
3704 __Pyx_GIVEREF(__pyx_t_1);
3705@@ -2642,26 +3292,26 @@
3706 __pyx_t_1 = 0;
3707 __pyx_t_2 = 0;
3708 __pyx_t_3 = 0;
3709- __pyx_t_3 = PyNumber_Remainder(__pyx_kp_40, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3710+ __pyx_t_3 = PyNumber_Remainder(__pyx_kp_41, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3711 __Pyx_GOTREF(__pyx_t_3);
3712 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
3713- if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3714+ if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3715 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3716
3717- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":231
3718+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":199
3719 * print "COMPUTING INCREMENTAL SVD"
3720 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)
3721 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter) # <<<<<<<<<<<<<<
3722 *
3723 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)
3724 */
3725- __pyx_t_3 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3726+ __pyx_t_3 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3727 __Pyx_GOTREF(__pyx_t_3);
3728- __pyx_t_4 = PyFloat_FromDouble(__pyx_v_lrate); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3729+ __pyx_t_4 = PyFloat_FromDouble(__pyx_v_lrate); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3730 __Pyx_GOTREF(__pyx_t_4);
3731- __pyx_t_2 = PyInt_FromLong(__pyx_v_niter); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3732+ __pyx_t_2 = PyInt_FromLong(__pyx_v_niter); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3733 __Pyx_GOTREF(__pyx_t_2);
3734- __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3735+ __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3736 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3737 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
3738 __Pyx_GIVEREF(__pyx_t_3);
3739@@ -2672,34 +3322,34 @@
3740 __pyx_t_3 = 0;
3741 __pyx_t_4 = 0;
3742 __pyx_t_2 = 0;
3743- __pyx_t_2 = PyNumber_Remainder(__pyx_kp_41, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3744+ __pyx_t_2 = PyNumber_Remainder(__pyx_kp_42, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3745 __Pyx_GOTREF(__pyx_t_2);
3746 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3747- if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3748+ if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3749 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3750
3751- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":233
3752+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":201
3753 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
3754 *
3755 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<
3756 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001)
3757 *
3758 */
3759- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3760+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3761 __Pyx_GOTREF(__pyx_1);
3762- __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3763+ __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3764 __Pyx_GOTREF(__pyx_t_2);
3765 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3766- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3767+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3768 __Pyx_GOTREF(__pyx_2);
3769- __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3770+ __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3771 __Pyx_GOTREF(__pyx_t_1);
3772 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3773- __pyx_t_4 = PyInt_FromLong(__pyx_v_A->rows); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3774+ __pyx_t_4 = PyInt_FromLong(__pyx_v_A->rows); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3775 __Pyx_GOTREF(__pyx_t_4);
3776- __pyx_t_3 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3777+ __pyx_t_3 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3778 __Pyx_GOTREF(__pyx_t_3);
3779- __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3780+ __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3781 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
3782 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
3783 __Pyx_GIVEREF(__pyx_t_4);
3784@@ -2707,25 +3357,25 @@
3785 __Pyx_GIVEREF(__pyx_t_3);
3786 __pyx_t_4 = 0;
3787 __pyx_t_3 = 0;
3788- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3789+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3790 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3791 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));
3792 __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
3793 __pyx_t_5 = 0;
3794- __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3795+ __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3796 __Pyx_GOTREF(((PyObject *)__pyx_1));
3797- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3798+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3799 __Pyx_GOTREF(__pyx_2);
3800- if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3801+ if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3802 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3803- __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3804+ __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3805 __Pyx_GOTREF(__pyx_t_5);
3806 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3807 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3808 __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
3809- __pyx_t_3 = PyFloat_FromDouble(0.001); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3810+ __pyx_t_3 = PyFloat_FromDouble(0.001); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3811 __Pyx_GOTREF(__pyx_t_3);
3812- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3813+ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3814 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3815 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
3816 __Pyx_GIVEREF(__pyx_t_5);
3817@@ -2733,17 +3383,17 @@
3818 __Pyx_GIVEREF(__pyx_t_3);
3819 __pyx_t_5 = 0;
3820 __pyx_t_3 = 0;
3821- __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3822+ __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3823 __Pyx_GOTREF(__pyx_t_3);
3824 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3825 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3826- if (!(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3827+ if (!(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3828 __pyx_t_6 = ((PyArrayObject *)__pyx_t_3);
3829 {
3830 __Pyx_BufFmt_StackElem __pyx_stack[1];
3831 if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_u, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
3832 __pyx_v_u = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_u.buf = NULL;
3833- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3834+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3835 } else {__pyx_bstride_0_u = __pyx_bstruct_u.strides[0]; __pyx_bstride_1_u = __pyx_bstruct_u.strides[1];
3836 __pyx_bshape_0_u = __pyx_bstruct_u.shape[0]; __pyx_bshape_1_u = __pyx_bstruct_u.shape[1];
3837 }
3838@@ -2752,28 +3402,28 @@
3839 __pyx_v_u = ((PyArrayObject *)__pyx_t_3);
3840 __pyx_t_3 = 0;
3841
3842- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":234
3843+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":202
3844 *
3845 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)
3846 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<
3847 *
3848 * # Maintain a cache of dot-products up to the current axis
3849 */
3850- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3851+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3852 __Pyx_GOTREF(__pyx_2);
3853- __pyx_t_3 = PyObject_GetAttr(__pyx_2, __pyx_kp_add); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3854+ __pyx_t_3 = PyObject_GetAttr(__pyx_2, __pyx_kp_add); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3855 __Pyx_GOTREF(__pyx_t_3);
3856 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3857- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3858+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3859 __Pyx_GOTREF(__pyx_1);
3860- __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3861+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3862 __Pyx_GOTREF(__pyx_t_1);
3863 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3864- __pyx_t_2 = PyInt_FromLong(__pyx_v_A->cols); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3865+ __pyx_t_2 = PyInt_FromLong(__pyx_v_A->cols); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3866 __Pyx_GOTREF(__pyx_t_2);
3867- __pyx_t_5 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3868+ __pyx_t_5 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3869 __Pyx_GOTREF(__pyx_t_5);
3870- __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3871+ __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3872 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3873 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
3874 __Pyx_GIVEREF(__pyx_t_2);
3875@@ -2781,25 +3431,25 @@
3876 __Pyx_GIVEREF(__pyx_t_5);
3877 __pyx_t_2 = 0;
3878 __pyx_t_5 = 0;
3879- __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3880+ __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3881 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
3882 PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_4));
3883 __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
3884 __pyx_t_4 = 0;
3885- __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3886+ __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3887 __Pyx_GOTREF(((PyObject *)__pyx_2));
3888- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3889+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_DTYPE); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3890 __Pyx_GOTREF(__pyx_1);
3891- if (PyDict_SetItem(__pyx_2, __pyx_kp_dtype, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3892+ if (PyDict_SetItem(__pyx_2, __pyx_kp_dtype, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3893 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3894- __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3895+ __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3896 __Pyx_GOTREF(__pyx_t_4);
3897 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3898 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
3899 __Pyx_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
3900- __pyx_t_5 = PyFloat_FromDouble(0.001); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3901+ __pyx_t_5 = PyFloat_FromDouble(0.001); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3902 __Pyx_GOTREF(__pyx_t_5);
3903- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3904+ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3905 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3906 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
3907 __Pyx_GIVEREF(__pyx_t_4);
3908@@ -2807,17 +3457,17 @@
3909 __Pyx_GIVEREF(__pyx_t_5);
3910 __pyx_t_4 = 0;
3911 __pyx_t_5 = 0;
3912- __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3913+ __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3914 __Pyx_GOTREF(__pyx_t_5);
3915 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3916 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3917- if (!(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3918+ if (!(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3919 __pyx_t_7 = ((PyArrayObject *)__pyx_t_5);
3920 {
3921 __Pyx_BufFmt_StackElem __pyx_stack[1];
3922 if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_v, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_6svdlib_7_svdlib_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
3923 __pyx_v_v = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_v.buf = NULL;
3924- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3925+ {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
3926 } else {__pyx_bstride_0_v = __pyx_bstruct_v.strides[0]; __pyx_bstride_1_v = __pyx_bstruct_v.strides[1];
3927 __pyx_bshape_0_v = __pyx_bstruct_v.shape[0]; __pyx_bshape_1_v = __pyx_bstruct_v.shape[1];
3928 }
3929@@ -2826,7 +3476,7 @@
3930 __pyx_v_v = ((PyArrayObject *)__pyx_t_5);
3931 __pyx_t_5 = 0;
3932
3933- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":237
3934+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":205
3935 *
3936 * # Maintain a cache of dot-products up to the current axis
3937 * cdef smat* predicted = svdNewSMat(A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<
3938@@ -2835,7 +3485,7 @@
3939 */
3940 __pyx_v_predicted = svdNewSMat(__pyx_v_A->rows, __pyx_v_A->cols, __pyx_v_A->vals);
3941
3942- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":246
3943+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":214
3944 * # (This should be done with memcpy, but i'm not certain
3945 * # how to do that here)
3946 * for i in range(A.cols + 1): # <<<<<<<<<<<<<<
3947@@ -2845,7 +3495,7 @@
3948 for (__pyx_t_8 = 0; __pyx_t_8 < (__pyx_v_A->cols + 1); __pyx_t_8+=1) {
3949 __pyx_v_i = __pyx_t_8;
3950
3951- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":247
3952+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":215
3953 * # how to do that here)
3954 * for i in range(A.cols + 1):
3955 * predicted.pointr[i] = A.pointr[i] # <<<<<<<<<<<<<<
3956@@ -2855,7 +3505,7 @@
3957 (__pyx_v_predicted->pointr[__pyx_v_i]) = (__pyx_v_A->pointr[__pyx_v_i]);
3958 }
3959
3960- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":249
3961+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":217
3962 * predicted.pointr[i] = A.pointr[i]
3963 *
3964 * for i in range(A.vals): # <<<<<<<<<<<<<<
3965@@ -2865,7 +3515,7 @@
3966 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_A->vals; __pyx_t_8+=1) {
3967 __pyx_v_i = __pyx_t_8;
3968
3969- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":250
3970+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":218
3971 *
3972 * for i in range(A.vals):
3973 * predicted.rowind[i] = A.rowind[i] # <<<<<<<<<<<<<<
3974@@ -2874,7 +3524,7 @@
3975 */
3976 (__pyx_v_predicted->rowind[__pyx_v_i]) = (__pyx_v_A->rowind[__pyx_v_i]);
3977
3978- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":251
3979+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":219
3980 * for i in range(A.vals):
3981 * predicted.rowind[i] = A.rowind[i]
3982 * predicted.value[i] = 0 # <<<<<<<<<<<<<<
3983@@ -2884,7 +3534,7 @@
3984 (__pyx_v_predicted->value[__pyx_v_i]) = 0;
3985 }
3986
3987- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":253
3988+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":221
3989 * predicted.value[i] = 0
3990 *
3991 * for axis in range(k): # <<<<<<<<<<<<<<
3992@@ -2894,7 +3544,7 @@
3993 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_k; __pyx_t_8+=1) {
3994 __pyx_v_axis = __pyx_t_8;
3995
3996- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":254
3997+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":222
3998 *
3999 * for axis in range(k):
4000 * for i in range(niter): # <<<<<<<<<<<<<<
4001@@ -2904,7 +3554,7 @@
4002 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_niter; __pyx_t_9+=1) {
4003 __pyx_v_i = __pyx_t_9;
4004
4005- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":256
4006+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":224
4007 * for i in range(niter):
4008 * # Iterate over all values of the sparse matrix
4009 * for cur_col in range(A.cols): # <<<<<<<<<<<<<<
4010@@ -2914,7 +3564,7 @@
4011 for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_v_A->cols; __pyx_t_10+=1) {
4012 __pyx_v_cur_col = __pyx_t_10;
4013
4014- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":257
4015+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":225
4016 * # Iterate over all values of the sparse matrix
4017 * for cur_col in range(A.cols):
4018 * col_index = A.pointr[cur_col] # <<<<<<<<<<<<<<
4019@@ -2923,7 +3573,7 @@
4020 */
4021 __pyx_v_col_index = (__pyx_v_A->pointr[__pyx_v_cur_col]);
4022
4023- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":258
4024+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":226
4025 * for cur_col in range(A.cols):
4026 * col_index = A.pointr[cur_col]
4027 * next_col_index = A.pointr[cur_col + 1] # <<<<<<<<<<<<<<
4028@@ -2932,7 +3582,7 @@
4029 */
4030 __pyx_v_next_col_index = (__pyx_v_A->pointr[(__pyx_v_cur_col + 1)]);
4031
4032- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":259
4033+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":227
4034 * col_index = A.pointr[cur_col]
4035 * next_col_index = A.pointr[cur_col + 1]
4036 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<
4037@@ -2942,7 +3592,7 @@
4038 for (__pyx_t_11 = __pyx_v_col_index; __pyx_t_11 < __pyx_v_next_col_index; __pyx_t_11+=1) {
4039 __pyx_v_value_index = __pyx_t_11;
4040
4041- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":260
4042+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":228
4043 * next_col_index = A.pointr[cur_col + 1]
4044 * for value_index in range(col_index, next_col_index):
4045 * cur_row = A.rowind[value_index] # <<<<<<<<<<<<<<
4046@@ -2951,7 +3601,7 @@
4047 */
4048 __pyx_v_cur_row = (__pyx_v_A->rowind[__pyx_v_value_index]);
4049
4050- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":262
4051+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":230
4052 * cur_row = A.rowind[value_index]
4053 * err = A.value[value_index] - (predicted.value[value_index] +
4054 * u[cur_row, axis] * v[cur_col, axis]) # <<<<<<<<<<<<<<
4055@@ -2964,7 +3614,7 @@
4056 __pyx_t_15 = __pyx_v_axis;
4057 __pyx_v_err = ((__pyx_v_A->value[__pyx_v_value_index]) - ((__pyx_v_predicted->value[__pyx_v_value_index]) + ((*__Pyx_BufPtrStrided2d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_u.buf, __pyx_t_12, __pyx_bstride_0_u, __pyx_t_13, __pyx_bstride_1_u)) * (*__Pyx_BufPtrStrided2d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_v.buf, __pyx_t_14, __pyx_bstride_0_v, __pyx_t_15, __pyx_bstride_1_v)))));
4058
4059- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":264
4060+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":232
4061 * u[cur_row, axis] * v[cur_col, axis])
4062 *
4063 * u_value = u[cur_row, axis] # <<<<<<<<<<<<<<
4064@@ -2975,7 +3625,7 @@
4065 __pyx_t_17 = __pyx_v_axis;
4066 __pyx_v_u_value = (*__Pyx_BufPtrStrided2d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_u.buf, __pyx_t_16, __pyx_bstride_0_u, __pyx_t_17, __pyx_bstride_1_u));
4067
4068- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":265
4069+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":233
4070 *
4071 * u_value = u[cur_row, axis]
4072 * u[cur_row, axis] += lrate * err * v[cur_col, axis] # <<<<<<<<<<<<<<
4073@@ -2988,7 +3638,7 @@
4074 __pyx_t_21 = __pyx_v_axis;
4075 *__Pyx_BufPtrStrided2d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_u.buf, __pyx_t_20, __pyx_bstride_0_u, __pyx_t_21, __pyx_bstride_1_u) += ((__pyx_v_lrate * __pyx_v_err) * (*__Pyx_BufPtrStrided2d(__pyx_t_6svdlib_7_svdlib_DTYPE_t *, __pyx_bstruct_v.buf, __pyx_t_18, __pyx_bstride_0_v, __pyx_t_19, __pyx_bstride_1_v)));
4076
4077- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":266
4078+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":234
4079 * u_value = u[cur_row, axis]
4080 * u[cur_row, axis] += lrate * err * v[cur_col, axis]
4081 * v[cur_col, axis] += lrate * err * u_value # <<<<<<<<<<<<<<
4082@@ -3002,7 +3652,7 @@
4083 }
4084 }
4085
4086- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":269
4087+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":237
4088 *
4089 * # Update cached dot-products
4090 * for cur_col in range(predicted.cols): # <<<<<<<<<<<<<<
4091@@ -3012,7 +3662,7 @@
4092 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_predicted->cols; __pyx_t_9+=1) {
4093 __pyx_v_cur_col = __pyx_t_9;
4094
4095- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":270
4096+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":238
4097 * # Update cached dot-products
4098 * for cur_col in range(predicted.cols):
4099 * col_index = predicted.pointr[cur_col] # <<<<<<<<<<<<<<
4100@@ -3021,7 +3671,7 @@
4101 */
4102 __pyx_v_col_index = (__pyx_v_predicted->pointr[__pyx_v_cur_col]);
4103
4104- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":271
4105+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":239
4106 * for cur_col in range(predicted.cols):
4107 * col_index = predicted.pointr[cur_col]
4108 * next_col_index = predicted.pointr[cur_col + 1] # <<<<<<<<<<<<<<
4109@@ -3030,7 +3680,7 @@
4110 */
4111 __pyx_v_next_col_index = (__pyx_v_predicted->pointr[(__pyx_v_cur_col + 1)]);
4112
4113- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":272
4114+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":240
4115 * col_index = predicted.pointr[cur_col]
4116 * next_col_index = predicted.pointr[cur_col + 1]
4117 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<
4118@@ -3040,7 +3690,7 @@
4119 for (__pyx_t_10 = __pyx_v_col_index; __pyx_t_10 < __pyx_v_next_col_index; __pyx_t_10+=1) {
4120 __pyx_v_value_index = __pyx_t_10;
4121
4122- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":273
4123+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":241
4124 * next_col_index = predicted.pointr[cur_col + 1]
4125 * for value_index in range(col_index, next_col_index):
4126 * cur_row = predicted.rowind[value_index] # <<<<<<<<<<<<<<
4127@@ -3049,7 +3699,7 @@
4128 */
4129 __pyx_v_cur_row = (__pyx_v_predicted->rowind[__pyx_v_value_index]);
4130
4131- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":274
4132+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":242
4133 * for value_index in range(col_index, next_col_index):
4134 * cur_row = predicted.rowind[value_index]
4135 * predicted.value[value_index] += u[cur_row, axis] * v[cur_col, axis] # <<<<<<<<<<<<<<
4136@@ -3065,32 +3715,32 @@
4137 }
4138 }
4139
4140- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":277
4141+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":245
4142 *
4143 * # Factor out the svals from u and v
4144 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u))) # <<<<<<<<<<<<<<
4145 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))
4146 *
4147 */
4148- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4149+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4150 __Pyx_GOTREF(__pyx_1);
4151- __pyx_t_5 = PyObject_GetAttr(__pyx_1, __pyx_kp_sqrt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4152+ __pyx_t_5 = PyObject_GetAttr(__pyx_1, __pyx_kp_sqrt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4153 __Pyx_GOTREF(__pyx_t_5);
4154 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
4155- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4156+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4157 __Pyx_GOTREF(__pyx_2);
4158- __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_add); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4159+ __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_add); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4160 __Pyx_GOTREF(__pyx_t_1);
4161 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
4162- __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_kp_reduce); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4163+ __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_kp_reduce); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4164 __Pyx_GOTREF(__pyx_t_3);
4165 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4166- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4167+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4168 __Pyx_GOTREF(__pyx_1);
4169- __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_multiply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4170+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_multiply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4171 __Pyx_GOTREF(__pyx_t_1);
4172 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
4173- __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4174+ __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4175 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
4176 __Pyx_INCREF(((PyObject *)__pyx_v_u));
4177 PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
4178@@ -3098,25 +3748,25 @@
4179 __Pyx_INCREF(((PyObject *)__pyx_v_u));
4180 PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_u));
4181 __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
4182- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4183+ __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4184 __Pyx_GOTREF(__pyx_t_2);
4185 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4186 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
4187- __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4188+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4189 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
4190 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
4191 __Pyx_GIVEREF(__pyx_t_2);
4192 __pyx_t_2 = 0;
4193- __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4194+ __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4195 __Pyx_GOTREF(__pyx_t_2);
4196 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4197 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
4198- __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4199+ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4200 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
4201 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
4202 __Pyx_GIVEREF(__pyx_t_2);
4203 __pyx_t_2 = 0;
4204- __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4205+ __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4206 __Pyx_GOTREF(__pyx_t_2);
4207 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
4208 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
4209@@ -3124,32 +3774,32 @@
4210 __pyx_v_u_sigma = __pyx_t_2;
4211 __pyx_t_2 = 0;
4212
4213- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":278
4214+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":246
4215 * # Factor out the svals from u and v
4216 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u)))
4217 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v))) # <<<<<<<<<<<<<<
4218 *
4219 * u_tensor = DenseTensor(np.divide(u, u_sigma))
4220 */
4221- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4222+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4223 __Pyx_GOTREF(__pyx_2);
4224- __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_sqrt); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4225+ __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_sqrt); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4226 __Pyx_GOTREF(__pyx_t_2);
4227 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
4228- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4229+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4230 __Pyx_GOTREF(__pyx_1);
4231- __pyx_t_4 = PyObject_GetAttr(__pyx_1, __pyx_kp_add); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4232+ __pyx_t_4 = PyObject_GetAttr(__pyx_1, __pyx_kp_add); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4233 __Pyx_GOTREF(__pyx_t_4);
4234 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
4235- __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_kp_reduce); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4236+ __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_kp_reduce); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4237 __Pyx_GOTREF(__pyx_t_5);
4238 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
4239- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4240+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4241 __Pyx_GOTREF(__pyx_2);
4242- __pyx_t_4 = PyObject_GetAttr(__pyx_2, __pyx_kp_multiply); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4243+ __pyx_t_4 = PyObject_GetAttr(__pyx_2, __pyx_kp_multiply); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4244 __Pyx_GOTREF(__pyx_t_4);
4245 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
4246- __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4247+ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4248 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4249 __Pyx_INCREF(((PyObject *)__pyx_v_v));
4250 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));
4251@@ -3157,25 +3807,25 @@
4252 __Pyx_INCREF(((PyObject *)__pyx_v_v));
4253 PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_v));
4254 __Pyx_GIVEREF(((PyObject *)__pyx_v_v));
4255- __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4256+ __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4257 __Pyx_GOTREF(__pyx_t_1);
4258 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
4259 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4260- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4261+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4262 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4263 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
4264 __Pyx_GIVEREF(__pyx_t_1);
4265 __pyx_t_1 = 0;
4266- __pyx_t_1 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4267+ __pyx_t_1 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4268 __Pyx_GOTREF(__pyx_t_1);
4269 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
4270 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4271- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4272+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4273 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4274 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
4275 __Pyx_GIVEREF(__pyx_t_1);
4276 __pyx_t_1 = 0;
4277- __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 = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4278+ __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 = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4279 __Pyx_GOTREF(__pyx_t_1);
4280 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
4281 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4282@@ -3183,19 +3833,19 @@
4283 __pyx_v_v_sigma = __pyx_t_1;
4284 __pyx_t_1 = 0;
4285
4286- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":280
4287+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":248
4288 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))
4289 *
4290 * u_tensor = DenseTensor(np.divide(u, u_sigma)) # <<<<<<<<<<<<<<
4291 * v_tensor = DenseTensor(np.divide(v, v_sigma))
4292 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
4293 */
4294- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4295+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4296 __Pyx_GOTREF(__pyx_1);
4297- __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_divide); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4298+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_divide); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4299 __Pyx_GOTREF(__pyx_t_1);
4300 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
4301- __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4302+ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4303 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4304 __Pyx_INCREF(((PyObject *)__pyx_v_u));
4305 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_u));
4306@@ -3203,35 +3853,35 @@
4307 __Pyx_INCREF(__pyx_v_u_sigma);
4308 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_u_sigma);
4309 __Pyx_GIVEREF(__pyx_v_u_sigma);
4310- __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 = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4311+ __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 = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4312 __Pyx_GOTREF(__pyx_t_2);
4313 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4314 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4315- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4316+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4317 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4318 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
4319 __Pyx_GIVEREF(__pyx_t_2);
4320 __pyx_t_2 = 0;
4321- __pyx_t_2 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4322+ __pyx_t_2 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4323 __Pyx_GOTREF(__pyx_t_2);
4324 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4325 __Pyx_DECREF(__pyx_v_u_tensor);
4326 __pyx_v_u_tensor = __pyx_t_2;
4327 __pyx_t_2 = 0;
4328
4329- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":281
4330+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":249
4331 *
4332 * u_tensor = DenseTensor(np.divide(u, u_sigma))
4333 * v_tensor = DenseTensor(np.divide(v, v_sigma)) # <<<<<<<<<<<<<<
4334 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
4335 *
4336 */
4337- __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4338+ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4339 __Pyx_GOTREF(__pyx_2);
4340- __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_divide); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4341+ __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_divide); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4342 __Pyx_GOTREF(__pyx_t_2);
4343 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
4344- __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4345+ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4346 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4347 __Pyx_INCREF(((PyObject *)__pyx_v_v));
4348 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));
4349@@ -3239,35 +3889,35 @@
4350 __Pyx_INCREF(__pyx_v_v_sigma);
4351 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);
4352 __Pyx_GIVEREF(__pyx_v_v_sigma);
4353- __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4354+ __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 = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4355 __Pyx_GOTREF(__pyx_t_1);
4356 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
4357 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4358- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4359+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4360 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4361 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
4362 __Pyx_GIVEREF(__pyx_t_1);
4363 __pyx_t_1 = 0;
4364- __pyx_t_1 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4365+ __pyx_t_1 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4366 __Pyx_GOTREF(__pyx_t_1);
4367 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4368 __Pyx_DECREF(__pyx_v_v_tensor);
4369 __pyx_v_v_tensor = __pyx_t_1;
4370 __pyx_t_1 = 0;
4371
4372- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":282
4373+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":250
4374 * u_tensor = DenseTensor(np.divide(u, u_sigma))
4375 * v_tensor = DenseTensor(np.divide(v, v_sigma))
4376 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma)) # <<<<<<<<<<<<<<
4377 *
4378 * svdFreeSMat(predicted)
4379 */
4380- __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4381+ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4382 __Pyx_GOTREF(__pyx_1);
4383- __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_multiply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4384+ __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_multiply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4385 __Pyx_GOTREF(__pyx_t_1);
4386 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
4387- __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4388+ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4389 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4390 __Pyx_INCREF(__pyx_v_u_sigma);
4391 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_u_sigma);
4392@@ -3275,23 +3925,23 @@
4393 __Pyx_INCREF(__pyx_v_v_sigma);
4394 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);
4395 __Pyx_GIVEREF(__pyx_v_v_sigma);
4396- __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4397+ __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 = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4398 __Pyx_GOTREF(__pyx_t_2);
4399 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4400 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4401- __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4402+ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4403 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
4404 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
4405 __Pyx_GIVEREF(__pyx_t_2);
4406 __pyx_t_2 = 0;
4407- __pyx_t_2 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4408+ __pyx_t_2 = PyObject_Call(__pyx_v_DenseTensor, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4409 __Pyx_GOTREF(__pyx_t_2);
4410 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
4411 __Pyx_DECREF(__pyx_v_sigma);
4412 __pyx_v_sigma = __pyx_t_2;
4413 __pyx_t_2 = 0;
4414
4415- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":284
4416+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":252
4417 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
4418 *
4419 * svdFreeSMat(predicted) # <<<<<<<<<<<<<<
4420@@ -3300,7 +3950,7 @@
4421 */
4422 svdFreeSMat(__pyx_v_predicted);
4423
4424- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":286
4425+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":254
4426 * svdFreeSMat(predicted)
4427 *
4428 * if self.transposed: # <<<<<<<<<<<<<<
4429@@ -3310,7 +3960,7 @@
4430 __pyx_t_27 = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed;
4431 if (__pyx_t_27) {
4432
4433- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":287
4434+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":255
4435 *
4436 * if self.transposed:
4437 * return v_tensor, u_tensor, sigma # <<<<<<<<<<<<<<
4438@@ -3318,7 +3968,7 @@
4439 * return u_tensor, v_tensor, sigma
4440 */
4441 __Pyx_XDECREF(__pyx_r);
4442- __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4443+ __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4444 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
4445 __Pyx_INCREF(__pyx_v_v_tensor);
4446 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_v_tensor);
4447@@ -3336,15 +3986,15 @@
4448 }
4449 /*else*/ {
4450
4451- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":289
4452+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":257
4453 * return v_tensor, u_tensor, sigma
4454 * else:
4455 * return u_tensor, v_tensor, sigma # <<<<<<<<<<<<<<
4456 *
4457- * def svd(tensor, k=50, row_factors=None):
4458+ * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4459 */
4460 __Pyx_XDECREF(__pyx_r);
4461- __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4462+ __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4463 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
4464 __Pyx_INCREF(__pyx_v_u_tensor);
4465 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_u_tensor);
4466@@ -3396,12 +4046,12 @@
4467 return __pyx_r;
4468 }
4469
4470-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":291
4471+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":259
4472 * return u_tensor, v_tensor, sigma
4473 *
4474- * def svd(tensor, k=50, row_factors=None): # <<<<<<<<<<<<<<
4475- * CSC = CSCMatrix(tensor, row_factors)
4476- * CSC.pack()
4477+ * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
4478+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4479+ * CSC.pack(row_factors)
4480 */
4481
4482 static PyObject *__pyx_pf_6svdlib_7_svdlib_svd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
4483@@ -3409,20 +4059,26 @@
4484 PyObject *__pyx_v_tensor = 0;
4485 PyObject *__pyx_v_k = 0;
4486 PyObject *__pyx_v_row_factors = 0;
4487+ PyObject *__pyx_v_offset_for_row = 0;
4488+ PyObject *__pyx_v_offset_for_col = 0;
4489 PyObject *__pyx_v_CSC;
4490 PyObject *__pyx_r = NULL;
4491 PyObject *__pyx_t_1 = NULL;
4492 PyObject *__pyx_t_2 = NULL;
4493 PyObject *__pyx_t_3 = NULL;
4494- static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,0};
4495+ static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,&__pyx_kp_offset_for_row,&__pyx_kp_offset_for_col,0};
4496 __Pyx_SetupRefcountContext("svd");
4497 __pyx_self = __pyx_self;
4498 if (unlikely(__pyx_kwds)) {
4499 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
4500- PyObject* values[3] = {0,0,0};
4501+ PyObject* values[5] = {0,0,0,0,0};
4502 values[1] = __pyx_int_50;
4503 values[2] = Py_None;
4504+ values[3] = Py_None;
4505+ values[4] = Py_None;
4506 switch (PyTuple_GET_SIZE(__pyx_args)) {
4507+ case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
4508+ case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
4509 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
4510 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
4511 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
4512@@ -3444,17 +4100,33 @@
4513 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);
4514 if (unlikely(value)) { values[2] = value; kw_args--; }
4515 }
4516+ case 3:
4517+ if (kw_args > 0) {
4518+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
4519+ if (unlikely(value)) { values[3] = value; kw_args--; }
4520+ }
4521+ case 4:
4522+ if (kw_args > 0) {
4523+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
4524+ if (unlikely(value)) { values[4] = value; kw_args--; }
4525+ }
4526 }
4527 if (unlikely(kw_args > 0)) {
4528- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "svd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4529+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "svd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4530 }
4531 __pyx_v_tensor = values[0];
4532 __pyx_v_k = values[1];
4533 __pyx_v_row_factors = values[2];
4534+ __pyx_v_offset_for_row = values[3];
4535+ __pyx_v_offset_for_col = values[4];
4536 } else {
4537 __pyx_v_k = __pyx_int_50;
4538 __pyx_v_row_factors = Py_None;
4539+ __pyx_v_offset_for_row = Py_None;
4540+ __pyx_v_offset_for_col = Py_None;
4541 switch (PyTuple_GET_SIZE(__pyx_args)) {
4542+ case 5: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 4);
4543+ case 4: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 3);
4544 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);
4545 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);
4546 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);
4547@@ -3464,70 +4136,79 @@
4548 }
4549 goto __pyx_L4_argument_unpacking_done;
4550 __pyx_L5_argtuple_error:;
4551- __Pyx_RaiseArgtupleInvalid("svd", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4552+ __Pyx_RaiseArgtupleInvalid("svd", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4553 __pyx_L3_error:;
4554 __Pyx_AddTraceback("svdlib._svdlib.svd");
4555 return NULL;
4556 __pyx_L4_argument_unpacking_done:;
4557 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
4558
4559- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":292
4560+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":260
4561 *
4562- * def svd(tensor, k=50, row_factors=None):
4563- * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<
4564- * CSC.pack()
4565+ * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4566+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col) # <<<<<<<<<<<<<<
4567+ * CSC.pack(row_factors)
4568 * return CSC.svdA(k)
4569 */
4570- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4571+ __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4572 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4573 __Pyx_INCREF(__pyx_v_tensor);
4574 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
4575 __Pyx_GIVEREF(__pyx_v_tensor);
4576+ __Pyx_INCREF(__pyx_v_offset_for_row);
4577+ PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_offset_for_row);
4578+ __Pyx_GIVEREF(__pyx_v_offset_for_row);
4579+ __Pyx_INCREF(__pyx_v_offset_for_col);
4580+ PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_offset_for_col);
4581+ __Pyx_GIVEREF(__pyx_v_offset_for_col);
4582+ __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4583+ __Pyx_GOTREF(__pyx_t_2);
4584+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4585+ __Pyx_DECREF(__pyx_v_CSC);
4586+ __pyx_v_CSC = __pyx_t_2;
4587+ __pyx_t_2 = 0;
4588+
4589+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":261
4590+ * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4591+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4592+ * CSC.pack(row_factors) # <<<<<<<<<<<<<<
4593+ * return CSC.svdA(k)
4594+ *
4595+ */
4596+ __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_pack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4597+ __Pyx_GOTREF(__pyx_t_2);
4598+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4599+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4600 __Pyx_INCREF(__pyx_v_row_factors);
4601- PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);
4602+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
4603 __Pyx_GIVEREF(__pyx_v_row_factors);
4604- __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4605- __Pyx_GOTREF(__pyx_t_2);
4606- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4607- __Pyx_DECREF(__pyx_v_CSC);
4608- __pyx_v_CSC = __pyx_t_2;
4609- __pyx_t_2 = 0;
4610-
4611- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":293
4612- * def svd(tensor, k=50, row_factors=None):
4613- * CSC = CSCMatrix(tensor, row_factors)
4614- * CSC.pack() # <<<<<<<<<<<<<<
4615- * return CSC.svdA(k)
4616- *
4617- */
4618- __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_pack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4619- __Pyx_GOTREF(__pyx_t_2);
4620- __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4621- __Pyx_GOTREF(__pyx_t_1);
4622+ __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4623+ __Pyx_GOTREF(__pyx_t_3);
4624 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
4625- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4626+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4627+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4628
4629- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":294
4630- * CSC = CSCMatrix(tensor, row_factors)
4631- * CSC.pack()
4632+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":262
4633+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4634+ * CSC.pack(row_factors)
4635 * return CSC.svdA(k) # <<<<<<<<<<<<<<
4636 *
4637- * def dictSvd(tensor, k=50, row_factors=None):
4638+ * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4639 */
4640 __Pyx_XDECREF(__pyx_r);
4641- __pyx_t_1 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_svdA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4642- __Pyx_GOTREF(__pyx_t_1);
4643- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4644- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
4645+ __pyx_t_3 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_svdA); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4646+ __Pyx_GOTREF(__pyx_t_3);
4647+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4648+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4649 __Pyx_INCREF(__pyx_v_k);
4650- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);
4651+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
4652 __Pyx_GIVEREF(__pyx_v_k);
4653- __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4654- __Pyx_GOTREF(__pyx_t_3);
4655- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4656- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
4657- __pyx_r = __pyx_t_3;
4658- __pyx_t_3 = 0;
4659+ __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4660+ __Pyx_GOTREF(__pyx_t_2);
4661+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4662+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4663+ __pyx_r = __pyx_t_2;
4664+ __pyx_t_2 = 0;
4665 goto __pyx_L0;
4666
4667 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
4668@@ -3545,12 +4226,12 @@
4669 return __pyx_r;
4670 }
4671
4672-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":296
4673+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":264
4674 * return CSC.svdA(k)
4675 *
4676- * def dictSvd(tensor, k=50, row_factors=None): # <<<<<<<<<<<<<<
4677- * CSC = CSCMatrix(tensor, row_factors)
4678- * CSC.dictPack()
4679+ * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
4680+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4681+ * CSC.dictPack(row_factors)
4682 */
4683
4684 static PyObject *__pyx_pf_6svdlib_7_svdlib_dictSvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
4685@@ -3558,20 +4239,26 @@
4686 PyObject *__pyx_v_tensor = 0;
4687 PyObject *__pyx_v_k = 0;
4688 PyObject *__pyx_v_row_factors = 0;
4689+ PyObject *__pyx_v_offset_for_row = 0;
4690+ PyObject *__pyx_v_offset_for_col = 0;
4691 PyObject *__pyx_v_CSC;
4692 PyObject *__pyx_r = NULL;
4693 PyObject *__pyx_t_1 = NULL;
4694 PyObject *__pyx_t_2 = NULL;
4695 PyObject *__pyx_t_3 = NULL;
4696- static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,0};
4697+ static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,&__pyx_kp_offset_for_row,&__pyx_kp_offset_for_col,0};
4698 __Pyx_SetupRefcountContext("dictSvd");
4699 __pyx_self = __pyx_self;
4700 if (unlikely(__pyx_kwds)) {
4701 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
4702- PyObject* values[3] = {0,0,0};
4703+ PyObject* values[5] = {0,0,0,0,0};
4704 values[1] = __pyx_int_50;
4705 values[2] = Py_None;
4706+ values[3] = Py_None;
4707+ values[4] = Py_None;
4708 switch (PyTuple_GET_SIZE(__pyx_args)) {
4709+ case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
4710+ case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
4711 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
4712 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
4713 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
4714@@ -3593,17 +4280,33 @@
4715 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);
4716 if (unlikely(value)) { values[2] = value; kw_args--; }
4717 }
4718+ case 3:
4719+ if (kw_args > 0) {
4720+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
4721+ if (unlikely(value)) { values[3] = value; kw_args--; }
4722+ }
4723+ case 4:
4724+ if (kw_args > 0) {
4725+ PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
4726+ if (unlikely(value)) { values[4] = value; kw_args--; }
4727+ }
4728 }
4729 if (unlikely(kw_args > 0)) {
4730- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dictSvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4731+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dictSvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4732 }
4733 __pyx_v_tensor = values[0];
4734 __pyx_v_k = values[1];
4735 __pyx_v_row_factors = values[2];
4736+ __pyx_v_offset_for_row = values[3];
4737+ __pyx_v_offset_for_col = values[4];
4738 } else {
4739 __pyx_v_k = __pyx_int_50;
4740 __pyx_v_row_factors = Py_None;
4741+ __pyx_v_offset_for_row = Py_None;
4742+ __pyx_v_offset_for_col = Py_None;
4743 switch (PyTuple_GET_SIZE(__pyx_args)) {
4744+ case 5: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 4);
4745+ case 4: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 3);
4746 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);
4747 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);
4748 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);
4749@@ -3613,70 +4316,79 @@
4750 }
4751 goto __pyx_L4_argument_unpacking_done;
4752 __pyx_L5_argtuple_error:;
4753- __Pyx_RaiseArgtupleInvalid("dictSvd", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4754+ __Pyx_RaiseArgtupleInvalid("dictSvd", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4755 __pyx_L3_error:;
4756 __Pyx_AddTraceback("svdlib._svdlib.dictSvd");
4757 return NULL;
4758 __pyx_L4_argument_unpacking_done:;
4759 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
4760
4761- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":297
4762+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":265
4763 *
4764- * def dictSvd(tensor, k=50, row_factors=None):
4765- * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<
4766- * CSC.dictPack()
4767+ * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4768+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col) # <<<<<<<<<<<<<<
4769+ * CSC.dictPack(row_factors)
4770 * return CSC.svdA(k)
4771 */
4772- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4773+ __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4774 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4775 __Pyx_INCREF(__pyx_v_tensor);
4776 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
4777 __Pyx_GIVEREF(__pyx_v_tensor);
4778+ __Pyx_INCREF(__pyx_v_offset_for_row);
4779+ PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_offset_for_row);
4780+ __Pyx_GIVEREF(__pyx_v_offset_for_row);
4781+ __Pyx_INCREF(__pyx_v_offset_for_col);
4782+ PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_offset_for_col);
4783+ __Pyx_GIVEREF(__pyx_v_offset_for_col);
4784+ __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4785+ __Pyx_GOTREF(__pyx_t_2);
4786+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4787+ __Pyx_DECREF(__pyx_v_CSC);
4788+ __pyx_v_CSC = __pyx_t_2;
4789+ __pyx_t_2 = 0;
4790+
4791+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":266
4792+ * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4793+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4794+ * CSC.dictPack(row_factors) # <<<<<<<<<<<<<<
4795+ * return CSC.svdA(k)
4796+ *
4797+ */
4798+ __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_dictPack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4799+ __Pyx_GOTREF(__pyx_t_2);
4800+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4801+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4802 __Pyx_INCREF(__pyx_v_row_factors);
4803- PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);
4804+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
4805 __Pyx_GIVEREF(__pyx_v_row_factors);
4806- __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4807- __Pyx_GOTREF(__pyx_t_2);
4808- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4809- __Pyx_DECREF(__pyx_v_CSC);
4810- __pyx_v_CSC = __pyx_t_2;
4811- __pyx_t_2 = 0;
4812-
4813- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":298
4814- * def dictSvd(tensor, k=50, row_factors=None):
4815- * CSC = CSCMatrix(tensor, row_factors)
4816- * CSC.dictPack() # <<<<<<<<<<<<<<
4817- * return CSC.svdA(k)
4818- *
4819- */
4820- __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_dictPack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4821- __Pyx_GOTREF(__pyx_t_2);
4822- __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4823- __Pyx_GOTREF(__pyx_t_1);
4824+ __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4825+ __Pyx_GOTREF(__pyx_t_3);
4826 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
4827- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4828+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4829+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4830
4831- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":299
4832- * CSC = CSCMatrix(tensor, row_factors)
4833- * CSC.dictPack()
4834+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":267
4835+ * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4836+ * CSC.dictPack(row_factors)
4837 * return CSC.svdA(k) # <<<<<<<<<<<<<<
4838 *
4839 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4840 */
4841 __Pyx_XDECREF(__pyx_r);
4842- __pyx_t_1 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_svdA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4843- __Pyx_GOTREF(__pyx_t_1);
4844- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4845- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
4846+ __pyx_t_3 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_svdA); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4847+ __Pyx_GOTREF(__pyx_t_3);
4848+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4849+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4850 __Pyx_INCREF(__pyx_v_k);
4851- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);
4852+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
4853 __Pyx_GIVEREF(__pyx_v_k);
4854- __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4855- __Pyx_GOTREF(__pyx_t_3);
4856- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4857- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
4858- __pyx_r = __pyx_t_3;
4859- __pyx_t_3 = 0;
4860+ __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4861+ __Pyx_GOTREF(__pyx_t_2);
4862+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4863+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4864+ __pyx_r = __pyx_t_2;
4865+ __pyx_t_2 = 0;
4866 goto __pyx_L0;
4867
4868 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
4869@@ -3694,12 +4406,12 @@
4870 return __pyx_r;
4871 }
4872
4873-/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":301
4874+/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":269
4875 * return CSC.svdA(k)
4876 *
4877 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None): # <<<<<<<<<<<<<<
4878- * CSC = CSCMatrix(tensor, row_factors)
4879- * CSC.pack()
4880+ * CSC = CSCMatrix(tensor)
4881+ * CSC.pack(row_factors)
4882 */
4883
4884 static PyObject *__pyx_pf_6svdlib_7_svdlib_isvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
4885@@ -3760,7 +4472,7 @@
4886 }
4887 }
4888 if (unlikely(kw_args > 0)) {
4889- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "isvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4890+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "isvd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4891 }
4892 __pyx_v_tensor = values[0];
4893 __pyx_v_k = values[1];
4894@@ -3784,76 +4496,79 @@
4895 }
4896 goto __pyx_L4_argument_unpacking_done;
4897 __pyx_L5_argtuple_error:;
4898- __Pyx_RaiseArgtupleInvalid("isvd", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4899+ __Pyx_RaiseArgtupleInvalid("isvd", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
4900 __pyx_L3_error:;
4901 __Pyx_AddTraceback("svdlib._svdlib.isvd");
4902 return NULL;
4903 __pyx_L4_argument_unpacking_done:;
4904 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
4905
4906- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":302
4907+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":270
4908 *
4909 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4910- * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<
4911- * CSC.pack()
4912+ * CSC = CSCMatrix(tensor) # <<<<<<<<<<<<<<
4913+ * CSC.pack(row_factors)
4914 * return CSC.isvd(k, niter, lrate)
4915 */
4916- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4917+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4918 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4919 __Pyx_INCREF(__pyx_v_tensor);
4920 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
4921 __Pyx_GIVEREF(__pyx_v_tensor);
4922+ __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4923+ __Pyx_GOTREF(__pyx_t_2);
4924+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4925+ __Pyx_DECREF(__pyx_v_CSC);
4926+ __pyx_v_CSC = __pyx_t_2;
4927+ __pyx_t_2 = 0;
4928+
4929+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":271
4930+ * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4931+ * CSC = CSCMatrix(tensor)
4932+ * CSC.pack(row_factors) # <<<<<<<<<<<<<<
4933+ * return CSC.isvd(k, niter, lrate)
4934+ *
4935+ */
4936+ __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_pack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4937+ __Pyx_GOTREF(__pyx_t_2);
4938+ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4939+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4940 __Pyx_INCREF(__pyx_v_row_factors);
4941- PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);
4942+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
4943 __Pyx_GIVEREF(__pyx_v_row_factors);
4944- __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6svdlib_7_svdlib_CSCMatrix)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4945- __Pyx_GOTREF(__pyx_t_2);
4946- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4947- __Pyx_DECREF(__pyx_v_CSC);
4948- __pyx_v_CSC = __pyx_t_2;
4949- __pyx_t_2 = 0;
4950-
4951- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":303
4952- * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4953- * CSC = CSCMatrix(tensor, row_factors)
4954- * CSC.pack() # <<<<<<<<<<<<<<
4955- * return CSC.isvd(k, niter, lrate)
4956- *
4957- */
4958- __pyx_t_2 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_pack); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4959- __Pyx_GOTREF(__pyx_t_2);
4960- __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4961- __Pyx_GOTREF(__pyx_t_1);
4962+ __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4963+ __Pyx_GOTREF(__pyx_t_3);
4964 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
4965- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4966+ __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4967+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
4968
4969- /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":304
4970- * CSC = CSCMatrix(tensor, row_factors)
4971- * CSC.pack()
4972+ /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":272
4973+ * CSC = CSCMatrix(tensor)
4974+ * CSC.pack(row_factors)
4975 * return CSC.isvd(k, niter, lrate) # <<<<<<<<<<<<<<
4976 *
4977 * def dictIsvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4978 */
4979 __Pyx_XDECREF(__pyx_r);
4980- __pyx_t_1 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_isvd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4981- __Pyx_GOTREF(__pyx_t_1);
4982- __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4983- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
4984+ __pyx_t_3 = PyObject_GetAttr(__pyx_v_CSC, __pyx_kp_isvd); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4985+ __Pyx_GOTREF(__pyx_t_3);
4986+ __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
4987+ __Pyx_GOTREF(((PyObject *)__pyx_t_1));
4988 __Pyx_INCREF(__pyx_v_k);
4989- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);
4990+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
4991 __Pyx_GIVEREF(__pyx_v_k);
4992 __Pyx_INCREF(__pyx_v_niter);
4993- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_niter);
4994+ PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_niter);
4995 __Pyx_GIVEREF(__pyx_v_niter);
4996 __Pyx_INCREF(__pyx_v_lrate);
4997- PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_lrate);
4998+ PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_lrate);
4999 __Pyx_GIVEREF(__pyx_v_lrate);
5000- __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches