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
=== modified file 'csc/divisi/blend.py'
--- csc/divisi/blend.py 2009-10-19 22:04:39 +0000
+++ csc/divisi/blend.py 2009-11-17 23:59:08 +0000
@@ -1,6 +1,7 @@
1from csc.divisi.tensor import DictTensor, Tensor1from csc.divisi.tensor import DictTensor, Tensor
2from csc.divisi.ordered_set import OrderedSet2from csc.divisi.ordered_set import OrderedSet
3from csc.divisi.labeled_view import LabeledView3from csc.divisi.labeled_view import LabeledView
4from csc.divisi.normalized_view import MeanSubtractedView
4from itertools import chain, izip5from itertools import chain, izip
5import logging6import logging
6from math import sqrt7from math import sqrt
@@ -104,6 +105,11 @@
104 names, tensors = zip(*tensors)105 names, tensors = zip(*tensors)
105 else:106 else:
106 names = map(repr, tensors)107 names = map(repr, tensors)
108
109 for tensor in tensors:
110 if tensor.stack_contains(MeanSubtractedView):
111 raise TypeError("You can't blend MeanSubtractedViews. Try mean-subtracting the resulting blend.")
112
107 self._tensors = tuple(tensors)113 self._tensors = tuple(tensors)
108 self.names = tuple(names)114 self.names = tuple(names)
109 self.logger.info('tensors: %s', ', '.join(self.names))115 self.logger.info('tensors: %s', ', '.join(self.names))
110116
=== modified file 'csc/divisi/exceptions.py'
--- csc/divisi/exceptions.py 2009-02-26 22:07:47 +0000
+++ csc/divisi/exceptions.py 2009-11-17 23:59:08 +0000
@@ -3,3 +3,6 @@
33
4class DimensionMismatch(Error):4class DimensionMismatch(Error):
5 pass5 pass
6
7class InvalidLayeringException(Error):
8 pass
69
=== modified file 'csc/divisi/labeled_view.py'
--- csc/divisi/labeled_view.py 2009-09-24 01:15:17 +0000
+++ csc/divisi/labeled_view.py 2009-11-17 23:59:08 +0000
@@ -1,5 +1,5 @@
1from csc.divisi.ordered_set import OrderedSet, IdentitySet, indexable_set1from csc.divisi.ordered_set import OrderedSet, IdentitySet, indexable_set
2from csc.divisi.tensor import View, TheEmptySlice2from csc.divisi.tensor import View, TheEmptySlice, DictTensor, DenseTensor
3import copy3import copy
4import heapq4import heapq
5from operator import itemgetter5from operator import itemgetter
@@ -31,7 +31,6 @@
31 'tfidf.T': use tf-idf, transposed (matrix is documents by terms)31 'tfidf.T': use tf-idf, transposed (matrix is documents by terms)
32 a class: adds that class as a layer.32 a class: adds that class as a layer.
33 '''33 '''
34 from csc.divisi.tensor import DictTensor
35 if labels is None: labels = [OrderedSet() for _ in xrange(ndim)]34 if labels is None: labels = [OrderedSet() for _ in xrange(ndim)]
36 tensor = LabeledView(DictTensor(ndim), labels)35 tensor = LabeledView(DictTensor(ndim), labels)
37 if initial is not None:36 if initial is not None:
@@ -46,7 +45,6 @@
4645
4746
48def make_dense_labeled_tensor(data, labels):47def make_dense_labeled_tensor(data, labels):
49 from csc.divisi.tensor import DenseTensor
50 return LabeledView(DenseTensor(data), labels)48 return LabeledView(DenseTensor(data), labels)
5149
5250
@@ -289,10 +287,16 @@
289 return self.layer_on(-self.tensor)287 return self.layer_on(-self.tensor)
290288
291 def to_dense(self):289 def to_dense(self):
290 '''Change the underlying representation to a dense tensor.'''
292 return self.layer_on(self.tensor.to_dense())291 return self.layer_on(self.tensor.to_dense())
293292
294 def to_sparse(self):293 def to_sparse(self):
294 '''Change the underlying representation to a sparse tensor.'''
295 return self.layer_on(self.tensor.to_sparse())295 return self.layer_on(self.tensor.to_sparse())
296
297 def bake(self):
298 '''Simplify the representation to a LabeledView of a DictTensor.'''
299 return make_sparse_labeled_tensor(ndim=self.ndim, initial=self.iteritems())
296300
297 def dot(self, other):301 def dot(self, other):
298 """302 """
@@ -361,20 +365,12 @@
361 def layer_on(self, tensor):365 def layer_on(self, tensor):
362 return LabeledView(tensor, self._labels)366 return LabeledView(tensor, self._labels)
363367
364 def zero_mean_normalized(self, mode=0, prefix='-'):368 def unnormalized(self):
365 # This is a special case, since we must duplicate labels369 '''
366 new_tensor = self.tensor.zero_mean_normalized(mode=mode)370 Remove the topmost layer of normalization from this tensor stack.
367371 '''
368 new_labels = copy.deepcopy(self._labels)372 return self.layer_on(self.tensor.unnormalized())
369 # Duplicate labels, preserving the property that373
370 # index(label)[mode] = index(prefix label)[mode] - self.tensor.shape[mode]
371 for i in xrange(self.tensor.shape[mode]):
372 l = self.label(mode, i)
373 new_labels[mode].add(prefix + l)
374
375 return LabeledView(new_tensor, new_labels)
376
377
378 def array_op(self, op, labels=None, *args, **kwargs):374 def array_op(self, op, labels=None, *args, **kwargs):
379 """375 """
380 Apply an operation to the tensor inside (which must be a376 Apply an operation to the tensor inside (which must be a
@@ -397,7 +393,7 @@
397 labels = self.label_list(0)393 labels = self.label_list(0)
398 return dict((labels[i], float(self.tensor[i])) for i in xrange(self.shape[0]))394 return dict((labels[i], float(self.tensor[i])) for i in xrange(self.shape[0]))
399395
400 def top_items(self, n=10, largest=True, key=None, abs_val=None):396 def top_items(self, n=10, largest=True, key=None):
401 '''397 '''
402 For each of the top n items with greatest values, return a pair of398 For each of the top n items with greatest values, return a pair of
403 the item and its value.399 the item and its value.
@@ -410,12 +406,6 @@
410 If the tensor is 1D, gives indices instead of one-item tuples.406 If the tensor is 1D, gives indices instead of one-item tuples.
411 Always expresses the output in floats directly.407 Always expresses the output in floats directly.
412 '''408 '''
413 if abs_val is not None:
414 import warnings
415 warnings.warn(DeprecationWarning('abs_val is deprecated. use key=abs.'))
416 assert key is None
417 key = abs
418
419 if key is not None:409 if key is not None:
420 extreme_key = lambda ent: key(ent[1])410 extreme_key = lambda ent: key(ent[1])
421 else:411 else:
@@ -429,17 +419,6 @@
429 else:419 else:
430 return [(k, float(v)) for k, v in items]420 return [(k, float(v)) for k, v in items]
431421
432 def bake(self):
433 '''
434 Simplify the representation.
435 '''
436 return make_sparse_labeled_tensor(ndim=self.ndim, initial=self.iteritems())
437
438 def to_dense(self):
439 '''Change the underlying representation to a dense tensor.'''
440 return LabeledView(self.tensor.to_dense(), self._labels)
441
442
443 def concatenate(self, other):422 def concatenate(self, other):
444 concat_dense = self.tensor.concatenate(other.tensor)423 concat_dense = self.tensor.concatenate(other.tensor)
445 newlabels = OrderedSet(list(self.label_list(0)) +424 newlabels = OrderedSet(list(self.label_list(0)) +
@@ -466,6 +445,14 @@
466 [LabeledView(mag, [labels]) for mag, labels445 [LabeledView(mag, [labels]) for mag, labels
467 in izip(magnitudes, self.label_sets())])446 in izip(magnitudes, self.label_sets())])
468447
448 def means(self):
449 '''
450 Computes the labeled by-slice means for each dimension.
451 '''
452 means = self.tensor.means()
453 return [make_dense_labeled_tensor(means, [labels])
454 for means, labels in zip(means, self.label_lists())]
455
469456
470from csc.divisi.svd import SVD2DResults457from csc.divisi.svd import SVD2DResults
471class LabeledSVD2DResults(SVD2DResults):458class LabeledSVD2DResults(SVD2DResults):
@@ -509,7 +496,6 @@
509 @classmethod496 @classmethod
510 def load_pytables(cls, filename, copy=False):497 def load_pytables(cls, filename, copy=False):
511 import numpy as np498 import numpy as np
512 from csc.divisi.tensor import DenseTensor
513 from csc.divisi.pyt_utils import get_pyt_handle499 from csc.divisi.pyt_utils import get_pyt_handle
514 fileh = get_pyt_handle(filename)500 fileh = get_pyt_handle(filename)
515501
@@ -522,9 +508,23 @@
522 return wrapped_tensor(name).labeled(list(getattr(root, label_name)))508 return wrapped_tensor(name).labeled(list(getattr(root, label_name)))
523 u = wrapped_labeled_tensor('u', 'u_labels')509 u = wrapped_labeled_tensor('u', 'u_labels')
524 v = wrapped_labeled_tensor('v', 'v_labels')510 v = wrapped_labeled_tensor('v', 'v_labels')
525 svals = root.svals.read()511 svals = wrapped_tensor('svals')
526 svd = cls(u, v, svals)512 svd = cls(u, v, svals)
527 svd._weighted_u = wrapped_tensor('weighted_u').labeled(u.label_lists())513 svd._weighted_u = wrapped_tensor('weighted_u').labeled(u.label_lists())
528 svd._weighted_v = wrapped_tensor('weighted_v').labeled(v.label_lists())514 svd._weighted_v = wrapped_tensor('weighted_v').labeled(v.label_lists())
529 svd._core = DenseTensor(root.core)515 svd._core = wrapped_tensor('core')
530 return svd516 return svd
517
518 # Pickle also works for loading and saving.
519 def __getstate__(self):
520 return dict(
521 u=self.u,
522 v=self.v,
523 svals=self.svals)
524 def __setstate__(self, state):
525 self.u = state['u']
526 self.v = state['v']
527 self.svals = state['svals']
528 self.clear_cache()
529
530
531531
=== modified file 'csc/divisi/normalized_view.py'
--- csc/divisi/normalized_view.py 2009-10-22 18:49:23 +0000
+++ csc/divisi/normalized_view.py 2009-11-17 23:59:08 +0000
@@ -1,4 +1,5 @@
1from csc.divisi.tensor import View, InvalidLayeringException1from csc.divisi.tensor import View
2from csc.divisi.exceptions import InvalidLayeringException
23
3EPSILON = 0.000000001 # for floating point comparisons4EPSILON = 0.000000001 # for floating point comparisons
45
@@ -15,7 +16,10 @@
15 input_is_numeric = True16 input_is_numeric = True
16 output_is_numeric = True17 output_is_numeric = True
1718
18 def __init__(self, tensor, mode=0):19 # Default to normalizing on mode 0.
20 default_modes = 0
21
22 def __init__(self, tensor, mode=None):
19 '''23 '''
20 * tensor: tensor to view.24 * tensor: tensor to view.
21 * mode: which mode to normalize over (0 = rows, 1 = columns, etc.)25 * mode: which mode to normalize over (0 = rows, 1 = columns, etc.)
@@ -23,6 +27,10 @@
23 if len(tensor) == 0:27 if len(tensor) == 0:
24 raise ValueError('Tensor ' + repr(tensor) + ' is empty.')28 raise ValueError('Tensor ' + repr(tensor) + ' is empty.')
2529
30 # If this isn't a MeanSubtractedView, the underlying tensor can't be a normalized view.
31 if not isinstance(self, MeanSubtractedView) and tensor.stack_contains(BaseNormalizedView):
32 raise TypeError('Already normalized; .unnormalized() first.')
33
26 # The underlying tensor must be numeric.34 # The underlying tensor must be numeric.
27 for part in tensor.example_key():35 for part in tensor.example_key():
28 if not isinstance(part, (int, long)):36 if not isinstance(part, (int, long)):
@@ -43,12 +51,16 @@
43 raise TypeError('Normalized views are read-only.')51 raise TypeError('Normalized views are read-only.')
4452
45 @property53 @property
46 def normalize_mode(self):54 def normalize_modes(self):
47 """55 """
48 Which mode of the tensor is normalized (0 for rows, 1 for columns,56 Which modes of the tensor is normalized (0 for rows, 1 for columns,
49 etc.)57 etc.)
50 """58 """
51 return self._normalize_mode59 modes = self._normalize_mode
60 if modes is None: modes = self.default_modes
61 if not isinstance(modes, (list, tuple)):
62 modes = [modes]
63 return modes
5264
53 @property65 @property
54 def norms(self):66 def norms(self):
@@ -56,11 +68,18 @@
56 A list of the normalization factors that were computed for each68 A list of the normalization factors that were computed for each
57 row/column/whatever.69 row/column/whatever.
58 """70 """
71 # FIXME: this method should be in a subclass only.
59 return self._norms72 return self._norms
6073
61 def item_changed(self, indices, oldvalue, newvalue):74 def item_changed(self, indices, oldvalue, newvalue):
75 # FIXME: nobody ever even complained that this doesn't
76 # work. Maybe change notification just isn't worth it, and
77 # normalized views are just immutable.
62 self.update_norm(indices, oldvalue, newvalue)78 self.update_norm(indices, oldvalue, newvalue)
6379
80 def update_norm(self, indices, prev, current):
81 raise NotImplementedError
82
64 def refresh_norms():83 def refresh_norms():
65 """84 """
66 Compute all of the normalization factors from scratch.85 Compute all of the normalization factors from scratch.
@@ -104,16 +123,9 @@
104 You can also supply a list of modes to normalize over.123 You can also supply a list of modes to normalize over.
105 '''124 '''
106125
107 @property
108 def modes(self):
109 modes = self._normalize_mode
110 if not isinstance(modes, (list, tuple)):
111 modes = [modes]
112 return modes
113
114 def refresh_norms(self):126 def refresh_norms(self):
115 tensor = self.tensor127 tensor = self.tensor
116 modes = self.modes128 modes = self.normalize_modes
117 norms = [zeros((tensor.shape[mode],)) for mode in modes]129 norms = [zeros((tensor.shape[mode],)) for mode in modes]
118 for key, value in self.tensor.iteritems():130 for key, value in self.tensor.iteritems():
119 for mode in modes:131 for mode in modes:
@@ -124,7 +136,7 @@
124 self._norms = norms136 self._norms = norms
125137
126 def update_norm(self, indices, prev, current):138 def update_norm(self, indices, prev, current):
127 modes = self.modes139 modes = self.normalize_modes
128 # Handle growing the norms array.140 # Handle growing the norms array.
129 for i_mode, mode in enumerate(modes):141 for i_mode, mode in enumerate(modes):
130 index = indices[mode]142 index = indices[mode]
@@ -133,9 +145,10 @@
133 self._norms[i_mode][index] += (current*current - prev*prev)145 self._norms[i_mode][index] += (current*current - prev*prev)
134146
135 def __getitem__(self, indices):147 def __getitem__(self, indices):
148 # FIXME: this doesn't work well for slices.
136 if not isinstance(indices, (list, tuple)):149 if not isinstance(indices, (list, tuple)):
137 indices = (indices,)150 indices = (indices,)
138 modes = self.modes151 modes = self.normalize_modes
139 norm = self.base ** 2 + sum(self._norms[i_mode][indices[mode]]152 norm = self.base ** 2 + sum(self._norms[i_mode][indices[mode]]
140 for i_mode, mode in enumerate(modes))153 for i_mode, mode in enumerate(modes))
141 data = self.tensor[indices]154 data = self.tensor[indices]
@@ -143,8 +156,7 @@
143 return data / sqrt(norm)156 return data / sqrt(norm)
144157
145 def iteritems(self):158 def iteritems(self):
146 modes = self._normalize_mode159 modes = self.normalize_modes
147 if not isinstance(modes, (list, tuple)): modes = [modes]
148 base_squared = self.base ** 2160 base_squared = self.base ** 2
149 for indices, value in self.tensor.iteritems():161 for indices, value in self.tensor.iteritems():
150 norm = base_squared + sum(self._norms[i_mode][indices[mode]]162 norm = base_squared + sum(self._norms[i_mode][indices[mode]]
@@ -152,9 +164,6 @@
152 yield indices, value / sqrt(norm)164 yield indices, value / sqrt(norm)
153165
154 ### Extraction and views166 ### Extraction and views
155 def normalized(self, mode=0):
156 return NormalizedView(self.tensor, mode)
157
158 def unnormalized(self):167 def unnormalized(self):
159 return self.tensor168 return self.tensor
160169
@@ -163,19 +172,54 @@
163 return NormalizedView(self.tensor, self.modes)172 return NormalizedView(self.tensor, self.modes)
164173
165 def _svd(self, **kw):174 def _svd(self, **kw):
166 if self.normalize_mode == 0:175 if list(self.normalize_modes) == [0]:
167 return self.tensor._svd(row_factors=self.norms[0], **kw)176 return self.tensor._svd(row_factors=self.norms[0], **kw)
168 return super(NormalizedView, self)._svd(**kw)177 return super(NormalizedView, self)._svd(**kw)
169178
170 def _isvd(self, **kw):179 def _isvd(self, **kw):
171 if self.normalize_mode == 0:180 if list(self.normalize_modes) == [0]:
172 return self.tensor._isvd(row_factors=self.norms[0], **kw)181 return self.tensor._isvd(row_factors=self.norms[0], **kw)
173 return super(NormalizedView, self)._isvd(**kw)182 return super(NormalizedView, self)._isvd(**kw)
174183
175 # All other operations fall back to the tensor.184 # All other operations fall back to the tensor.
176185
177186
178class AvgNormalizedView(BaseNormalizedView):187class MeanSubtractedView(BaseNormalizedView):
188 '''Subtracts out the mean of each row and/or column.
189
190 Uses offset parameters to the SVD to compute this efficiently.
191 '''
192 default_modes = 0
193 def refresh_norms(self):
194 self.means = self.tensor.means()
195
196 def __getitem__(self, indices):
197 # FIXME: slices.
198 data = self.tensor[indices]
199 for mode in self.normalize_modes:
200 # not in-place, in case of slicing.
201 data = data - self.means[mode][indices[mode]]
202 return data
203
204 # FIXME: iteritems is incorrect if the tensor is not dense, since
205 # unspecified items will probably be non-zero.
206
207 def _svd(self, **kw):
208 modes = self.normalize_modes
209 if not all(0 <= m <= 1 for m in modes):
210 raise NotImplementedError
211 if 0 in modes:
212 kw['offset_for_row'] = -self.means[0]
213 if 1 in modes:
214 kw['offset_for_col'] = -self.means[1]
215 print kw
216 return self.tensor._svd(**kw)
217
218 def _isvd(self, **kw):
219 raise NotImplementedError
220
221
222class OldAvgNormalizedView(BaseNormalizedView):
179 '''A NormalizedView that makes the average to be zero, instead of using a Euclidean norm.'''223 '''A NormalizedView that makes the average to be zero, instead of using a Euclidean norm.'''
180 def refresh_norms(self):224 def refresh_norms(self):
181 tensor = self.tensor225 tensor = self.tensor
@@ -190,9 +234,6 @@
190 norms[modes.index(mode)][key[mode]][1] += 1234 norms[modes.index(mode)][key[mode]][1] += 1
191 self._norms = norms235 self._norms = norms
192236
193 def update_norm(self, indices, prev, current):
194 raise NotImplementedError
195
196 def __getitem__(self, indices):237 def __getitem__(self, indices):
197 mode = self._normalize_mode238 mode = self._normalize_mode
198 if not isinstance(mode, list): modes = [mode]239 if not isinstance(mode, list): modes = [mode]
@@ -222,7 +263,7 @@
222 '''263 '''
223 self.transposed = transposed # before the super call because264 self.transposed = transposed # before the super call because
224 # super calls refresh_norms.265 # super calls refresh_norms.
225 super(TfIdfView, self).__init__(tensor, 0) # We only support mode 0.266 super(TfIdfView, self).__init__(tensor) # Modes don't really make sense.
226267
227 def __repr__(self):268 def __repr__(self):
228 return 'TfIdfView(%r, transposed=%r)' % (self.tensor, self.transposed)269 return 'TfIdfView(%r, transposed=%r)' % (self.tensor, self.transposed)
@@ -244,9 +285,6 @@
244 counts_for_document[document] += value285 counts_for_document[document] += value
245 num_docs_that_contain_term[term] += 1286 num_docs_that_contain_term[term] += 1
246287
247 def update_norm(self, indices, prev, current):
248 raise NotImplementedError
249
250 def tf(self, term, document):288 def tf(self, term, document):
251 if self.transposed:289 if self.transposed:
252 term_count = self.tensor[document, term]290 term_count = self.tensor[document, term]
253291
=== modified file 'csc/divisi/svd.py'
--- csc/divisi/svd.py 2009-10-29 03:17:08 +0000
+++ csc/divisi/svd.py 2009-11-17 23:59:09 +0000
@@ -172,10 +172,10 @@
172 '''172 '''
173 u = self.weighted_u173 u = self.weighted_u
174 angles = self.u_dotproducts_with(vec)174 angles = self.u_dotproducts_with(vec)
175 vec_magnitude = sqrt(vec*vec)175 vec_magnitude = vec.norm()
176 # Normalize distances to get the cos(angles)176 # Normalize distances to get the cos(angles)
177 for key, value in angles.iteritems():177 for key, value in angles.iteritems():
178 u_vector_magnitude = sqrt(u[key[0], :]*u[key[0], :])178 u_vector_magnitude = self.weighted_u_vec(key[0]).norm()
179 angles[key] = float(value)/(u_vector_magnitude*vec_magnitude)179 angles[key] = float(value)/(u_vector_magnitude*vec_magnitude)
180180
181 return angles181 return angles
182182
=== modified file 'csc/divisi/tensor.py'
--- csc/divisi/tensor.py 2009-09-29 15:49:05 +0000
+++ csc/divisi/tensor.py 2009-11-17 23:59:09 +0000
@@ -15,7 +15,7 @@
15import numpy, sys15import numpy, sys
16from csc.divisi.dict_mixin import MyDictMixin16from csc.divisi.dict_mixin import MyDictMixin
17import copy, random, math17import copy, random, math
18from csc.divisi.exceptions import DimensionMismatch18from csc.divisi.exceptions import DimensionMismatch, InvalidLayeringException
19from csc.divisi._svdlib import svd, dictSvd, isvd, dictIsvd19from csc.divisi._svdlib import svd, dictSvd, isvd, dictIsvd
20from warnings import warn20from warnings import warn
21import logging21import logging
@@ -179,6 +179,20 @@
179 """179 """
180 return cls(self, *a, **kw)180 return cls(self, *a, **kw)
181181
182 def stack_contains(self, cls):
183 '''
184 Check if the tensor stack below here includes an instance of ``cls``.
185
186 You may pass a tuple of classes as well, which will check if
187 the stack contains _any_ of those classes.
188 '''
189 if isinstance(self, cls):
190 return True
191 if hasattr(self, 'tensor'):
192 return self.tensor.stack_contains(cls)
193 else:
194 return False
195
182 def unfolded(self, mode):196 def unfolded(self, mode):
183 """197 """
184 Get an :class:`UnfoldedView <divisi.unfolded_view.UnfoldedView>` of198 Get an :class:`UnfoldedView <divisi.unfolded_view.UnfoldedView>` of
@@ -228,9 +242,9 @@
228 raise TypeError('Unknown normalization parameter %r' % mode)242 raise TypeError('Unknown normalization parameter %r' % mode)
229 243
230244
231 def zero_mean_normalized(self, mode=0):245 def mean_subtracted(self, mode=0):
232 from csc.divisi.normalized_view import ZeroMeanView246 from csc.divisi.normalized_view import MeanSubtractedView
233 return self.add_layer(ZeroMeanView, mode)247 return self.add_layer(MeanSubtractedView, mode)
234248
235 # Math249 # Math
236 def __add__(self, other):250 def __add__(self, other):
@@ -559,6 +573,27 @@
559 else:573 else:
560 return res574 return res
561575
576 def means(self):
577 '''
578 Computes the by-slice means for each dimension.
579
580 Returns numpy arrays, not DenseTensors.
581 '''
582 import numpy as np
583 accumulator_for_mode = [numpy.zeros(n) for n in self.shape]
584 for k, v in self.iteritems():
585 for accumulator, key in izip(accumulator_for_mode, k):
586 accumulator[key] += v
587
588 # Divide by the number of items that could have gone into each
589 # accumulator slot.
590 total_possible_items = np.product(self.shape)
591 for mode, accumulator in enumerate(accumulator_for_mode):
592 possible_items = total_possible_items / self.shape[mode]
593 accumulator /= possible_items
594 return accumulator_for_mode
595
596
562 def label_histograms(self):597 def label_histograms(self):
563 '''598 '''
564 Counts the number and magnitude of items in each row / column599 Counts the number and magnitude of items in each row / column
@@ -577,9 +612,6 @@
577 map(DenseTensor, magnitudes))612 map(DenseTensor, magnitudes))
578613
579614
580class InvalidLayeringException(StandardError):
581 pass
582
583forward_to_tensor = set([615forward_to_tensor = set([
584 'shape', 'ndim', 'has_key', 'default_value', 'density'])616 'shape', 'ndim', 'has_key', 'default_value', 'density'])
585617
586618
=== modified file 'svdlib/_svdlib.c'
--- svdlib/_svdlib.c 2009-08-05 22:25:54 +0000
+++ svdlib/_svdlib.c 2009-11-17 23:59:09 +0000
@@ -1,11 +1,11 @@
1/* Generated by Cython 0.11.2 on Wed Aug 5 18:22:59 2009 */1/* Generated by Cython 0.11.3 on Thu Oct 29 00:14:04 2009 */
22
3#define PY_SSIZE_T_CLEAN3#define PY_SSIZE_T_CLEAN
4#include "Python.h"4#include "Python.h"
5#include "structmember.h"5#include "structmember.h"
6#ifndef Py_PYTHON_H6#ifndef Py_PYTHON_H
7 #error Python headers needed to compile C extensions, please install development version of Python.7 #error Python headers needed to compile C extensions, please install development version of Python.
8#endif8#else
9#ifndef PY_LONG_LONG9#ifndef PY_LONG_LONG
10 #define PY_LONG_LONG LONG_LONG10 #define PY_LONG_LONG LONG_LONG
11#endif11#endif
@@ -133,10 +133,12 @@
133#include <math.h>133#include <math.h>
134#define __PYX_HAVE_API__svdlib___svdlib134#define __PYX_HAVE_API__svdlib___svdlib
135#include "stdlib.h"135#include "stdlib.h"
136#include "stdio.h"
136#include "numpy/arrayobject.h"137#include "numpy/arrayobject.h"
137#include "svdlib.h"138#include "svdlib.h"
138#include "svdwrapper.h"139#include "svdwrapper.h"
139#include "math.h"140#include "math.h"
141#include "svdutil.h"
140#define __PYX_USE_C99_COMPLEX defined(_Complex_I)142#define __PYX_USE_C99_COMPLEX defined(_Complex_I)
141143
142144
@@ -167,6 +169,9 @@
167#define __Pyx_PyBytes_AsString PyBytes_AsString169#define __Pyx_PyBytes_AsString PyBytes_AsString
168#endif170#endif
169171
172#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s)
173#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) __Pyx_PyBytes_AsString(s))
174
170#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))175#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
171static INLINE int __Pyx_PyObject_IsTrue(PyObject*);176static INLINE int __Pyx_PyObject_IsTrue(PyObject*);
172static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);177static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
@@ -186,6 +191,40 @@
186#endif191#endif
187#endif192#endif
188193
194
195#if !defined(T_ULONGLONG)
196#define __Pyx_T_UNSIGNED_INT(x) \
197 ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
198 ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
199 ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
200 ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1))))
201#else
202#define __Pyx_T_UNSIGNED_INT(x) \
203 ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
204 ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
205 ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
206 ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \
207 ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
208#endif
209#if !defined(T_LONGLONG)
210#define __Pyx_T_SIGNED_INT(x) \
211 ((sizeof(x) == sizeof(char)) ? T_BYTE : \
212 ((sizeof(x) == sizeof(short)) ? T_SHORT : \
213 ((sizeof(x) == sizeof(int)) ? T_INT : \
214 ((sizeof(x) == sizeof(long)) ? T_LONG : -1))))
215#else
216#define __Pyx_T_SIGNED_INT(x) \
217 ((sizeof(x) == sizeof(char)) ? T_BYTE : \
218 ((sizeof(x) == sizeof(short)) ? T_SHORT : \
219 ((sizeof(x) == sizeof(int)) ? T_INT : \
220 ((sizeof(x) == sizeof(long)) ? T_LONG : \
221 ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))))
222#endif
223
224#define __Pyx_T_FLOATING(x) \
225 ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
226 ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
227
189#if !defined(T_SIZET)228#if !defined(T_SIZET)
190#if !defined(T_ULONGLONG)229#if !defined(T_ULONGLONG)
191#define T_SIZET \230#define T_SIZET \
@@ -223,6 +262,7 @@
223static PyObject *__pyx_m;262static PyObject *__pyx_m;
224static PyObject *__pyx_b;263static PyObject *__pyx_b;
225static PyObject *__pyx_empty_tuple;264static PyObject *__pyx_empty_tuple;
265static PyObject *__pyx_empty_bytes;
226static int __pyx_lineno;266static int __pyx_lineno;
227static int __pyx_clineno = 0;267static int __pyx_clineno = 0;
228static const char * __pyx_cfilenm= __FILE__;268static const char * __pyx_cfilenm= __FILE__;
@@ -268,6 +308,64 @@
268308
269static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/309static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/
270310
311static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
312
313/* Run-time type information about structs used with buffers */
314struct __Pyx_StructField_;
315
316typedef struct {
317 const char* name; /* for error messages only */
318 struct __Pyx_StructField_* fields;
319 size_t size; /* sizeof(type) */
320 char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
321} __Pyx_TypeInfo;
322
323typedef struct __Pyx_StructField_ {
324 __Pyx_TypeInfo* type;
325 const char* name;
326 size_t offset;
327} __Pyx_StructField;
328
329typedef struct {
330 __Pyx_StructField* field;
331 size_t parent_offset;
332} __Pyx_BufFmt_StackElem;
333
334
335static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
336static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
337
338static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
339static void __Pyx_RaiseBufferIndexError(int axis); /*proto*/
340#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
341
342#define __Pyx_SetItemInt(o, i, v, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
343 __Pyx_SetItemInt_Fast(o, i, v, size <= sizeof(long)) : \
344 __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
345
346static INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
347 int r;
348 if (!j) return -1;
349 r = PyObject_SetItem(o, j, v);
350 Py_DECREF(j);
351 return r;
352}
353
354static INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int fits_long) {
355 if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
356 Py_INCREF(v);
357 Py_DECREF(PyList_GET_ITEM(o, i));
358 PyList_SET_ITEM(o, i, v);
359 return 1;
360 }
361 else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
362 return PySequence_SetItem(o, i, v);
363 else {
364 PyObject *j = fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i);
365 return __Pyx_SetItemInt_Generic(o, j, v);
366 }
367}
368
271369
272static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {370static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
273 PyObject *r;371 PyObject *r;
@@ -342,36 +440,17 @@
342 return r;440 return r;
343}441}
344442
345static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
346
347/* Run-time type information about structs used with buffers */
348struct __Pyx_StructField_;
349
350typedef struct {
351 const char* name; /* for error messages only */
352 struct __Pyx_StructField_* fields;
353 size_t size; /* sizeof(type) */
354 char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
355} __Pyx_TypeInfo;
356
357typedef struct __Pyx_StructField_ {
358 __Pyx_TypeInfo* type;
359 const char* name;
360 size_t offset;
361} __Pyx_StructField;
362
363typedef struct {
364 __Pyx_StructField* field;
365 size_t parent_offset;
366} __Pyx_BufFmt_StackElem;
367
368
369static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
370static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
371#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1)
372
373static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/443static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
374static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/444static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
445#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1)
446
447static INLINE void __Pyx_RaiseNoneNotIterableError(void);
448
449static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
450
451static INLINE void __Pyx_RaiseTooManyValuesError(void);
452
453static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
375#if PY_MAJOR_VERSION < 3454#if PY_MAJOR_VERSION < 3
376static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);455static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
377static void __Pyx_ReleaseBuffer(Py_buffer *view);456static void __Pyx_ReleaseBuffer(Py_buffer *view);
@@ -389,10 +468,6 @@
389468
390static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/469static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
391470
392static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
393
394static INLINE void __Pyx_RaiseTooManyValuesError(void);
395
396static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/471static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
397static int __Pyx_EndUnpack(PyObject *); /*proto*/472static int __Pyx_EndUnpack(PyObject *); /*proto*/
398473
@@ -618,8 +693,6 @@
618693
619#endif694#endif
620695
621static INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
622
623static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);696static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
624697
625static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);698static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
@@ -684,9 +757,9 @@
684757
685typedef npy_float64 __pyx_t_5numpy_float64_t;758typedef npy_float64 __pyx_t_5numpy_float64_t;
686759
687typedef npy_complex64 __pyx_t_5numpy_complex64_t;760typedef __pyx_t_float_complex __pyx_t_5numpy_complex64_t;
688761
689typedef npy_complex128 __pyx_t_5numpy_complex128_t;762typedef __pyx_t_double_complex __pyx_t_5numpy_complex128_t;
690763
691typedef npy_long __pyx_t_5numpy_int_t;764typedef npy_long __pyx_t_5numpy_int_t;
692765
@@ -710,35 +783,62 @@
710783
711typedef npy_cdouble __pyx_t_5numpy_complex_t;784typedef npy_cdouble __pyx_t_5numpy_complex_t;
712785
713typedef __pyx_t_5numpy_float_t __pyx_t_6svdlib_7_svdlib_DTYPE_t;786typedef __pyx_t_5numpy_float64_t __pyx_t_6svdlib_7_svdlib_DTYPE_t;
714787
715/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":130788/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
716 * ###### Python functions ######789 * self.offset_for_col = offset_for_col
790 *
791 * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
792 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
793 * cdef long row, col, index, cols, col_len, rowk
794 */
795
796struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack {
797 int __pyx_n;
798 PyObject *row_norms;
799};
800
801/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
802 * return temp
803 *
804 * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
805 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
806 * if row_norms is None:
807 */
808
809struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack {
810 int __pyx_n;
811 PyObject *row_norms;
812};
813
814/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":74
815 *
717 * 816 *
718 * cdef class CSCMatrix: # <<<<<<<<<<<<<<817 * cdef class CSCMatrix: # <<<<<<<<<<<<<<
719 * __slots__ = ['cmatrix']
720 * cdef object tensor #holds our Python tensor818 * cdef object tensor #holds our Python tensor
819 * cdef object offset_for_row, offset_for_col
721 */820 */
722821
723struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix {822struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix {
724 PyObject_HEAD823 PyObject_HEAD
725 struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtab;824 struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtab;
726 PyObject *tensor;825 PyObject *tensor;
727 PyObject *row_factors;826 PyObject *offset_for_row;
827 PyObject *offset_for_col;
728 struct smat *cmatrix;828 struct smat *cmatrix;
729 struct svdrec *svdrec;
730 int transposed;829 int transposed;
731 int rows;830 long rows;
732 int cols;831 long cols;
733 int nonZero;832 long nonZero;
734};833};
735834
736835
737struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix {836struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix {
738 PyObject *(*pack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch);837 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);
739 PyObject *(*dictPack)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int __pyx_skip_dispatch);838 double *(*toVector)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, PyObject *);
839 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);
740 void (*setColumnSize)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int);840 void (*setColumnSize)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int);
741 void (*setValue)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int, float);841 void (*setValue)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int, double);
742 PyObject *(*svdA)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int __pyx_skip_dispatch);842 PyObject *(*svdA)(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *, int, int __pyx_skip_dispatch);
743};843};
744static struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtabptr_6svdlib_7_svdlib_CSCMatrix;844static struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *__pyx_vtabptr_6svdlib_7_svdlib_CSCMatrix;
@@ -748,11 +848,15 @@
748848
749/* Module declarations from stdlib */849/* Module declarations from stdlib */
750850
851/* Module declarations from stdio */
852
751/* Module declarations from numpy */853/* Module declarations from numpy */
752854
753/* Module declarations from numpy */855/* Module declarations from numpy */
754856
755static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;857static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
858static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
859static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
756static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;860static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
757static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/861static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
758/* Module declarations from svdlib._svdlib */862/* Module declarations from svdlib._svdlib */
@@ -768,12 +872,8 @@
768static PyObject *__pyx_int_50;872static PyObject *__pyx_int_50;
769static PyObject *__pyx_int_100;873static PyObject *__pyx_int_100;
770static PyObject *__pyx_int_2;874static PyObject *__pyx_int_2;
771static PyObject *__pyx_int_0;
772static PyObject *__pyx_int_1;
773static char __pyx_k___main__[] = "__main__";875static char __pyx_k___main__[] = "__main__";
774static PyObject *__pyx_kp___main__;876static PyObject *__pyx_kp___main__;
775static char __pyx_k___slots__[] = "__slots__";
776static PyObject *__pyx_kp___slots__;
777static char __pyx_k___init__[] = "__init__";877static char __pyx_k___init__[] = "__init__";
778static PyObject *__pyx_kp___init__;878static PyObject *__pyx_kp___init__;
779static char __pyx_k_pack[] = "pack";879static char __pyx_k_pack[] = "pack";
@@ -790,8 +890,12 @@
790static PyObject *__pyx_kp_isvd;890static PyObject *__pyx_kp_isvd;
791static char __pyx_k_pyTensor[] = "pyTensor";891static char __pyx_k_pyTensor[] = "pyTensor";
792static PyObject *__pyx_kp_pyTensor;892static PyObject *__pyx_kp_pyTensor;
793static char __pyx_k_row_factors[] = "row_factors";893static char __pyx_k_offset_for_row[] = "offset_for_row";
794static PyObject *__pyx_kp_row_factors;894static PyObject *__pyx_kp_offset_for_row;
895static char __pyx_k_offset_for_col[] = "offset_for_col";
896static PyObject *__pyx_kp_offset_for_col;
897static char __pyx_k_row_norms[] = "row_norms";
898static PyObject *__pyx_kp_row_norms;
795static char __pyx_k_k[] = "k";899static char __pyx_k_k[] = "k";
796static PyObject *__pyx_kp_k;900static PyObject *__pyx_kp_k;
797static char __pyx_k_niter[] = "niter";901static char __pyx_k_niter[] = "niter";
@@ -800,24 +904,34 @@
800static PyObject *__pyx_kp_lrate;904static PyObject *__pyx_kp_lrate;
801static char __pyx_k_tensor[] = "tensor";905static char __pyx_k_tensor[] = "tensor";
802static PyObject *__pyx_kp_tensor;906static PyObject *__pyx_kp_tensor;
907static char __pyx_k_row_factors[] = "row_factors";
908static PyObject *__pyx_kp_row_factors;
803static char __pyx_k_warnings[] = "warnings";909static char __pyx_k_warnings[] = "warnings";
804static PyObject *__pyx_kp_warnings;910static PyObject *__pyx_kp_warnings;
805static char __pyx_k_numpy[] = "numpy";911static char __pyx_k_numpy[] = "numpy";
806static PyObject *__pyx_kp_numpy;912static PyObject *__pyx_kp_numpy;
807static char __pyx_k_np[] = "np";913static char __pyx_k_np[] = "np";
808static PyObject *__pyx_kp_np;914static PyObject *__pyx_kp_np;
809static char __pyx_k_float[] = "float";915static char __pyx_k_31[] = "float64";
810static PyObject *__pyx_kp_float;916static PyObject *__pyx_kp_31;
811static char __pyx_k_DTYPE[] = "DTYPE";917static char __pyx_k_DTYPE[] = "DTYPE";
812static PyObject *__pyx_kp_DTYPE;918static PyObject *__pyx_kp_DTYPE;
813static char __pyx_k_31[] = "cmatrix";
814static PyObject *__pyx_kp_31;
815static char __pyx_k_ndim[] = "ndim";919static char __pyx_k_ndim[] = "ndim";
816static PyObject *__pyx_kp_ndim;920static PyObject *__pyx_kp_ndim;
817static char __pyx_k_ValueError[] = "ValueError";921static char __pyx_k_ValueError[] = "ValueError";
818static PyObject *__pyx_kp_ValueError;922static PyObject *__pyx_kp_ValueError;
819static char __pyx_k_shape[] = "shape";923static char __pyx_k_shape[] = "shape";
820static PyObject *__pyx_kp_shape;924static PyObject *__pyx_kp_shape;
925static char __pyx_k_ones[] = "ones";
926static PyObject *__pyx_kp_ones;
927static char __pyx_k_reciprocal[] = "reciprocal";
928static PyObject *__pyx_kp_reciprocal;
929static char __pyx_k_sqrt[] = "sqrt";
930static PyObject *__pyx_kp_sqrt;
931static char __pyx_k_array[] = "array";
932static PyObject *__pyx_kp_array;
933static char __pyx_k_dtype[] = "dtype";
934static PyObject *__pyx_kp_dtype;
821static char __pyx_k_iteritems[] = "iteritems";935static char __pyx_k_iteritems[] = "iteritems";
822static PyObject *__pyx_kp_iteritems;936static PyObject *__pyx_kp_iteritems;
823static char __pyx_k_setdefault[] = "setdefault";937static char __pyx_k_setdefault[] = "setdefault";
@@ -830,24 +944,20 @@
830static PyObject *__pyx_kp_sorted;944static PyObject *__pyx_kp_sorted;
831static char __pyx_k_keys[] = "keys";945static char __pyx_k_keys[] = "keys";
832static PyObject *__pyx_kp_keys;946static PyObject *__pyx_kp_keys;
947static char __pyx_k_range[] = "range";
948static PyObject *__pyx_kp_range;
833static char __pyx_k__data[] = "_data";949static char __pyx_k__data[] = "_data";
834static PyObject *__pyx_kp__data;950static PyObject *__pyx_kp__data;
835static char __pyx_k_warn[] = "warn";951static char __pyx_k_warn[] = "warn";
836static PyObject *__pyx_kp_warn;952static PyObject *__pyx_kp_warn;
837static char __pyx_k_38[] = "csc.divisi.tensor";953static char __pyx_k_39[] = "csc.divisi.tensor";
838static PyObject *__pyx_kp_38;954static PyObject *__pyx_kp_39;
839static char __pyx_k_DenseTensor[] = "DenseTensor";955static char __pyx_k_DenseTensor[] = "DenseTensor";
840static PyObject *__pyx_kp_DenseTensor;956static PyObject *__pyx_kp_DenseTensor;
841static char __pyx_k_add[] = "add";957static char __pyx_k_add[] = "add";
842static PyObject *__pyx_kp_add;958static PyObject *__pyx_kp_add;
843static char __pyx_k_zeros[] = "zeros";959static char __pyx_k_zeros[] = "zeros";
844static PyObject *__pyx_kp_zeros;960static PyObject *__pyx_kp_zeros;
845static char __pyx_k_dtype[] = "dtype";
846static PyObject *__pyx_kp_dtype;
847static char __pyx_k_range[] = "range";
848static PyObject *__pyx_kp_range;
849static char __pyx_k_sqrt[] = "sqrt";
850static PyObject *__pyx_kp_sqrt;
851static char __pyx_k_reduce[] = "reduce";961static char __pyx_k_reduce[] = "reduce";
852static PyObject *__pyx_kp_reduce;962static PyObject *__pyx_kp_reduce;
853static char __pyx_k_multiply[] = "multiply";963static char __pyx_k_multiply[] = "multiply";
@@ -860,18 +970,19 @@
860static PyObject *__pyx_builtin_range;970static PyObject *__pyx_builtin_range;
861static PyObject *__pyx_kp_34;971static PyObject *__pyx_kp_34;
862static char __pyx_k_34[] = "You can only pack a 2 dimensional tensor";972static char __pyx_k_34[] = "You can only pack a 2 dimensional tensor";
863static PyObject *__pyx_kp_35;973static char __pyx_k_35[] = "toVector";
864static char __pyx_k_35[] = "<CSCMatrix>";
865static PyObject *__pyx_kp_36;974static PyObject *__pyx_kp_36;
866static char __pyx_k_36[] = "Column %d is empty";975static char __pyx_k_36[] = "<CSCMatrix>";
867static PyObject *__pyx_kp_37;976static PyObject *__pyx_kp_37;
868static char __pyx_k_37[] = "Matrix has zero value (row %d, index %d)";977static char __pyx_k_37[] = "Column %d is empty";
869static PyObject *__pyx_kp_39;978static PyObject *__pyx_kp_38;
979static char __pyx_k_38[] = "Matrix has zero value (row %d, index %d)";
870static PyObject *__pyx_kp_40;980static PyObject *__pyx_kp_40;
871static PyObject *__pyx_kp_41;981static PyObject *__pyx_kp_41;
872static char __pyx_k_39[] = "COMPUTING INCREMENTAL SVD";982static PyObject *__pyx_kp_42;
873static char __pyx_k_40[] = "ROWS: %d, COLUMNS: %d, VALS: %d";983static char __pyx_k_40[] = "COMPUTING INCREMENTAL SVD";
874static char __pyx_k_41[] = "K: %d, LEARNING_RATE: %r, ITERATIONS: %d";984static char __pyx_k_41[] = "ROWS: %d, COLUMNS: %d, VALS: %d";
985static char __pyx_k_42[] = "K: %d, LEARNING_RATE: %r, ITERATIONS: %d";
875static PyObject *__pyx_int_15;986static PyObject *__pyx_int_15;
876static char __pyx_k___getbuffer__[] = "__getbuffer__";987static char __pyx_k___getbuffer__[] = "__getbuffer__";
877static PyObject *__pyx_kp___getbuffer__;988static PyObject *__pyx_kp___getbuffer__;
@@ -881,8 +992,6 @@
881static PyObject *__pyx_kp_info;992static PyObject *__pyx_kp_info;
882static char __pyx_k_flags[] = "flags";993static char __pyx_k_flags[] = "flags";
883static PyObject *__pyx_kp_flags;994static PyObject *__pyx_kp_flags;
884static char __pyx_k_itervalues[] = "itervalues";
885static PyObject *__pyx_kp_itervalues;
886static char __pyx_k_RuntimeError[] = "RuntimeError";995static char __pyx_k_RuntimeError[] = "RuntimeError";
887static PyObject *__pyx_kp_RuntimeError;996static PyObject *__pyx_kp_RuntimeError;
888static PyObject *__pyx_kp_1;997static PyObject *__pyx_kp_1;
@@ -925,34 +1034,37 @@
925static char __pyx_k_29[] = "Format string allocated too short.";1034static char __pyx_k_29[] = "Format string allocated too short.";
926static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";1035static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
9271036
928/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1391037/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":81
929 * cdef int rows, cols1038 * cdef long rows, cols
930 * cdef int nonZero #number of non zero entries in matrix1039 * cdef long nonZero #number of non zero entries in matrix
931 * def __init__(self, pyTensor, row_factors=None): # <<<<<<<<<<<<<<1040 * def __init__(self, pyTensor, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
932 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing1041 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing
933 * #the row _factors to divide by1042 * #the row_factors to divide by
934 */1043 */
9351044
936static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/1045static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
937static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {1046static int __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
938 PyObject *__pyx_v_pyTensor = 0;1047 PyObject *__pyx_v_pyTensor = 0;
939 PyObject *__pyx_v_row_factors = 0;1048 PyObject *__pyx_v_offset_for_row = 0;
1049 PyObject *__pyx_v_offset_for_col = 0;
940 int __pyx_r;1050 int __pyx_r;
941 PyObject *__pyx_1 = 0;1051 PyObject *__pyx_1 = 0;
942 PyObject *__pyx_2 = 0;1052 PyObject *__pyx_2 = 0;
943 PyObject *__pyx_t_1 = NULL;1053 PyObject *__pyx_t_1 = NULL;
944 PyObject *__pyx_t_2 = NULL;1054 PyObject *__pyx_t_2 = NULL;
945 int __pyx_t_3;1055 int __pyx_t_3;
946 int __pyx_t_4;1056 long __pyx_t_4;
947 int __pyx_t_5;1057 long __pyx_t_5;
948 Py_ssize_t __pyx_t_6;1058 Py_ssize_t __pyx_t_6;
949 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_pyTensor,&__pyx_kp_row_factors,0};1059 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_pyTensor,&__pyx_kp_offset_for_row,&__pyx_kp_offset_for_col,0};
950 __Pyx_SetupRefcountContext("__init__");1060 __Pyx_SetupRefcountContext("__init__");
951 if (unlikely(__pyx_kwds)) {1061 if (unlikely(__pyx_kwds)) {
952 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);1062 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
953 PyObject* values[2] = {0,0};1063 PyObject* values[3] = {0,0,0};
954 values[1] = Py_None;1064 values[1] = Py_None;
1065 values[2] = Py_None;
955 switch (PyTuple_GET_SIZE(__pyx_args)) {1066 switch (PyTuple_GET_SIZE(__pyx_args)) {
1067 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
956 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);1068 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
957 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);1069 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
958 case 0: break;1070 case 0: break;
@@ -965,19 +1077,27 @@
965 else goto __pyx_L5_argtuple_error;1077 else goto __pyx_L5_argtuple_error;
966 case 1:1078 case 1:
967 if (kw_args > 1) {1079 if (kw_args > 1) {
968 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);1080 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
969 if (unlikely(value)) { values[1] = value; kw_args--; }1081 if (unlikely(value)) { values[1] = value; kw_args--; }
970 }1082 }
1083 case 2:
1084 if (kw_args > 1) {
1085 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
1086 if (unlikely(value)) { values[2] = value; kw_args--; }
1087 }
971 }1088 }
972 if (unlikely(kw_args > 0)) {1089 if (unlikely(kw_args > 0)) {
973 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;}1090 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;}
974 }1091 }
975 __pyx_v_pyTensor = values[0];1092 __pyx_v_pyTensor = values[0];
976 __pyx_v_row_factors = values[1];1093 __pyx_v_offset_for_row = values[1];
1094 __pyx_v_offset_for_col = values[2];
977 } else {1095 } else {
978 __pyx_v_row_factors = Py_None;1096 __pyx_v_offset_for_row = Py_None;
1097 __pyx_v_offset_for_col = Py_None;
979 switch (PyTuple_GET_SIZE(__pyx_args)) {1098 switch (PyTuple_GET_SIZE(__pyx_args)) {
980 case 2: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 1);1099 case 3: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 2);
1100 case 2: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 1);
981 case 1: __pyx_v_pyTensor = PyTuple_GET_ITEM(__pyx_args, 0);1101 case 1: __pyx_v_pyTensor = PyTuple_GET_ITEM(__pyx_args, 0);
982 break;1102 break;
983 default: goto __pyx_L5_argtuple_error;1103 default: goto __pyx_L5_argtuple_error;
@@ -985,15 +1105,15 @@
985 }1105 }
986 goto __pyx_L4_argument_unpacking_done;1106 goto __pyx_L4_argument_unpacking_done;
987 __pyx_L5_argtuple_error:;1107 __pyx_L5_argtuple_error:;
988 __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;}1108 __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;}
989 __pyx_L3_error:;1109 __pyx_L3_error:;
990 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.__init__");1110 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.__init__");
991 return -1;1111 return -1;
992 __pyx_L4_argument_unpacking_done:;1112 __pyx_L4_argument_unpacking_done:;
9931113
994 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1421114 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":84
995 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing1115 * #init function takes 1 or 2 arguments, the Python tensor, and an array representing
996 * #the row _factors to divide by1116 * #the row_factors to divide by
997 * self.tensor = pyTensor # <<<<<<<<<<<<<<1117 * self.tensor = pyTensor # <<<<<<<<<<<<<<
998 * self.transposed = 01118 * self.transposed = 0
999 * 1119 *
@@ -1004,8 +1124,8 @@
1004 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor);1124 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor);
1005 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor = __pyx_v_pyTensor;1125 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->tensor = __pyx_v_pyTensor;
10061126
1007 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1431127 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":85
1008 * #the row _factors to divide by1128 * #the row_factors to divide by
1009 * self.tensor = pyTensor1129 * self.tensor = pyTensor
1010 * self.transposed = 0 # <<<<<<<<<<<<<<1130 * self.transposed = 0 # <<<<<<<<<<<<<<
1011 * 1131 *
@@ -1013,118 +1133,131 @@
1013 */1133 */
1014 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed = 0;1134 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed = 0;
10151135
1016 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1451136 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":87
1017 * self.transposed = 01137 * self.transposed = 0
1018 * 1138 *
1019 * if self.tensor.ndim != 2: # <<<<<<<<<<<<<<1139 * if self.tensor.ndim != 2: # <<<<<<<<<<<<<<
1020 * raise ValueError("You can only pack a 2 dimensional tensor")1140 * raise ValueError("You can only pack a 2 dimensional tensor")
1021 * self.rows, self.cols = self.tensor.shape1141 * self.rows, self.cols = self.tensor.shape
1022 */1142 */
1023 __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;}1143 __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;}
1024 __Pyx_GOTREF(__pyx_t_1);1144 __Pyx_GOTREF(__pyx_t_1);
1025 __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;}1145 __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;}
1026 __Pyx_GOTREF(__pyx_t_2);1146 __Pyx_GOTREF(__pyx_t_2);
1027 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1147 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1028 __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;}1148 __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;}
1029 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;1149 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1030 if (__pyx_t_3) {1150 if (__pyx_t_3) {
10311151
1032 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1461152 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":88
1033 * 1153 *
1034 * if self.tensor.ndim != 2:1154 * if self.tensor.ndim != 2:
1035 * raise ValueError("You can only pack a 2 dimensional tensor") # <<<<<<<<<<<<<<1155 * raise ValueError("You can only pack a 2 dimensional tensor") # <<<<<<<<<<<<<<
1036 * self.rows, self.cols = self.tensor.shape1156 * self.rows, self.cols = self.tensor.shape
1037 * self.nonZero = len(self.tensor)1157 * self.nonZero = len(self.tensor)
1038 */1158 */
1039 __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;}1159 __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;}
1040 __Pyx_GOTREF(((PyObject *)__pyx_t_2));1160 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
1041 __Pyx_INCREF(__pyx_kp_34);1161 __Pyx_INCREF(__pyx_kp_34);
1042 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_34);1162 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_34);
1043 __Pyx_GIVEREF(__pyx_kp_34);1163 __Pyx_GIVEREF(__pyx_kp_34);
1044 __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;}1164 __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;}
1045 __Pyx_GOTREF(__pyx_t_1);1165 __Pyx_GOTREF(__pyx_t_1);
1046 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;1166 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1047 __Pyx_Raise(__pyx_t_1, 0, 0);1167 __Pyx_Raise(__pyx_t_1, 0, 0);
1048 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1168 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1049 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1169 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1050 goto __pyx_L6;1170 goto __pyx_L6;
1051 }1171 }
1052 __pyx_L6:;1172 __pyx_L6:;
10531173
1054 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1471174 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":89
1055 * if self.tensor.ndim != 2:1175 * if self.tensor.ndim != 2:
1056 * raise ValueError("You can only pack a 2 dimensional tensor")1176 * raise ValueError("You can only pack a 2 dimensional tensor")
1057 * self.rows, self.cols = self.tensor.shape # <<<<<<<<<<<<<<1177 * self.rows, self.cols = self.tensor.shape # <<<<<<<<<<<<<<
1058 * self.nonZero = len(self.tensor)1178 * self.nonZero = len(self.tensor)
1059 * assert self.nonZero != 01179 * assert self.nonZero != 0
1060 */1180 */
1061 __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;}1181 __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;}
1062 __Pyx_GOTREF(__pyx_t_1);1182 __Pyx_GOTREF(__pyx_t_1);
1063 if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 2)) {1183 if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 2)) {
1064 PyObject* tuple = __pyx_t_1;1184 PyObject* tuple = __pyx_t_1;
1065 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);1185 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);
1066 __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;}1186 __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;}
1067 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1187 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1068 __pyx_2 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_2);1188 __pyx_2 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_2);
1069 __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;}1189 __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;}
1070 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1190 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1071 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1191 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1072 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_4;1192 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_4;
1073 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_5;1193 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_5;
1074 } else {1194 } else {
1075 __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;}1195 __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;}
1076 __Pyx_GOTREF(__pyx_1);1196 __Pyx_GOTREF(__pyx_1);
1077 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1197 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1078 __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;}1198 __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;}
1079 __Pyx_GOTREF(__pyx_2);1199 __Pyx_GOTREF(__pyx_2);
1080 __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;}1200 __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;}
1081 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1201 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1082 __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;}1202 __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;}
1083 __Pyx_GOTREF(__pyx_2);1203 __Pyx_GOTREF(__pyx_2);
1084 __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;}1204 __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;}
1085 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1205 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1086 if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1206 if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1087 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;1207 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1088 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_5;1208 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->rows = __pyx_t_5;
1089 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_4;1209 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cols = __pyx_t_4;
1090 }1210 }
10911211
1092 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1481212 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":90
1093 * raise ValueError("You can only pack a 2 dimensional tensor")1213 * raise ValueError("You can only pack a 2 dimensional tensor")
1094 * self.rows, self.cols = self.tensor.shape1214 * self.rows, self.cols = self.tensor.shape
1095 * self.nonZero = len(self.tensor) # <<<<<<<<<<<<<<1215 * self.nonZero = len(self.tensor) # <<<<<<<<<<<<<<
1096 * assert self.nonZero != 01216 * assert self.nonZero != 0
1097 * 1217 *
1098 */1218 */
1099 __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;}1219 __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;}
1100 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero = __pyx_t_6;1220 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero = __pyx_t_6;
11011221
1102 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1491222 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":91
1103 * self.rows, self.cols = self.tensor.shape1223 * self.rows, self.cols = self.tensor.shape
1104 * self.nonZero = len(self.tensor)1224 * self.nonZero = len(self.tensor)
1105 * assert self.nonZero != 0 # <<<<<<<<<<<<<<1225 * assert self.nonZero != 0 # <<<<<<<<<<<<<<
1106 * 1226 *
1107 * self.row_factors = row_factors1227 * self.offset_for_row = offset_for_row
1108 */1228 */
1109 #ifndef PYREX_WITHOUT_ASSERTIONS1229 #ifndef PYREX_WITHOUT_ASSERTIONS
1110 if (unlikely(!(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero != 0))) {1230 if (unlikely(!(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->nonZero != 0))) {
1111 PyErr_SetNone(PyExc_AssertionError);1231 PyErr_SetNone(PyExc_AssertionError);
1112 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1232 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1113 }1233 }
1114 #endif1234 #endif
11151235
1116 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1511236 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":93
1117 * assert self.nonZero != 01237 * assert self.nonZero != 0
1118 * 1238 *
1119 * self.row_factors = row_factors # <<<<<<<<<<<<<<1239 * self.offset_for_row = offset_for_row # <<<<<<<<<<<<<<
1120 * 1240 * self.offset_for_col = offset_for_col
1121 * cpdef pack(self):1241 *
1122 */1242 */
1123 __Pyx_INCREF(__pyx_v_row_factors);1243 __Pyx_INCREF(__pyx_v_offset_for_row);
1124 __Pyx_GIVEREF(__pyx_v_row_factors);1244 __Pyx_GIVEREF(__pyx_v_offset_for_row);
1125 __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors);1245 __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row);
1126 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors);1246 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row);
1127 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->row_factors = __pyx_v_row_factors;1247 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_row = __pyx_v_offset_for_row;
1248
1249 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":94
1250 *
1251 * self.offset_for_row = offset_for_row
1252 * self.offset_for_col = offset_for_col # <<<<<<<<<<<<<<
1253 *
1254 * cpdef pack(self, row_norms=None):
1255 */
1256 __Pyx_INCREF(__pyx_v_offset_for_col);
1257 __Pyx_GIVEREF(__pyx_v_offset_for_col);
1258 __Pyx_GOTREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col);
1259 __Pyx_DECREF(((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col);
1260 ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->offset_for_col = __pyx_v_offset_for_col;
11281261
1129 __pyx_r = 0;1262 __pyx_r = 0;
1130 goto __pyx_L0;1263 goto __pyx_L0;
@@ -1140,82 +1273,236 @@
1140 return __pyx_r;1273 return __pyx_r;
1141}1274}
11421275
1143/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1531276/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
1144 * self.row_factors = row_factors1277 * self.offset_for_col = offset_for_col
1145 * 1278 *
1146 * cpdef pack(self): # <<<<<<<<<<<<<<1279 * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
1147 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)1280 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
1148 * self.transposed = 01281 * cdef long row, col, index, cols, col_len, rowk
1149 */1282 */
11501283
1151static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/1284static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
1152static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_pack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch) {1285static 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) {
1286 PyObject *__pyx_v_row_norms = Py_None;
1287 PyArrayObject *__pyx_v_row_factors;
1288 long __pyx_v_row;
1289 long __pyx_v_col;
1290 long __pyx_v_index;
1291 long __pyx_v_cols;
1292 long __pyx_v_col_len;
1293 long __pyx_v_rowk;
1294 double __pyx_v_value;
1153 PyObject *__pyx_v_columnDict;1295 PyObject *__pyx_v_columnDict;
1154 PyObject *__pyx_v_cols;1296 Py_buffer __pyx_bstruct_row_factors;
1155 PyObject *__pyx_v_row;1297 Py_ssize_t __pyx_bstride_0_row_factors = 0;
1156 PyObject *__pyx_v_column;1298 Py_ssize_t __pyx_bshape_0_row_factors = 0;
1157 PyObject *__pyx_v_value;
1158 PyObject *__pyx_v_index;
1159 PyObject *__pyx_v_colnum;
1160 PyObject *__pyx_v_col_len;
1161 PyObject *__pyx_v_rowk;
1162 PyObject *__pyx_r = NULL;1299 PyObject *__pyx_r = NULL;
1163 PyObject *__pyx_1 = 0;1300 PyObject *__pyx_1 = 0;
1164 PyObject *__pyx_2 = 0;1301 PyObject *__pyx_2 = 0;
1165 PyObject *__pyx_3 = 0;1302 PyObject *__pyx_3 = 0;
1166 PyObject *__pyx_4 = 0;1303 PyObject *__pyx_4 = 0;
1167 PyObject *__pyx_5 = 0;
1168 PyObject *__pyx_6 = 0;
1169 PyObject *__pyx_t_1 = NULL;1304 PyObject *__pyx_t_1 = NULL;
1170 Py_ssize_t __pyx_t_2;1305 PyObject *__pyx_t_2 = NULL;
1171 PyObject *__pyx_t_3 = NULL;1306 int __pyx_t_3;
1172 int __pyx_t_4;1307 PyObject *__pyx_t_4 = NULL;
1173 double __pyx_t_5;1308 PyArrayObject *__pyx_t_5 = NULL;
1174 PyObject *__pyx_t_6 = NULL;1309 int __pyx_t_6;
1175 PyObject *__pyx_t_7 = NULL;1310 PyObject *__pyx_t_7 = NULL;
1176 Py_ssize_t __pyx_t_8;1311 PyObject *__pyx_t_8 = NULL;
1177 int __pyx_t_9;1312 PyObject *__pyx_t_9 = NULL;
1178 int __pyx_t_10;1313 PyObject *__pyx_t_10 = NULL;
1179 float __pyx_t_11;1314 PyObject *__pyx_t_11 = NULL;
1315 Py_ssize_t __pyx_t_12;
1316 double __pyx_t_13;
1317 long __pyx_t_14;
1318 long __pyx_t_15;
1319 long __pyx_t_16;
1180 __Pyx_SetupRefcountContext("pack");1320 __Pyx_SetupRefcountContext("pack");
1321 if (__pyx_optional_args) {
1322 if (__pyx_optional_args->__pyx_n > 0) {
1323 __pyx_v_row_norms = __pyx_optional_args->row_norms;
1324 }
1325 }
1326 __pyx_v_row_factors = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None);
1181 __pyx_v_columnDict = Py_None; __Pyx_INCREF(Py_None);1327 __pyx_v_columnDict = Py_None; __Pyx_INCREF(Py_None);
1182 __pyx_v_cols = Py_None; __Pyx_INCREF(Py_None);1328 __pyx_bstruct_row_factors.buf = NULL;
1183 __pyx_v_row = Py_None; __Pyx_INCREF(Py_None);
1184 __pyx_v_column = Py_None; __Pyx_INCREF(Py_None);
1185 __pyx_v_value = Py_None; __Pyx_INCREF(Py_None);
1186 __pyx_v_index = Py_None; __Pyx_INCREF(Py_None);
1187 __pyx_v_colnum = Py_None; __Pyx_INCREF(Py_None);
1188 __pyx_v_col_len = Py_None; __Pyx_INCREF(Py_None);
1189 __pyx_v_rowk = Py_None; __Pyx_INCREF(Py_None);
1190 /* Check if called by wrapper */1329 /* Check if called by wrapper */
1191 if (unlikely(__pyx_skip_dispatch)) ;1330 if (unlikely(__pyx_skip_dispatch)) ;
1192 /* Check if overriden in Python */1331 /* Check if overriden in Python */
1193 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {1332 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
1194 __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;}1333 __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;}
1195 __Pyx_GOTREF(__pyx_1);1334 __Pyx_GOTREF(__pyx_1);
1196 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack)) {1335 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack)) {
1197 __Pyx_XDECREF(__pyx_r);1336 __Pyx_XDECREF(__pyx_r);
1198 __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;}1337 __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;}
1199 __Pyx_GOTREF(__pyx_t_1);1338 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
1339 __Pyx_INCREF(__pyx_v_row_norms);
1340 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_norms);
1341 __Pyx_GIVEREF(__pyx_v_row_norms);
1342 __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;}
1343 __Pyx_GOTREF(__pyx_t_2);
1200 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;1344 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1201 __pyx_r = __pyx_t_1;1345 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
1202 __pyx_t_1 = 0;1346 __pyx_r = __pyx_t_2;
1347 __pyx_t_2 = 0;
1203 goto __pyx_L0;1348 goto __pyx_L0;
1204 }1349 }
1205 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;1350 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1206 }1351 }
12071352
1208 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1541353 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":100
1209 * 1354 * cdef long row, col, index, cols, col_len, rowk
1210 * cpdef pack(self):1355 * cdef double value
1356 * if row_norms is None: # <<<<<<<<<<<<<<
1357 * row_factors = np.ones(self.rows)
1358 * else:
1359 */
1360 __pyx_t_3 = (__pyx_v_row_norms == Py_None);
1361 if (__pyx_t_3) {
1362
1363 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":101
1364 * cdef double value
1365 * if row_norms is None:
1366 * row_factors = np.ones(self.rows) # <<<<<<<<<<<<<<
1367 * else:
1368 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
1369 */
1370 __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;}
1371 __Pyx_GOTREF(__pyx_1);
1372 __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;}
1373 __Pyx_GOTREF(__pyx_t_2);
1374 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1375 __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;}
1376 __Pyx_GOTREF(__pyx_t_1);
1377 __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;}
1378 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
1379 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
1380 __Pyx_GIVEREF(__pyx_t_1);
1381 __pyx_t_1 = 0;
1382 __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;}
1383 __Pyx_GOTREF(__pyx_t_1);
1384 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1385 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
1386 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;}
1387 __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
1388 {
1389 __Pyx_BufFmt_StackElem __pyx_stack[1];
1390 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1391 __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);
1392 if (unlikely(__pyx_t_6 < 0)) {
1393 PyErr_Fetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
1394 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)) {
1395 Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);
1396 __Pyx_RaiseBufferFallbackError();
1397 } else {
1398 PyErr_Restore(__pyx_t_7, __pyx_t_8, __pyx_t_9);
1399 }
1400 }
1401 __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
1402 __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
1403 if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1404 }
1405 __pyx_t_5 = 0;
1406 __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
1407 __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_1);
1408 __pyx_t_1 = 0;
1409 goto __pyx_L3;
1410 }
1411 /*else*/ {
1412
1413 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":103
1414 * row_factors = np.ones(self.rows)
1415 * else:
1416 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE))) # <<<<<<<<<<<<<<
1417 *
1418 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1419 */
1420 __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;}
1421 __Pyx_GOTREF(__pyx_1);
1422 __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;}
1423 __Pyx_GOTREF(__pyx_t_1);
1424 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1425 __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;}
1426 __Pyx_GOTREF(__pyx_1);
1427 __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;}
1428 __Pyx_GOTREF(__pyx_t_4);
1429 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1430 __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;}
1431 __Pyx_GOTREF(__pyx_1);
1432 __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;}
1433 __Pyx_GOTREF(__pyx_t_2);
1434 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1435 __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;}
1436 __Pyx_GOTREF(((PyObject *)__pyx_t_10));
1437 __Pyx_INCREF(__pyx_v_row_norms);
1438 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_row_norms);
1439 __Pyx_GIVEREF(__pyx_v_row_norms);
1440 __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1441 __Pyx_GOTREF(((PyObject *)__pyx_1));
1442 __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;}
1443 __Pyx_GOTREF(__pyx_2);
1444 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;}
1445 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1446 __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;}
1447 __Pyx_GOTREF(__pyx_t_11);
1448 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1449 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
1450 __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
1451 __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;}
1452 __Pyx_GOTREF(((PyObject *)__pyx_t_10));
1453 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
1454 __Pyx_GIVEREF(__pyx_t_11);
1455 __pyx_t_11 = 0;
1456 __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;}
1457 __Pyx_GOTREF(__pyx_t_11);
1458 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1459 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 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 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
1463 __Pyx_GIVEREF(__pyx_t_11);
1464 __pyx_t_11 = 0;
1465 __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;}
1466 __Pyx_GOTREF(__pyx_t_11);
1467 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1468 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
1469 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;}
1470 __pyx_t_5 = ((PyArrayObject *)__pyx_t_11);
1471 {
1472 __Pyx_BufFmt_StackElem __pyx_stack[1];
1473 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1474 __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);
1475 if (unlikely(__pyx_t_6 < 0)) {
1476 PyErr_Fetch(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);
1477 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)) {
1478 Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);
1479 __Pyx_RaiseBufferFallbackError();
1480 } else {
1481 PyErr_Restore(__pyx_t_9, __pyx_t_8, __pyx_t_7);
1482 }
1483 }
1484 __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
1485 __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
1486 if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1487 }
1488 __pyx_t_5 = 0;
1489 __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
1490 __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_11);
1491 __pyx_t_11 = 0;
1492 }
1493 __pyx_L3:;
1494
1495 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":105
1496 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
1497 *
1211 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero) # <<<<<<<<<<<<<<1498 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero) # <<<<<<<<<<<<<<
1212 * self.transposed = 01499 * self.transposed = 0
1213 * columnDict = {}1500 * columnDict = {}
1214 */1501 */
1215 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->rows, __pyx_v_self->cols, __pyx_v_self->nonZero);1502 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->rows, __pyx_v_self->cols, __pyx_v_self->nonZero);
12161503
1217 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1551504 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":106
1218 * cpdef pack(self):1505 *
1219 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)1506 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1220 * self.transposed = 0 # <<<<<<<<<<<<<<1507 * self.transposed = 0 # <<<<<<<<<<<<<<
1221 * columnDict = {}1508 * columnDict = {}
@@ -1223,439 +1510,391 @@
1223 */1510 */
1224 __pyx_v_self->transposed = 0;1511 __pyx_v_self->transposed = 0;
12251512
1226 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1561513 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":107
1227 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)1514 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)
1228 * self.transposed = 01515 * self.transposed = 0
1229 * columnDict = {} # <<<<<<<<<<<<<<1516 * columnDict = {} # <<<<<<<<<<<<<<
1230 * cols = self.cols1517 * cols = self.cols
1231 * for (row, column), value in self.tensor.iteritems():1518 * for (row, col), value in self.tensor.iteritems():
1232 */1519 */
1233 __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1520 __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1234 __Pyx_GOTREF(((PyObject *)__pyx_1));1521 __Pyx_GOTREF(((PyObject *)__pyx_2));
1235 __Pyx_DECREF(__pyx_v_columnDict);1522 __Pyx_DECREF(__pyx_v_columnDict);
1236 __pyx_v_columnDict = ((PyObject *)__pyx_1);1523 __pyx_v_columnDict = ((PyObject *)__pyx_2);
1237 __pyx_1 = 0;1524 __pyx_2 = 0;
12381525
1239 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1571526 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":108
1240 * self.transposed = 01527 * self.transposed = 0
1241 * columnDict = {}1528 * columnDict = {}
1242 * cols = self.cols # <<<<<<<<<<<<<<1529 * cols = self.cols # <<<<<<<<<<<<<<
1243 * for (row, column), value in self.tensor.iteritems():1530 * for (row, col), value in self.tensor.iteritems():
1244 * if self.row_factors is not None:1531 * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1245 */1532 */
1246 __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;}1533 __pyx_v_cols = __pyx_v_self->cols;
1247 __Pyx_GOTREF(__pyx_t_1);
1248 __Pyx_DECREF(__pyx_v_cols);
1249 __pyx_v_cols = __pyx_t_1;
1250 __pyx_t_1 = 0;
12511534
1252 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1581535 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":109
1253 * columnDict = {}1536 * columnDict = {}
1254 * cols = self.cols1537 * cols = self.cols
1255 * for (row, column), value in self.tensor.iteritems(): # <<<<<<<<<<<<<<1538 * for (row, col), value in self.tensor.iteritems(): # <<<<<<<<<<<<<<
1256 * if self.row_factors is not None:1539 * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1257 * value /= sqrt(self.row_factors[row])1540 * assert len(columnDict) <= cols
1258 */1541 */
1259 __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;}1542 __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;}
1260 __Pyx_GOTREF(__pyx_t_1);1543 __Pyx_GOTREF(__pyx_t_11);
1261 __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;}1544 __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;}
1262 __Pyx_GOTREF(__pyx_t_3);1545 __Pyx_GOTREF(__pyx_t_10);
1263 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1546 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1264 if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {1547 if (PyList_CheckExact(__pyx_t_10) || PyTuple_CheckExact(__pyx_t_10)) {
1265 __pyx_t_2 = 0; __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1);1548 __pyx_t_12 = 0; __pyx_t_11 = __pyx_t_10; __Pyx_INCREF(__pyx_t_11);
1266 } else {1549 } else {
1267 __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;}1550 __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;}
1268 __Pyx_GOTREF(__pyx_t_1);1551 __Pyx_GOTREF(__pyx_t_11);
1269 }1552 }
1270 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;1553 __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1271 for (;;) {1554 for (;;) {
1272 if (likely(PyList_CheckExact(__pyx_t_1))) {1555 if (likely(PyList_CheckExact(__pyx_t_11))) {
1273 if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;1556 if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_11)) break;
1274 __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;1557 __pyx_t_10 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_12); __Pyx_INCREF(__pyx_t_10); __pyx_t_12++;
1275 } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {1558 } else if (likely(PyTuple_CheckExact(__pyx_t_11))) {
1276 if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;1559 if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_11)) break;
1277 __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;1560 __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_11, __pyx_t_12); __Pyx_INCREF(__pyx_t_10); __pyx_t_12++;
1278 } else {1561 } else {
1279 __pyx_t_3 = PyIter_Next(__pyx_t_1);1562 __pyx_t_10 = PyIter_Next(__pyx_t_11);
1280 if (!__pyx_t_3) {1563 if (!__pyx_t_10) {
1281 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1564 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1282 break;1565 break;
1283 }1566 }
1284 __Pyx_GOTREF(__pyx_t_3);1567 __Pyx_GOTREF(__pyx_t_10);
1285 }1568 }
1286 if (PyTuple_CheckExact(__pyx_t_3) && likely(PyTuple_GET_SIZE(__pyx_t_3) == 2)) {1569 if (PyTuple_CheckExact(__pyx_t_10) && likely(PyTuple_GET_SIZE(__pyx_t_10) == 2)) {
1287 PyObject* tuple = __pyx_t_3;1570 PyObject* tuple = __pyx_t_10;
1288 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);1571 __pyx_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_2);
1289 __pyx_3 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_3);1572 __pyx_3 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_3);
1290 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;1573 __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;}
1574 __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1575 __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1291 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {1576 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {
1292 PyObject* tuple = __pyx_2;1577 PyObject* tuple = __pyx_2;
1293 __pyx_5 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_5);1578 __pyx_4 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_4);
1294 __pyx_6 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_6);1579 __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;}
1580 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1581 __pyx_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_4);
1582 __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;}
1583 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1295 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1584 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1296 __Pyx_DECREF(__pyx_v_row);1585 __pyx_v_row = __pyx_t_14;
1297 __pyx_v_row = __pyx_5;1586 __pyx_v_col = __pyx_t_15;
1298 __pyx_5 = 0;
1299 __Pyx_DECREF(__pyx_v_column);
1300 __pyx_v_column = __pyx_6;
1301 __pyx_6 = 0;
1302 } else {1587 } else {
1303 __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;}1588 __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;}
1304 __Pyx_GOTREF(__pyx_4);1589 __Pyx_GOTREF(__pyx_3);
1305 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1590 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1306 __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;}1591 __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;}
1307 __Pyx_GOTREF(__pyx_5);1592 __Pyx_GOTREF(__pyx_4);
1308 __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;}1593 __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;}
1309 __Pyx_GOTREF(__pyx_6);1594 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1310 if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1595 __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;}
1311 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;1596 __Pyx_GOTREF(__pyx_4);
1312 __Pyx_DECREF(__pyx_v_row);1597 __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;}
1313 __pyx_v_row = __pyx_5;1598 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1314 __pyx_5 = 0;1599 if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1315 __Pyx_DECREF(__pyx_v_column);1600 __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1316 __pyx_v_column = __pyx_6;1601 __pyx_v_row = __pyx_t_15;
1317 __pyx_6 = 0;1602 __pyx_v_col = __pyx_t_14;
1318 }1603 }
1319 __Pyx_DECREF(__pyx_v_value);1604 __pyx_v_value = __pyx_t_13;
1320 __pyx_v_value = __pyx_3;
1321 __pyx_3 = 0;
1322 } else {1605 } else {
1323 __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;}1606 __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;}
1324 __Pyx_GOTREF(__pyx_1);1607 __Pyx_GOTREF(__pyx_1);
1325 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;1608 __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1326 __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;}1609 __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;}
1327 __Pyx_GOTREF(__pyx_2);1610 __Pyx_GOTREF(__pyx_2);
1328 __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;}1611 __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;}
1329 __Pyx_GOTREF(__pyx_3);1612 __Pyx_GOTREF(__pyx_3);
1330 if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1613 __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;}
1614 __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1615 if (__Pyx_EndUnpack(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1331 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;1616 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1332 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {1617 if (PyTuple_CheckExact(__pyx_2) && likely(PyTuple_GET_SIZE(__pyx_2) == 2)) {
1333 PyObject* tuple = __pyx_2;1618 PyObject* tuple = __pyx_2;
1334 __pyx_5 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_5);1619 __pyx_4 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_4);
1335 __pyx_6 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_6);1620 __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;}
1621 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1622 __pyx_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_4);
1623 __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;}
1624 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1336 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1625 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1337 __Pyx_DECREF(__pyx_v_row);1626 __pyx_v_row = __pyx_t_14;
1338 __pyx_v_row = __pyx_5;1627 __pyx_v_col = __pyx_t_15;
1339 __pyx_5 = 0;
1340 __Pyx_DECREF(__pyx_v_column);
1341 __pyx_v_column = __pyx_6;
1342 __pyx_6 = 0;
1343 } else {1628 } else {
1344 __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;}1629 __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;}
1345 __Pyx_GOTREF(__pyx_4);1630 __Pyx_GOTREF(__pyx_3);
1346 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1631 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1347 __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;}1632 __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;}
1348 __Pyx_GOTREF(__pyx_5);1633 __Pyx_GOTREF(__pyx_4);
1349 __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;}1634 __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;}
1350 __Pyx_GOTREF(__pyx_6);1635 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1351 if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1636 __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;}
1352 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;1637 __Pyx_GOTREF(__pyx_4);
1353 __Pyx_DECREF(__pyx_v_row);1638 __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;}
1354 __pyx_v_row = __pyx_5;1639 __Pyx_DECREF(__pyx_4); __pyx_4 = 0;
1355 __pyx_5 = 0;1640 if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1356 __Pyx_DECREF(__pyx_v_column);1641 __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1357 __pyx_v_column = __pyx_6;1642 __pyx_v_row = __pyx_t_15;
1358 __pyx_6 = 0;1643 __pyx_v_col = __pyx_t_14;
1359 }1644 }
1360 __Pyx_DECREF(__pyx_v_value);1645 __pyx_v_value = __pyx_t_13;
1361 __pyx_v_value = __pyx_3;
1362 __pyx_3 = 0;
1363 }1646 }
13641647
1365 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1591648 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":110
1366 * cols = self.cols1649 * cols = self.cols
1367 * for (row, column), value in self.tensor.iteritems():1650 * for (row, col), value in self.tensor.iteritems():
1368 * if self.row_factors is not None: # <<<<<<<<<<<<<<1651 * columnDict.setdefault(col, {})[row] = value * row_factors[row] # <<<<<<<<<<<<<<
1369 * value /= sqrt(self.row_factors[row])
1370 * columnDict.setdefault(column, {})[row] = value
1371 */
1372 __pyx_t_4 = (__pyx_v_self->row_factors != Py_None);
1373 if (__pyx_t_4) {
1374
1375 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":160
1376 * for (row, column), value in self.tensor.iteritems():
1377 * if self.row_factors is not None:
1378 * value /= sqrt(self.row_factors[row]) # <<<<<<<<<<<<<<
1379 * columnDict.setdefault(column, {})[row] = value
1380 * assert len(columnDict) <= cols
1381 */
1382 __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;}
1383 __Pyx_GOTREF(__pyx_5);
1384 __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;}
1385 __Pyx_DECREF(__pyx_5); __pyx_5 = 0;
1386 __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;}
1387 __Pyx_GOTREF(__pyx_t_3);
1388 __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;}
1389 __Pyx_GOTREF(__pyx_4);
1390 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
1391 __Pyx_DECREF(__pyx_v_value);
1392 __pyx_v_value = __pyx_4;
1393 __pyx_4 = 0;
1394 goto __pyx_L5;
1395 }
1396 __pyx_L5:;
1397
1398 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":161
1399 * if self.row_factors is not None:
1400 * value /= sqrt(self.row_factors[row])
1401 * columnDict.setdefault(column, {})[row] = value # <<<<<<<<<<<<<<
1402 * assert len(columnDict) <= cols1652 * assert len(columnDict) <= cols
1403 * index = 01653 * index = 0
1404 */1654 */
1405 __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;}1655 __pyx_t_14 = __pyx_v_row;
1406 __Pyx_GOTREF(__pyx_t_3);1656 __pyx_t_6 = -1;
1407 __pyx_6 = PyDict_New(); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1657 if (__pyx_t_14 < 0) {
1408 __Pyx_GOTREF(((PyObject *)__pyx_6));1658 __pyx_t_14 += __pyx_bshape_0_row_factors;
1409 __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;}1659 if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 0;
1410 __Pyx_GOTREF(((PyObject *)__pyx_t_6));1660 } else if (unlikely(__pyx_t_14 >= __pyx_bshape_0_row_factors)) __pyx_t_6 = 0;
1411 __Pyx_INCREF(__pyx_v_column);1661 if (unlikely(__pyx_t_6 != -1)) {
1412 PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_column);1662 __Pyx_RaiseBufferIndexError(__pyx_t_6);
1413 __Pyx_GIVEREF(__pyx_v_column);1663 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1414 PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_6));1664 }
1415 __Pyx_GIVEREF(((PyObject *)__pyx_6));1665 __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;}
1416 __pyx_6 = 0;1666 __Pyx_GOTREF(__pyx_t_10);
1417 __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;}1667 __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;}
1418 __Pyx_GOTREF(__pyx_t_7);1668 __Pyx_GOTREF(__pyx_t_1);
1419 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;1669 __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;}
1420 __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;1670 __Pyx_GOTREF(__pyx_t_4);
1421 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;}1671 __pyx_4 = PyDict_New(); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1422 __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;1672 __Pyx_GOTREF(((PyObject *)__pyx_4));
1673 __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;}
1674 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
1675 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
1676 __Pyx_GIVEREF(__pyx_t_4);
1677 PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_4));
1678 __Pyx_GIVEREF(((PyObject *)__pyx_4));
1679 __pyx_t_4 = 0;
1680 __pyx_4 = 0;
1681 __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;}
1682 __Pyx_GOTREF(__pyx_t_4);
1683 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1684 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1685 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;}
1686 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1687 __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
1423 }1688 }
1424 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1689 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
14251690
1426 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1621691 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":111
1427 * value /= sqrt(self.row_factors[row])1692 * for (row, col), value in self.tensor.iteritems():
1428 * columnDict.setdefault(column, {})[row] = value1693 * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1429 * assert len(columnDict) <= cols # <<<<<<<<<<<<<<1694 * assert len(columnDict) <= cols # <<<<<<<<<<<<<<
1430 * index = 01695 * index = 0
1431 * for colnum in xrange(cols):1696 * for col in xrange(cols):
1432 */1697 */
1433 #ifndef PYREX_WITHOUT_ASSERTIONS1698 #ifndef PYREX_WITHOUT_ASSERTIONS
1434 __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;}1699 __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;}
1435 __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;}1700 if (unlikely(!(__pyx_t_12 <= __pyx_v_cols))) {
1436 __Pyx_GOTREF(__pyx_t_1);
1437 __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;}
1438 __Pyx_GOTREF(__pyx_t_7);
1439 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1440 __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;}
1441 __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
1442 if (unlikely(!__pyx_t_4)) {
1443 PyErr_SetNone(PyExc_AssertionError);1701 PyErr_SetNone(PyExc_AssertionError);
1444 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1702 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1445 }1703 }
1446 #endif1704 #endif
14471705
1448 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1631706 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":112
1449 * columnDict.setdefault(column, {})[row] = value1707 * columnDict.setdefault(col, {})[row] = value * row_factors[row]
1450 * assert len(columnDict) <= cols1708 * assert len(columnDict) <= cols
1451 * index = 0 # <<<<<<<<<<<<<<1709 * index = 0 # <<<<<<<<<<<<<<
1452 * for colnum in xrange(cols):1710 * for col in xrange(cols):
1453 * col_len = len(columnDict.get(colnum, []))1711 * col_len = len(columnDict.get(col, []))
1454 */1712 */
1455 __Pyx_INCREF(__pyx_int_0);1713 __pyx_v_index = 0;
1456 __Pyx_DECREF(__pyx_v_index);
1457 __pyx_v_index = __pyx_int_0;
14581714
1459 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1641715 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":113
1460 * assert len(columnDict) <= cols1716 * assert len(columnDict) <= cols
1461 * index = 01717 * index = 0
1462 * for colnum in xrange(cols): # <<<<<<<<<<<<<<1718 * for col in xrange(cols): # <<<<<<<<<<<<<<
1463 * col_len = len(columnDict.get(colnum, []))1719 * col_len = len(columnDict.get(col, []))
1464 * self.setColumnSize(colnum, col_len)1720 * self.setColumnSize(col, col_len)
1465 */1721 */
1466 __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;}1722 for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_v_cols; __pyx_t_15+=1) {
1467 __Pyx_GOTREF(((PyObject *)__pyx_t_7));1723 __pyx_v_col = __pyx_t_15;
1468 __Pyx_INCREF(__pyx_v_cols);
1469 PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_cols);
1470 __Pyx_GIVEREF(__pyx_v_cols);
1471 __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;}
1472 __Pyx_GOTREF(__pyx_t_1);
1473 __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
1474 if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
1475 __pyx_t_2 = 0; __pyx_t_7 = __pyx_t_1; __Pyx_INCREF(__pyx_t_7);
1476 } else {
1477 __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;}
1478 __Pyx_GOTREF(__pyx_t_7);
1479 }
1480 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1481 for (;;) {
1482 if (likely(PyList_CheckExact(__pyx_t_7))) {
1483 if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_7)) break;
1484 __pyx_t_1 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
1485 } else if (likely(PyTuple_CheckExact(__pyx_t_7))) {
1486 if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
1487 __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
1488 } else {
1489 __pyx_t_1 = PyIter_Next(__pyx_t_7);
1490 if (!__pyx_t_1) {
1491 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1492 break;
1493 }
1494 __Pyx_GOTREF(__pyx_t_1);
1495 }
1496 __Pyx_DECREF(__pyx_v_colnum);
1497 __pyx_v_colnum = __pyx_t_1;
1498 __pyx_t_1 = 0;
14991724
1500 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1651725 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":114
1501 * index = 01726 * index = 0
1502 * for colnum in xrange(cols):1727 * for col in xrange(cols):
1503 * col_len = len(columnDict.get(colnum, [])) # <<<<<<<<<<<<<<1728 * col_len = len(columnDict.get(col, [])) # <<<<<<<<<<<<<<
1504 * self.setColumnSize(colnum, col_len)1729 * self.setColumnSize(col, col_len)
1505 * if col_len == 0: continue1730 * if col_len == 0: continue
1506 */1731 */
1507 __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;}1732 __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;}
1508 __Pyx_GOTREF(__pyx_t_1);1733 __Pyx_GOTREF(__pyx_t_11);
1509 __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;}1734 __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;}
1510 __Pyx_GOTREF(((PyObject *)__pyx_t_6));1735 __Pyx_GOTREF(__pyx_t_10);
1511 __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;}1736 __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;}
1512 __Pyx_GOTREF(((PyObject *)__pyx_t_3));1737 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
1513 __Pyx_INCREF(__pyx_v_colnum);1738 __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;}
1514 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_colnum);1739 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
1515 __Pyx_GIVEREF(__pyx_v_colnum);1740 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
1516 PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_t_6));1741 __Pyx_GIVEREF(__pyx_t_10);
1517 __Pyx_GIVEREF(((PyObject *)__pyx_t_6));1742 PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_4));
1518 __pyx_t_6 = 0;1743 __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
1519 __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;}1744 __pyx_t_10 = 0;
1520 __Pyx_GOTREF(__pyx_t_6);1745 __pyx_t_4 = 0;
1521 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;1746 __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;}
1522 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;1747 __Pyx_GOTREF(__pyx_t_4);
1523 __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;}1748 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1524 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;1749 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
1525 __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;}1750 __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;}
1526 __Pyx_GOTREF(__pyx_t_6);1751 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1527 __Pyx_DECREF(__pyx_v_col_len);1752 __pyx_v_col_len = __pyx_t_12;
1528 __pyx_v_col_len = __pyx_t_6;1753
1529 __pyx_t_6 = 0;1754 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":115
15301755 * for col in xrange(cols):
1531 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1661756 * col_len = len(columnDict.get(col, []))
1532 * for colnum in xrange(cols):1757 * self.setColumnSize(col, col_len) # <<<<<<<<<<<<<<
1533 * col_len = len(columnDict.get(colnum, []))1758 * if col_len == 0: continue
1534 * self.setColumnSize(colnum, col_len) # <<<<<<<<<<<<<<1759 * for rowk in sorted(columnDict[col].keys()):
1535 * if col_len == 0: continue1760 */
1536 * for rowk in sorted(columnDict[colnum].keys()):1761 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_v_col, __pyx_v_col_len);
1537 */1762
1538 __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;}1763 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":116
1539 __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;}1764 * col_len = len(columnDict.get(col, []))
1540 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_t_9, __pyx_t_10);1765 * self.setColumnSize(col, col_len)
1541
1542 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":167
1543 * col_len = len(columnDict.get(colnum, []))
1544 * self.setColumnSize(colnum, col_len)
1545 * if col_len == 0: continue # <<<<<<<<<<<<<<1766 * if col_len == 0: continue # <<<<<<<<<<<<<<
1546 * for rowk in sorted(columnDict[colnum].keys()):1767 * for rowk in sorted(columnDict[col].keys()):
1547 * self.setValue(index, rowk,1768 * self.setValue(index, rowk, columnDict[col][rowk])
1548 */1769 */
1549 __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;}1770 __pyx_t_3 = (__pyx_v_col_len == 0);
1550 __Pyx_GOTREF(__pyx_t_6);1771 if (__pyx_t_3) {
1551 __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;}
1552 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
1553 if (__pyx_t_4) {
1554 goto __pyx_L6_continue;1772 goto __pyx_L6_continue;
1555 goto __pyx_L8;1773 goto __pyx_L8;
1556 }1774 }
1557 __pyx_L8:;1775 __pyx_L8:;
15581776
1559 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1681777 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":117
1560 * self.setColumnSize(colnum, col_len)1778 * self.setColumnSize(col, col_len)
1561 * if col_len == 0: continue1779 * if col_len == 0: continue
1562 * for rowk in sorted(columnDict[colnum].keys()): # <<<<<<<<<<<<<<1780 * for rowk in sorted(columnDict[col].keys()): # <<<<<<<<<<<<<<
1563 * self.setValue(index, rowk,1781 * self.setValue(index, rowk, columnDict[col][rowk])
1564 * float(columnDict[colnum][rowk]))1782 * index += 1
1565 */1783 */
1566 __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;}1784 __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;}
1567 __Pyx_GOTREF(__pyx_1);1785 __Pyx_GOTREF(__pyx_3);
1568 __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;}1786 __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;}
1569 __Pyx_GOTREF(__pyx_t_6);1787 __Pyx_GOTREF(__pyx_t_4);
1570 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;1788 __Pyx_DECREF(__pyx_3); __pyx_3 = 0;
1571 __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;}1789 __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;}
1572 __Pyx_GOTREF(__pyx_t_3);1790 __Pyx_GOTREF(__pyx_t_2);
1573 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;1791 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1574 __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;}1792 __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;}
1575 __Pyx_GOTREF(((PyObject *)__pyx_t_6));1793 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
1576 PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);1794 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
1577 __Pyx_GIVEREF(__pyx_t_3);1795 __Pyx_GIVEREF(__pyx_t_2);
1578 __pyx_t_3 = 0;1796 __pyx_t_2 = 0;
1579 __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;}1797 __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;}
1580 __Pyx_GOTREF(__pyx_t_3);1798 __Pyx_GOTREF(__pyx_t_2);
1581 __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;1799 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
1582 if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {1800 if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
1583 __pyx_t_8 = 0; __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6);1801 __pyx_t_12 = 0; __pyx_t_4 = __pyx_t_2; __Pyx_INCREF(__pyx_t_4);
1584 } else {1802 } else {
1585 __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;}1803 __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;}
1586 __Pyx_GOTREF(__pyx_t_6);1804 __Pyx_GOTREF(__pyx_t_4);
1587 }1805 }
1588 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;1806 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1589 for (;;) {1807 for (;;) {
1590 if (likely(PyList_CheckExact(__pyx_t_6))) {1808 if (likely(PyList_CheckExact(__pyx_t_4))) {
1591 if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;1809 if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_4)) break;
1592 __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;1810 __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_12); __Pyx_INCREF(__pyx_t_2); __pyx_t_12++;
1593 } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {1811 } else if (likely(PyTuple_CheckExact(__pyx_t_4))) {
1594 if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;1812 if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
1595 __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;1813 __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_12); __Pyx_INCREF(__pyx_t_2); __pyx_t_12++;
1596 } else {1814 } else {
1597 __pyx_t_3 = PyIter_Next(__pyx_t_6);1815 __pyx_t_2 = PyIter_Next(__pyx_t_4);
1598 if (!__pyx_t_3) {1816 if (!__pyx_t_2) {
1599 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}1817 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1600 break;1818 break;
1601 }1819 }
1602 __Pyx_GOTREF(__pyx_t_3);1820 __Pyx_GOTREF(__pyx_t_2);
1603 }1821 }
1604 __Pyx_DECREF(__pyx_v_rowk);1822 __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;}
1605 __pyx_v_rowk = __pyx_t_3;1823 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
1606 __pyx_t_3 = 0;1824 __pyx_v_rowk = __pyx_t_16;
16071825
1608 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1691826 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":118
1609 * if col_len == 0: continue1827 * if col_len == 0: continue
1610 * for rowk in sorted(columnDict[colnum].keys()):1828 * for rowk in sorted(columnDict[col].keys()):
1611 * self.setValue(index, rowk, # <<<<<<<<<<<<<<1829 * self.setValue(index, rowk, columnDict[col][rowk]) # <<<<<<<<<<<<<<
1612 * float(columnDict[colnum][rowk]))1830 * index += 1
1613 * index += 11831 * if self.offset_for_row is not None:
1614 */1832 */
1615 __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;}1833 __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;}
1616 __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;}1834 __Pyx_GOTREF(__pyx_1);
16171835 __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;}
1618 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":170
1619 * for rowk in sorted(columnDict[colnum].keys()):
1620 * self.setValue(index, rowk,
1621 * float(columnDict[colnum][rowk])) # <<<<<<<<<<<<<<
1622 * index += 1
1623 *
1624 */
1625 __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;}
1626 __Pyx_GOTREF(__pyx_2);1836 __Pyx_GOTREF(__pyx_2);
1627 __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;}1837 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1628 __Pyx_GOTREF(__pyx_3);1838 __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;}
1629 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;1839 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1630 __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;}1840 ((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);
1631 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
1632 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_3);
1633 __Pyx_GIVEREF(__pyx_3);
1634 __pyx_3 = 0;
1635 __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;}
1636 __Pyx_GOTREF(__pyx_t_1);
1637 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
1638 __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;}
1639 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1640 ((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);
16411841
1642 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1711842 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":119
1643 * self.setValue(index, rowk,1843 * for rowk in sorted(columnDict[col].keys()):
1644 * float(columnDict[colnum][rowk]))1844 * self.setValue(index, rowk, columnDict[col][rowk])
1645 * index += 1 # <<<<<<<<<<<<<<1845 * index += 1 # <<<<<<<<<<<<<<
1646 * 1846 * if self.offset_for_row is not None:
1647 * cpdef dictPack(self):1847 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
1648 */1848 */
1649 __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;}1849 __pyx_v_index += 1;
1650 __Pyx_GOTREF(__pyx_5);
1651 __Pyx_DECREF(__pyx_v_index);
1652 __pyx_v_index = __pyx_5;
1653 __pyx_5 = 0;
1654 }1850 }
1655 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;1851 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1656 __pyx_L6_continue:;1852 __pyx_L6_continue:;
1657 }1853 }
1658 __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;1854
1855 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":120
1856 * self.setValue(index, rowk, columnDict[col][rowk])
1857 * index += 1
1858 * if self.offset_for_row is not None: # <<<<<<<<<<<<<<
1859 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
1860 * if self.offset_for_col is not None:
1861 */
1862 __pyx_t_3 = (__pyx_v_self->offset_for_row != Py_None);
1863 if (__pyx_t_3) {
1864
1865 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":121
1866 * index += 1
1867 * if self.offset_for_row is not None:
1868 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row) # <<<<<<<<<<<<<<
1869 * if self.offset_for_col is not None:
1870 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
1871 */
1872 __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);
1873 goto __pyx_L11;
1874 }
1875 __pyx_L11:;
1876
1877 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":122
1878 * if self.offset_for_row is not None:
1879 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
1880 * if self.offset_for_col is not None: # <<<<<<<<<<<<<<
1881 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
1882 *
1883 */
1884 __pyx_t_3 = (__pyx_v_self->offset_for_col != Py_None);
1885 if (__pyx_t_3) {
1886
1887 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":123
1888 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_row)
1889 * if self.offset_for_col is not None:
1890 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col) # <<<<<<<<<<<<<<
1891 *
1892 * cdef double *toVector(self, vec):
1893 */
1894 __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);
1895 goto __pyx_L12;
1896 }
1897 __pyx_L12:;
16591898
1660 __pyx_r = Py_None; __Pyx_INCREF(Py_None);1899 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
1661 goto __pyx_L0;1900 goto __pyx_L0;
@@ -1664,44 +1903,83 @@
1664 __Pyx_XDECREF(__pyx_2);1903 __Pyx_XDECREF(__pyx_2);
1665 __Pyx_XDECREF(__pyx_3);1904 __Pyx_XDECREF(__pyx_3);
1666 __Pyx_XDECREF(__pyx_4);1905 __Pyx_XDECREF(__pyx_4);
1667 __Pyx_XDECREF(__pyx_5);
1668 __Pyx_XDECREF(__pyx_6);
1669 __Pyx_XDECREF(__pyx_t_1);1906 __Pyx_XDECREF(__pyx_t_1);
1670 __Pyx_XDECREF(__pyx_t_3);1907 __Pyx_XDECREF(__pyx_t_2);
1671 __Pyx_XDECREF(__pyx_t_6);1908 __Pyx_XDECREF(__pyx_t_4);
1672 __Pyx_XDECREF(__pyx_t_7);1909 __Pyx_XDECREF(__pyx_t_10);
1910 __Pyx_XDECREF(__pyx_t_11);
1911 { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
1912 __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
1913 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1914 __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
1673 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.pack");1915 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.pack");
1674 __pyx_r = 0;1916 __pyx_r = 0;
1917 goto __pyx_L2;
1675 __pyx_L0:;1918 __pyx_L0:;
1919 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
1920 __pyx_L2:;
1921 __Pyx_DECREF((PyObject *)__pyx_v_row_factors);
1676 __Pyx_DECREF(__pyx_v_columnDict);1922 __Pyx_DECREF(__pyx_v_columnDict);
1677 __Pyx_DECREF(__pyx_v_cols);
1678 __Pyx_DECREF(__pyx_v_row);
1679 __Pyx_DECREF(__pyx_v_column);
1680 __Pyx_DECREF(__pyx_v_value);
1681 __Pyx_DECREF(__pyx_v_index);
1682 __Pyx_DECREF(__pyx_v_colnum);
1683 __Pyx_DECREF(__pyx_v_col_len);
1684 __Pyx_DECREF(__pyx_v_rowk);
1685 __Pyx_XGIVEREF(__pyx_r);1923 __Pyx_XGIVEREF(__pyx_r);
1686 __Pyx_FinishRefcountContext();1924 __Pyx_FinishRefcountContext();
1687 return __pyx_r;1925 return __pyx_r;
1688}1926}
16891927
1690/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1531928/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":96
1691 * self.row_factors = row_factors1929 * self.offset_for_col = offset_for_col
1692 * 1930 *
1693 * cpdef pack(self): # <<<<<<<<<<<<<<1931 * cpdef pack(self, row_norms=None): # <<<<<<<<<<<<<<
1694 * self.cmatrix = svdNewSMat(self.rows, self.cols, self.nonZero)1932 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
1695 * self.transposed = 01933 * cdef long row, col, index, cols, col_len, rowk
1696 */1934 */
16971935
1698static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/1936static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
1699static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *unused) {1937static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_pack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
1938 PyObject *__pyx_v_row_norms = 0;
1700 PyObject *__pyx_r = NULL;1939 PyObject *__pyx_r = NULL;
1940 struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_pack __pyx_1;
1701 PyObject *__pyx_t_1 = NULL;1941 PyObject *__pyx_t_1 = NULL;
1942 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_row_norms,0};
1702 __Pyx_SetupRefcountContext("pack");1943 __Pyx_SetupRefcountContext("pack");
1944 if (unlikely(__pyx_kwds)) {
1945 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
1946 PyObject* values[1] = {0};
1947 values[0] = Py_None;
1948 switch (PyTuple_GET_SIZE(__pyx_args)) {
1949 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
1950 case 0: break;
1951 default: goto __pyx_L5_argtuple_error;
1952 }
1953 switch (PyTuple_GET_SIZE(__pyx_args)) {
1954 case 0:
1955 if (kw_args > 1) {
1956 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_norms);
1957 if (unlikely(value)) { values[0] = value; kw_args--; }
1958 }
1959 }
1960 if (unlikely(kw_args > 0)) {
1961 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;}
1962 }
1963 __pyx_v_row_norms = values[0];
1964 } else {
1965 __pyx_v_row_norms = Py_None;
1966 switch (PyTuple_GET_SIZE(__pyx_args)) {
1967 case 1: __pyx_v_row_norms = PyTuple_GET_ITEM(__pyx_args, 0);
1968 case 0: break;
1969 default: goto __pyx_L5_argtuple_error;
1970 }
1971 }
1972 goto __pyx_L4_argument_unpacking_done;
1973 __pyx_L5_argtuple_error:;
1974 __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;}
1975 __pyx_L3_error:;
1976 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.pack");
1977 return NULL;
1978 __pyx_L4_argument_unpacking_done:;
1703 __Pyx_XDECREF(__pyx_r);1979 __Pyx_XDECREF(__pyx_r);
1704 __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;}1980 __pyx_1.__pyx_n = 1;
1981 __pyx_1.row_norms = __pyx_v_row_norms;
1982 __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;}
1705 __Pyx_GOTREF(__pyx_t_1);1983 __Pyx_GOTREF(__pyx_t_1);
1706 __pyx_r = __pyx_t_1;1984 __pyx_r = __pyx_t_1;
1707 __pyx_t_1 = 0;1985 __pyx_t_1 = 0;
@@ -1719,66 +1997,355 @@
1719 return __pyx_r;1997 return __pyx_r;
1720}1998}
17211999
1722/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1732000/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":125
1723 * index += 12001 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_col)
1724 * 2002 *
1725 * cpdef dictPack(self): # <<<<<<<<<<<<<<2003 * cdef double *toVector(self, vec): # <<<<<<<<<<<<<<
1726 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)2004 * cdef long n = len(vec)
1727 * self.transposed = 12005 * cdef double *temp = svd_doubleArray(n, False, "toVector")
1728 */2006 */
17292007
1730static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/2008static double *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_toVector(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, PyObject *__pyx_v_vec) {
1731static PyObject *__pyx_f_6svdlib_7_svdlib_9CSCMatrix_dictPack(struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *__pyx_v_self, int __pyx_skip_dispatch) {2009 long __pyx_v_n;
2010 double *__pyx_v_temp;
2011 PyObject *__pyx_v_i;
2012 double *__pyx_r;
2013 PyObject *__pyx_1 = 0;
2014 Py_ssize_t __pyx_t_1;
2015 PyObject *__pyx_t_2 = NULL;
2016 PyObject *__pyx_t_3 = NULL;
2017 double __pyx_t_4;
2018 Py_ssize_t __pyx_t_5;
2019 __Pyx_SetupRefcountContext("toVector");
2020 __pyx_v_i = Py_None; __Pyx_INCREF(Py_None);
2021
2022 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":126
2023 *
2024 * cdef double *toVector(self, vec):
2025 * cdef long n = len(vec) # <<<<<<<<<<<<<<
2026 * cdef double *temp = svd_doubleArray(n, False, "toVector")
2027 * for i in range(n):
2028 */
2029 __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;}
2030 __pyx_v_n = __pyx_t_1;
2031
2032 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":127
2033 * cdef double *toVector(self, vec):
2034 * cdef long n = len(vec)
2035 * cdef double *temp = svd_doubleArray(n, False, "toVector") # <<<<<<<<<<<<<<
2036 * for i in range(n):
2037 * temp[i] = vec[i]
2038 */
2039 __pyx_v_temp = svd_doubleArray(__pyx_v_n, 0, __pyx_k_35);
2040
2041 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":128
2042 * cdef long n = len(vec)
2043 * cdef double *temp = svd_doubleArray(n, False, "toVector")
2044 * for i in range(n): # <<<<<<<<<<<<<<
2045 * temp[i] = vec[i]
2046 * return temp
2047 */
2048 __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;}
2049 __Pyx_GOTREF(__pyx_t_2);
2050 __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;}
2051 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
2052 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
2053 __Pyx_GIVEREF(__pyx_t_2);
2054 __pyx_t_2 = 0;
2055 __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;}
2056 __Pyx_GOTREF(__pyx_t_2);
2057 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
2058 if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
2059 __pyx_t_1 = 0; __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3);
2060 } else {
2061 __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;}
2062 __Pyx_GOTREF(__pyx_t_3);
2063 }
2064 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2065 for (;;) {
2066 if (likely(PyList_CheckExact(__pyx_t_3))) {
2067 if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break;
2068 __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
2069 } else if (likely(PyTuple_CheckExact(__pyx_t_3))) {
2070 if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
2071 __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
2072 } else {
2073 __pyx_t_2 = PyIter_Next(__pyx_t_3);
2074 if (!__pyx_t_2) {
2075 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2076 break;
2077 }
2078 __Pyx_GOTREF(__pyx_t_2);
2079 }
2080 __Pyx_DECREF(__pyx_v_i);
2081 __pyx_v_i = __pyx_t_2;
2082 __pyx_t_2 = 0;
2083
2084 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":129
2085 * cdef double *temp = svd_doubleArray(n, False, "toVector")
2086 * for i in range(n):
2087 * temp[i] = vec[i] # <<<<<<<<<<<<<<
2088 * return temp
2089 *
2090 */
2091 __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;}
2092 __Pyx_GOTREF(__pyx_1);
2093 __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;}
2094 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2095 __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;}
2096 (__pyx_v_temp[__pyx_t_5]) = __pyx_t_4;
2097 }
2098 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2099
2100 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":130
2101 * for i in range(n):
2102 * temp[i] = vec[i]
2103 * return temp # <<<<<<<<<<<<<<
2104 *
2105 * cpdef dictPack(self, row_norms=None):
2106 */
2107 __pyx_r = __pyx_v_temp;
2108 goto __pyx_L0;
2109
2110 __pyx_r = 0;
2111 goto __pyx_L0;
2112 __pyx_L1_error:;
2113 __Pyx_XDECREF(__pyx_1);
2114 __Pyx_XDECREF(__pyx_t_2);
2115 __Pyx_XDECREF(__pyx_t_3);
2116 __Pyx_WriteUnraisable("svdlib._svdlib.CSCMatrix.toVector");
2117 __pyx_r = 0;
2118 __pyx_L0:;
2119 __Pyx_DECREF(__pyx_v_i);
2120 __Pyx_FinishRefcountContext();
2121 return __pyx_r;
2122}
2123
2124/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
2125 * return temp
2126 *
2127 * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
2128 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2129 * if row_norms is None:
2130 */
2131
2132static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
2133static 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) {
2134 PyObject *__pyx_v_row_norms = Py_None;
2135 PyArrayObject *__pyx_v_row_factors;
1732 PyObject *__pyx_v_rowDict = 0;2136 PyObject *__pyx_v_rowDict = 0;
1733 int __pyx_v_rows;2137 int __pyx_v_rows;
1734 int __pyx_v_colk;2138 int __pyx_v_colk;
1735 int __pyx_v_index;2139 int __pyx_v_index;
1736 int __pyx_v_rownum;2140 int __pyx_v_rownum;
1737 int __pyx_v_row_len;2141 int __pyx_v_row_len;
1738 float __pyx_v_val;2142 double __pyx_v_val;
2143 Py_buffer __pyx_bstruct_row_factors;
2144 Py_ssize_t __pyx_bstride_0_row_factors = 0;
2145 Py_ssize_t __pyx_bshape_0_row_factors = 0;
1739 PyObject *__pyx_r = NULL;2146 PyObject *__pyx_r = NULL;
1740 PyObject *__pyx_1 = 0;2147 PyObject *__pyx_1 = 0;
1741 PyObject *__pyx_2 = 0;2148 PyObject *__pyx_2 = 0;
1742 PyObject *__pyx_t_1 = NULL;2149 PyObject *__pyx_t_1 = NULL;
1743 int __pyx_t_2;2150 PyObject *__pyx_t_2 = NULL;
1744 Py_ssize_t __pyx_t_3;2151 int __pyx_t_3;
1745 PyObject *__pyx_t_4 = NULL;2152 PyObject *__pyx_t_4 = NULL;
1746 PyObject *__pyx_t_5 = NULL;2153 PyArrayObject *__pyx_t_5 = NULL;
1747 PyObject *__pyx_t_6 = NULL;2154 int __pyx_t_6;
1748 int __pyx_t_7;2155 PyObject *__pyx_t_7 = NULL;
1749 int __pyx_t_8;2156 PyObject *__pyx_t_8 = NULL;
1750 float __pyx_t_9;2157 PyObject *__pyx_t_9 = NULL;
1751 double __pyx_t_10;2158 PyObject *__pyx_t_10 = NULL;
2159 PyObject *__pyx_t_11 = NULL;
2160 Py_ssize_t __pyx_t_12;
2161 int __pyx_t_13;
2162 int __pyx_t_14;
2163 double __pyx_t_15;
1752 __Pyx_SetupRefcountContext("dictPack");2164 __Pyx_SetupRefcountContext("dictPack");
2165 if (__pyx_optional_args) {
2166 if (__pyx_optional_args->__pyx_n > 0) {
2167 __pyx_v_row_norms = __pyx_optional_args->row_norms;
2168 }
2169 }
2170 __pyx_v_row_factors = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None);
2171 __pyx_bstruct_row_factors.buf = NULL;
1753 /* Check if called by wrapper */2172 /* Check if called by wrapper */
1754 if (unlikely(__pyx_skip_dispatch)) ;2173 if (unlikely(__pyx_skip_dispatch)) ;
1755 /* Check if overriden in Python */2174 /* Check if overriden in Python */
1756 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {2175 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
1757 __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;}2176 __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;}
1758 __Pyx_GOTREF(__pyx_1);2177 __Pyx_GOTREF(__pyx_1);
1759 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack)) {2178 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack)) {
1760 __Pyx_XDECREF(__pyx_r);2179 __Pyx_XDECREF(__pyx_r);
1761 __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;}2180 __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;}
1762 __Pyx_GOTREF(__pyx_t_1);2181 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2182 __Pyx_INCREF(__pyx_v_row_norms);
2183 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_norms);
2184 __Pyx_GIVEREF(__pyx_v_row_norms);
2185 __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;}
2186 __Pyx_GOTREF(__pyx_t_2);
1763 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2187 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1764 __pyx_r = __pyx_t_1;2188 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
1765 __pyx_t_1 = 0;2189 __pyx_r = __pyx_t_2;
2190 __pyx_t_2 = 0;
1766 goto __pyx_L0;2191 goto __pyx_L0;
1767 }2192 }
1768 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2193 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1769 }2194 }
17702195
1771 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1742196 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":134
1772 * 2197 * cpdef dictPack(self, row_norms=None):
1773 * cpdef dictPack(self):2198 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2199 * if row_norms is None: # <<<<<<<<<<<<<<
2200 * row_factors = np.ones(self.rows)
2201 * else:
2202 */
2203 __pyx_t_3 = (__pyx_v_row_norms == Py_None);
2204 if (__pyx_t_3) {
2205
2206 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":135
2207 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2208 * if row_norms is None:
2209 * row_factors = np.ones(self.rows) # <<<<<<<<<<<<<<
2210 * else:
2211 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
2212 */
2213 __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;}
2214 __Pyx_GOTREF(__pyx_1);
2215 __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;}
2216 __Pyx_GOTREF(__pyx_t_2);
2217 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2218 __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;}
2219 __Pyx_GOTREF(__pyx_t_1);
2220 __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;}
2221 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2222 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
2223 __Pyx_GIVEREF(__pyx_t_1);
2224 __pyx_t_1 = 0;
2225 __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;}
2226 __Pyx_GOTREF(__pyx_t_1);
2227 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2228 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
2229 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;}
2230 __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
2231 {
2232 __Pyx_BufFmt_StackElem __pyx_stack[1];
2233 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2234 __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);
2235 if (unlikely(__pyx_t_6 < 0)) {
2236 PyErr_Fetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
2237 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)) {
2238 Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);
2239 __Pyx_RaiseBufferFallbackError();
2240 } else {
2241 PyErr_Restore(__pyx_t_7, __pyx_t_8, __pyx_t_9);
2242 }
2243 }
2244 __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
2245 __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
2246 if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2247 }
2248 __pyx_t_5 = 0;
2249 __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
2250 __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_1);
2251 __pyx_t_1 = 0;
2252 goto __pyx_L3;
2253 }
2254 /*else*/ {
2255
2256 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":137
2257 * row_factors = np.ones(self.rows)
2258 * else:
2259 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE))) # <<<<<<<<<<<<<<
2260 *
2261 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
2262 */
2263 __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;}
2264 __Pyx_GOTREF(__pyx_1);
2265 __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;}
2266 __Pyx_GOTREF(__pyx_t_1);
2267 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2268 __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;}
2269 __Pyx_GOTREF(__pyx_1);
2270 __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;}
2271 __Pyx_GOTREF(__pyx_t_4);
2272 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2273 __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;}
2274 __Pyx_GOTREF(__pyx_1);
2275 __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;}
2276 __Pyx_GOTREF(__pyx_t_2);
2277 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2278 __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;}
2279 __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2280 __Pyx_INCREF(__pyx_v_row_norms);
2281 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_row_norms);
2282 __Pyx_GIVEREF(__pyx_v_row_norms);
2283 __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2284 __Pyx_GOTREF(((PyObject *)__pyx_1));
2285 __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;}
2286 __Pyx_GOTREF(__pyx_2);
2287 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;}
2288 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2289 __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;}
2290 __Pyx_GOTREF(__pyx_t_11);
2291 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2292 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2293 __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
2294 __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;}
2295 __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2296 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
2297 __Pyx_GIVEREF(__pyx_t_11);
2298 __pyx_t_11 = 0;
2299 __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;}
2300 __Pyx_GOTREF(__pyx_t_11);
2301 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2302 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2303 __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;}
2304 __Pyx_GOTREF(((PyObject *)__pyx_t_10));
2305 PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
2306 __Pyx_GIVEREF(__pyx_t_11);
2307 __pyx_t_11 = 0;
2308 __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;}
2309 __Pyx_GOTREF(__pyx_t_11);
2310 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2311 __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
2312 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;}
2313 __pyx_t_5 = ((PyArrayObject *)__pyx_t_11);
2314 {
2315 __Pyx_BufFmt_StackElem __pyx_stack[1];
2316 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2317 __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);
2318 if (unlikely(__pyx_t_6 < 0)) {
2319 PyErr_Fetch(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);
2320 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)) {
2321 Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);
2322 __Pyx_RaiseBufferFallbackError();
2323 } else {
2324 PyErr_Restore(__pyx_t_9, __pyx_t_8, __pyx_t_7);
2325 }
2326 }
2327 __pyx_bstride_0_row_factors = __pyx_bstruct_row_factors.strides[0];
2328 __pyx_bshape_0_row_factors = __pyx_bstruct_row_factors.shape[0];
2329 if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2330 }
2331 __pyx_t_5 = 0;
2332 __Pyx_DECREF(((PyObject *)__pyx_v_row_factors));
2333 __pyx_v_row_factors = ((PyArrayObject *)__pyx_t_11);
2334 __pyx_t_11 = 0;
2335 }
2336 __pyx_L3:;
2337
2338 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":139
2339 * row_factors = np.reciprocal(np.sqrt(np.array(row_norms, dtype=DTYPE)))
2340 *
1774 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero) # <<<<<<<<<<<<<<2341 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero) # <<<<<<<<<<<<<<
1775 * self.transposed = 12342 * self.transposed = 1
1776 * cdef object rowDict = self.tensor._data2343 * cdef object rowDict = self.tensor._data
1777 */2344 */
1778 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->cols, __pyx_v_self->rows, __pyx_v_self->nonZero);2345 __pyx_v_self->cmatrix = svdNewSMat(__pyx_v_self->cols, __pyx_v_self->rows, __pyx_v_self->nonZero);
17792346
1780 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1752347 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":140
1781 * cpdef dictPack(self):2348 *
1782 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)2349 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
1783 * self.transposed = 1 # <<<<<<<<<<<<<<2350 * self.transposed = 1 # <<<<<<<<<<<<<<
1784 * cdef object rowDict = self.tensor._data2351 * cdef object rowDict = self.tensor._data
@@ -1786,35 +2353,35 @@
1786 */2353 */
1787 __pyx_v_self->transposed = 1;2354 __pyx_v_self->transposed = 1;
17882355
1789 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1762356 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":141
1790 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)2357 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)
1791 * self.transposed = 12358 * self.transposed = 1
1792 * cdef object rowDict = self.tensor._data # <<<<<<<<<<<<<<2359 * cdef object rowDict = self.tensor._data # <<<<<<<<<<<<<<
1793 * cdef int rows = self.tensor.shape[0]2360 * cdef int rows = self.tensor.shape[0]
1794 * cdef int colk2361 * cdef int colk
1795 */2362 */
1796 __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;}2363 __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;}
1797 __Pyx_GOTREF(__pyx_t_1);2364 __Pyx_GOTREF(__pyx_t_11);
1798 __pyx_v_rowDict = __pyx_t_1;2365 __pyx_v_rowDict = __pyx_t_11;
1799 __pyx_t_1 = 0;2366 __pyx_t_11 = 0;
18002367
1801 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1772368 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":142
1802 * self.transposed = 12369 * self.transposed = 1
1803 * cdef object rowDict = self.tensor._data2370 * cdef object rowDict = self.tensor._data
1804 * cdef int rows = self.tensor.shape[0] # <<<<<<<<<<<<<<2371 * cdef int rows = self.tensor.shape[0] # <<<<<<<<<<<<<<
1805 * cdef int colk2372 * cdef int colk
1806 * cdef int index = 02373 * cdef int index = 0
1807 */2374 */
1808 __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;}2375 __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;}
1809 __Pyx_GOTREF(__pyx_t_1);2376 __Pyx_GOTREF(__pyx_t_11);
1810 __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;}2377 __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;}
1811 __Pyx_GOTREF(__pyx_1);2378 __Pyx_GOTREF(__pyx_2);
1812 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;2379 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1813 __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;}2380 __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;}
1814 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2381 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1815 __pyx_v_rows = __pyx_t_2;2382 __pyx_v_rows = __pyx_t_6;
18162383
1817 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1792384 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":144
1818 * cdef int rows = self.tensor.shape[0]2385 * cdef int rows = self.tensor.shape[0]
1819 * cdef int colk2386 * cdef int colk
1820 * cdef int index = 0 # <<<<<<<<<<<<<<2387 * cdef int index = 0 # <<<<<<<<<<<<<<
@@ -1823,61 +2390,61 @@
1823 */2390 */
1824 __pyx_v_index = 0;2391 __pyx_v_index = 0;
18252392
1826 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1832393 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":148
1827 * cdef int row_len2394 * cdef int row_len
1828 * cdef float val2395 * cdef double val
1829 * assert len(rowDict) <= rows # <<<<<<<<<<<<<<2396 * assert len(rowDict) <= rows # <<<<<<<<<<<<<<
1830 * for rownum from 0 <= rownum < rows:2397 * for rownum from 0 <= rownum < rows:
1831 * row_len = len(rowDict.get(rownum, []))2398 * row_len = len(rowDict.get(rownum, []))
1832 */2399 */
1833 #ifndef PYREX_WITHOUT_ASSERTIONS2400 #ifndef PYREX_WITHOUT_ASSERTIONS
1834 __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;}2401 __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;}
1835 if (unlikely(!(__pyx_t_3 <= __pyx_v_rows))) {2402 if (unlikely(!(__pyx_t_12 <= __pyx_v_rows))) {
1836 PyErr_SetNone(PyExc_AssertionError);2403 PyErr_SetNone(PyExc_AssertionError);
1837 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}2404 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1838 }2405 }
1839 #endif2406 #endif
18402407
1841 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1842408 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":149
1842 * cdef float val2409 * cdef double val
1843 * assert len(rowDict) <= rows2410 * assert len(rowDict) <= rows
1844 * for rownum from 0 <= rownum < rows: # <<<<<<<<<<<<<<2411 * for rownum from 0 <= rownum < rows: # <<<<<<<<<<<<<<
1845 * row_len = len(rowDict.get(rownum, []))2412 * row_len = len(rowDict.get(rownum, []))
1846 * self.setColumnSize(rownum, row_len)2413 * self.setColumnSize(rownum, row_len)
1847 */2414 */
1848 __pyx_t_2 = __pyx_v_rows;2415 __pyx_t_6 = __pyx_v_rows;
1849 for (__pyx_v_rownum = 0; __pyx_v_rownum < __pyx_t_2; __pyx_v_rownum++) {2416 for (__pyx_v_rownum = 0; __pyx_v_rownum < __pyx_t_6; __pyx_v_rownum++) {
18502417
1851 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1852418 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":150
1852 * assert len(rowDict) <= rows2419 * assert len(rowDict) <= rows
1853 * for rownum from 0 <= rownum < rows:2420 * for rownum from 0 <= rownum < rows:
1854 * row_len = len(rowDict.get(rownum, [])) # <<<<<<<<<<<<<<2421 * row_len = len(rowDict.get(rownum, [])) # <<<<<<<<<<<<<<
1855 * self.setColumnSize(rownum, row_len)2422 * self.setColumnSize(rownum, row_len)
1856 * if row_len == 0: continue2423 * if row_len == 0: continue
1857 */2424 */
1858 __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;}2425 __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;}
2426 __Pyx_GOTREF(__pyx_t_11);
2427 __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;}
2428 __Pyx_GOTREF(__pyx_t_10);
2429 __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;}
2430 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2431 __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;}
2432 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2433 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
2434 __Pyx_GIVEREF(__pyx_t_10);
2435 PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_1));
2436 __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
2437 __pyx_t_10 = 0;
2438 __pyx_t_1 = 0;
2439 __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;}
1859 __Pyx_GOTREF(__pyx_t_1);2440 __Pyx_GOTREF(__pyx_t_1);
1860 __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;}2441 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
1861 __Pyx_GOTREF(__pyx_t_4);2442 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
1862 __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;}2443 __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;}
1863 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
1864 __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;}
1865 __Pyx_GOTREF(((PyObject *)__pyx_t_6));
1866 PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
1867 __Pyx_GIVEREF(__pyx_t_4);
1868 PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_t_5));
1869 __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
1870 __pyx_t_4 = 0;
1871 __pyx_t_5 = 0;
1872 __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;}
1873 __Pyx_GOTREF(__pyx_t_5);
1874 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;2444 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1875 __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;2445 __pyx_v_row_len = __pyx_t_12;
1876 __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;}
1877 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
1878 __pyx_v_row_len = __pyx_t_3;
18792446
1880 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1862447 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":151
1881 * for rownum from 0 <= rownum < rows:2448 * for rownum from 0 <= rownum < rows:
1882 * row_len = len(rowDict.get(rownum, []))2449 * row_len = len(rowDict.get(rownum, []))
1883 * self.setColumnSize(rownum, row_len) # <<<<<<<<<<<<<<2450 * self.setColumnSize(rownum, row_len) # <<<<<<<<<<<<<<
@@ -1886,140 +2453,174 @@
1886 */2453 */
1887 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_v_rownum, __pyx_v_row_len);2454 ((struct __pyx_vtabstruct_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self->__pyx_vtab)->setColumnSize(__pyx_v_self, __pyx_v_rownum, __pyx_v_row_len);
18882455
1889 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1872456 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":152
1890 * row_len = len(rowDict.get(rownum, []))2457 * row_len = len(rowDict.get(rownum, []))
1891 * self.setColumnSize(rownum, row_len)2458 * self.setColumnSize(rownum, row_len)
1892 * if row_len == 0: continue # <<<<<<<<<<<<<<2459 * if row_len == 0: continue # <<<<<<<<<<<<<<
1893 * for colk in sorted(rowDict[rownum].keys()):2460 * for colk in sorted(rowDict[rownum].keys()):
1894 * val = float(rowDict[rownum][colk])2461 * val = float(rowDict[rownum][colk]) * row_factors[rownum]
1895 */2462 */
1896 __pyx_t_7 = (__pyx_v_row_len == 0);2463 __pyx_t_3 = (__pyx_v_row_len == 0);
1897 if (__pyx_t_7) {2464 if (__pyx_t_3) {
1898 goto __pyx_L3_continue;2465 goto __pyx_L4_continue;
1899 goto __pyx_L5;2466 goto __pyx_L6;
1900 }2467 }
1901 __pyx_L5:;2468 __pyx_L6:;
19022469
1903 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1882470 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":153
1904 * self.setColumnSize(rownum, row_len)2471 * self.setColumnSize(rownum, row_len)
1905 * if row_len == 0: continue2472 * if row_len == 0: continue
1906 * for colk in sorted(rowDict[rownum].keys()): # <<<<<<<<<<<<<<2473 * for colk in sorted(rowDict[rownum].keys()): # <<<<<<<<<<<<<<
1907 * val = float(rowDict[rownum][colk])2474 * val = float(rowDict[rownum][colk]) * row_factors[rownum]
1908 * if self.row_factors is not None:2475 * self.setValue(index, colk, val)
1909 */2476 */
1910 __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;}2477 __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;}
1911 __Pyx_GOTREF(__pyx_1);2478 __Pyx_GOTREF(__pyx_1);
1912 __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;}2479 __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;}
1913 __Pyx_GOTREF(__pyx_t_5);2480 __Pyx_GOTREF(__pyx_t_1);
1914 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2481 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1915 __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;}2482 __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;}
1916 __Pyx_GOTREF(__pyx_t_6);2483 __Pyx_GOTREF(__pyx_t_4);
1917 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;2484 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
1918 __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;}2485 __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;}
1919 __Pyx_GOTREF(((PyObject *)__pyx_t_5));2486 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
1920 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);2487 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
1921 __Pyx_GIVEREF(__pyx_t_6);2488 __Pyx_GIVEREF(__pyx_t_4);
1922 __pyx_t_6 = 0;2489 __pyx_t_4 = 0;
1923 __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;}2490 __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;}
1924 __Pyx_GOTREF(__pyx_t_6);2491 __Pyx_GOTREF(__pyx_t_4);
1925 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;2492 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
1926 if (PyList_CheckExact(__pyx_t_6) || PyTuple_CheckExact(__pyx_t_6)) {2493 if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
1927 __pyx_t_3 = 0; __pyx_t_5 = __pyx_t_6; __Pyx_INCREF(__pyx_t_5);2494 __pyx_t_12 = 0; __pyx_t_1 = __pyx_t_4; __Pyx_INCREF(__pyx_t_1);
1928 } else {2495 } else {
1929 __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;}2496 __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;}
1930 __Pyx_GOTREF(__pyx_t_5);2497 __Pyx_GOTREF(__pyx_t_1);
1931 }2498 }
1932 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;2499 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1933 for (;;) {2500 for (;;) {
1934 if (likely(PyList_CheckExact(__pyx_t_5))) {2501 if (likely(PyList_CheckExact(__pyx_t_1))) {
1935 if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;2502 if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_1)) break;
1936 __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++;2503 __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_12); __Pyx_INCREF(__pyx_t_4); __pyx_t_12++;
1937 } else if (likely(PyTuple_CheckExact(__pyx_t_5))) {2504 } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
1938 if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;2505 if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
1939 __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++;2506 __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_12); __Pyx_INCREF(__pyx_t_4); __pyx_t_12++;
1940 } else {2507 } else {
1941 __pyx_t_6 = PyIter_Next(__pyx_t_5);2508 __pyx_t_4 = PyIter_Next(__pyx_t_1);
1942 if (!__pyx_t_6) {2509 if (!__pyx_t_4) {
1943 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}2510 if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
1944 break;2511 break;
1945 }2512 }
1946 __Pyx_GOTREF(__pyx_t_6);2513 __Pyx_GOTREF(__pyx_t_4);
1947 }2514 }
1948 __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;}2515 __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;}
1949 __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;2516 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
1950 __pyx_v_colk = __pyx_t_8;2517 __pyx_v_colk = __pyx_t_13;
19512518
1952 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1892519 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":154
1953 * if row_len == 0: continue2520 * if row_len == 0: continue
1954 * for colk in sorted(rowDict[rownum].keys()):2521 * for colk in sorted(rowDict[rownum].keys()):
1955 * val = float(rowDict[rownum][colk]) # <<<<<<<<<<<<<<2522 * val = float(rowDict[rownum][colk]) * row_factors[rownum] # <<<<<<<<<<<<<<
1956 * if self.row_factors is not None:2523 * self.setValue(index, colk, val)
1957 * val /= sqrt(self.row_factors[rownum])2524 * index += 1
1958 */2525 */
1959 __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;}2526 __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;}
2527 __Pyx_GOTREF(__pyx_2);
2528 __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;}
1960 __Pyx_GOTREF(__pyx_1);2529 __Pyx_GOTREF(__pyx_1);
1961 __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;}2530 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
1962 __Pyx_GOTREF(__pyx_2);2531 __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;}
1963 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2532 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
1964 __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;}2533 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_1);
1965 __Pyx_GOTREF(((PyObject *)__pyx_t_6));2534 __Pyx_GIVEREF(__pyx_1);
1966 PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_2);2535 __pyx_1 = 0;
1967 __Pyx_GIVEREF(__pyx_2);2536 __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;}
1968 __pyx_2 = 0;2537 __Pyx_GOTREF(__pyx_t_11);
1969 __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;}2538 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
1970 __Pyx_GOTREF(__pyx_t_1);2539 __pyx_t_13 = __pyx_v_rownum;
1971 __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;2540 __pyx_t_14 = -1;
1972 __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;}2541 if (__pyx_t_13 < 0) {
1973 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;2542 __pyx_t_13 += __pyx_bshape_0_row_factors;
1974 __pyx_v_val = __pyx_t_9;2543 if (unlikely(__pyx_t_13 < 0)) __pyx_t_14 = 0;
2544 } else if (unlikely(__pyx_t_13 >= __pyx_bshape_0_row_factors)) __pyx_t_14 = 0;
2545 if (unlikely(__pyx_t_14 != -1)) {
2546 __Pyx_RaiseBufferIndexError(__pyx_t_14);
2547 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2548 }
2549 __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;}
2550 __Pyx_GOTREF(__pyx_t_4);
2551 __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;}
2552 __Pyx_GOTREF(__pyx_t_10);
2553 __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
2554 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2555 __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;}
2556 __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
2557 __pyx_v_val = __pyx_t_15;
19752558
1976 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1902559 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":155
1977 * for colk in sorted(rowDict[rownum].keys()):2560 * for colk in sorted(rowDict[rownum].keys()):
1978 * val = float(rowDict[rownum][colk])2561 * val = float(rowDict[rownum][colk]) * row_factors[rownum]
1979 * if self.row_factors is not None: # <<<<<<<<<<<<<<
1980 * val /= sqrt(self.row_factors[rownum])
1981 * self.setValue(index, colk, val)
1982 */
1983 __pyx_t_7 = (__pyx_v_self->row_factors != Py_None);
1984 if (__pyx_t_7) {
1985
1986 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":191
1987 * val = float(rowDict[rownum][colk])
1988 * if self.row_factors is not None:
1989 * val /= sqrt(self.row_factors[rownum]) # <<<<<<<<<<<<<<
1990 * self.setValue(index, colk, val)
1991 * index += 1
1992 */
1993 __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;}
1994 __Pyx_GOTREF(__pyx_1);
1995 __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;}
1996 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
1997 __pyx_v_val /= sqrt(__pyx_t_10);
1998 goto __pyx_L8;
1999 }
2000 __pyx_L8:;
2001
2002 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":192
2003 * if self.row_factors is not None:
2004 * val /= sqrt(self.row_factors[rownum])
2005 * self.setValue(index, colk, val) # <<<<<<<<<<<<<<2562 * self.setValue(index, colk, val) # <<<<<<<<<<<<<<
2006 * index += 12563 * index += 1
2007 * 2564 * # Transposed offset vectors.
2008 */2565 */
2009 ((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);2566 ((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);
20102567
2011 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1932568 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":156
2012 * val /= sqrt(self.row_factors[rownum])2569 * val = float(rowDict[rownum][colk]) * row_factors[rownum]
2013 * self.setValue(index, colk, val)2570 * self.setValue(index, colk, val)
2014 * index += 1 # <<<<<<<<<<<<<<2571 * index += 1 # <<<<<<<<<<<<<<
2015 * 2572 * # Transposed offset vectors.
2016 * 2573 * if self.offset_for_row is not None:
2017 */2574 */
2018 __pyx_v_index += 1;2575 __pyx_v_index += 1;
2019 }2576 }
2020 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;2577 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2021 __pyx_L3_continue:;2578 __pyx_L4_continue:;
2022 }2579 }
2580
2581 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":158
2582 * index += 1
2583 * # Transposed offset vectors.
2584 * if self.offset_for_row is not None: # <<<<<<<<<<<<<<
2585 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
2586 * if self.offset_for_col is not None:
2587 */
2588 __pyx_t_3 = (__pyx_v_self->offset_for_row != Py_None);
2589 if (__pyx_t_3) {
2590
2591 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":159
2592 * # Transposed offset vectors.
2593 * if self.offset_for_row is not None:
2594 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row) # <<<<<<<<<<<<<<
2595 * if self.offset_for_col is not None:
2596 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col)
2597 */
2598 __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);
2599 goto __pyx_L9;
2600 }
2601 __pyx_L9:;
2602
2603 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":160
2604 * if self.offset_for_row is not None:
2605 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
2606 * if self.offset_for_col is not None: # <<<<<<<<<<<<<<
2607 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col)
2608 *
2609 */
2610 __pyx_t_3 = (__pyx_v_self->offset_for_col != Py_None);
2611 if (__pyx_t_3) {
2612
2613 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":161
2614 * self.cmatrix.offset_for_col = self.toVector(self.offset_for_row)
2615 * if self.offset_for_col is not None:
2616 * self.cmatrix.offset_for_row = self.toVector(self.offset_for_col) # <<<<<<<<<<<<<<
2617 *
2618 *
2619 */
2620 __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);
2621 goto __pyx_L10;
2622 }
2623 __pyx_L10:;
20232624
2024 __pyx_r = Py_None; __Pyx_INCREF(Py_None);2625 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
2025 goto __pyx_L0;2626 goto __pyx_L0;
@@ -2027,33 +2628,82 @@
2027 __Pyx_XDECREF(__pyx_1);2628 __Pyx_XDECREF(__pyx_1);
2028 __Pyx_XDECREF(__pyx_2);2629 __Pyx_XDECREF(__pyx_2);
2029 __Pyx_XDECREF(__pyx_t_1);2630 __Pyx_XDECREF(__pyx_t_1);
2631 __Pyx_XDECREF(__pyx_t_2);
2030 __Pyx_XDECREF(__pyx_t_4);2632 __Pyx_XDECREF(__pyx_t_4);
2031 __Pyx_XDECREF(__pyx_t_5);2633 __Pyx_XDECREF(__pyx_t_10);
2032 __Pyx_XDECREF(__pyx_t_6);2634 __Pyx_XDECREF(__pyx_t_11);
2635 { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
2636 __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
2637 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2638 __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
2033 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.dictPack");2639 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.dictPack");
2034 __pyx_r = 0;2640 __pyx_r = 0;
2641 goto __pyx_L2;
2035 __pyx_L0:;2642 __pyx_L0:;
2643 __Pyx_SafeReleaseBuffer(&__pyx_bstruct_row_factors);
2644 __pyx_L2:;
2645 __Pyx_DECREF((PyObject *)__pyx_v_row_factors);
2036 __Pyx_XDECREF(__pyx_v_rowDict);2646 __Pyx_XDECREF(__pyx_v_rowDict);
2037 __Pyx_XGIVEREF(__pyx_r);2647 __Pyx_XGIVEREF(__pyx_r);
2038 __Pyx_FinishRefcountContext();2648 __Pyx_FinishRefcountContext();
2039 return __pyx_r;2649 return __pyx_r;
2040}2650}
20412651
2042/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1732652/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":132
2043 * index += 12653 * return temp
2044 * 2654 *
2045 * cpdef dictPack(self): # <<<<<<<<<<<<<<2655 * cpdef dictPack(self, row_norms=None): # <<<<<<<<<<<<<<
2046 * self.cmatrix = svdNewSMat(self.cols, self.rows, self.nonZero)2656 * cdef np.ndarray[DTYPE_t, ndim=1] row_factors # holds row _multiplication_ factors, possibly just 1.
2047 * self.transposed = 12657 * if row_norms is None:
2048 */2658 */
20492659
2050static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused); /*proto*/2660static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
2051static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *unused) {2661static PyObject *__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_dictPack(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
2662 PyObject *__pyx_v_row_norms = 0;
2052 PyObject *__pyx_r = NULL;2663 PyObject *__pyx_r = NULL;
2664 struct __pyx_opt_args_6svdlib_7_svdlib_9CSCMatrix_dictPack __pyx_1;
2053 PyObject *__pyx_t_1 = NULL;2665 PyObject *__pyx_t_1 = NULL;
2666 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_row_norms,0};
2054 __Pyx_SetupRefcountContext("dictPack");2667 __Pyx_SetupRefcountContext("dictPack");
2668 if (unlikely(__pyx_kwds)) {
2669 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
2670 PyObject* values[1] = {0};
2671 values[0] = Py_None;
2672 switch (PyTuple_GET_SIZE(__pyx_args)) {
2673 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
2674 case 0: break;
2675 default: goto __pyx_L5_argtuple_error;
2676 }
2677 switch (PyTuple_GET_SIZE(__pyx_args)) {
2678 case 0:
2679 if (kw_args > 1) {
2680 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_norms);
2681 if (unlikely(value)) { values[0] = value; kw_args--; }
2682 }
2683 }
2684 if (unlikely(kw_args > 0)) {
2685 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;}
2686 }
2687 __pyx_v_row_norms = values[0];
2688 } else {
2689 __pyx_v_row_norms = Py_None;
2690 switch (PyTuple_GET_SIZE(__pyx_args)) {
2691 case 1: __pyx_v_row_norms = PyTuple_GET_ITEM(__pyx_args, 0);
2692 case 0: break;
2693 default: goto __pyx_L5_argtuple_error;
2694 }
2695 }
2696 goto __pyx_L4_argument_unpacking_done;
2697 __pyx_L5_argtuple_error:;
2698 __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;}
2699 __pyx_L3_error:;
2700 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.dictPack");
2701 return NULL;
2702 __pyx_L4_argument_unpacking_done:;
2055 __Pyx_XDECREF(__pyx_r);2703 __Pyx_XDECREF(__pyx_r);
2056 __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;}2704 __pyx_1.__pyx_n = 1;
2705 __pyx_1.row_norms = __pyx_v_row_norms;
2706 __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;}
2057 __Pyx_GOTREF(__pyx_t_1);2707 __Pyx_GOTREF(__pyx_t_1);
2058 __pyx_r = __pyx_t_1;2708 __pyx_r = __pyx_t_1;
2059 __pyx_t_1 = 0;2709 __pyx_t_1 = 0;
@@ -2071,7 +2721,7 @@
2071 return __pyx_r;2721 return __pyx_r;
2072}2722}
20732723
2074/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1962724/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":164
2075 * 2725 *
2076 * 2726 *
2077 * def __repr__(self): # <<<<<<<<<<<<<<2727 * def __repr__(self): # <<<<<<<<<<<<<<
@@ -2084,7 +2734,7 @@
2084 PyObject *__pyx_r = NULL;2734 PyObject *__pyx_r = NULL;
2085 __Pyx_SetupRefcountContext("__repr__");2735 __Pyx_SetupRefcountContext("__repr__");
20862736
2087 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1972737 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":165
2088 * 2738 *
2089 * def __repr__(self):2739 * def __repr__(self):
2090 * return u'<CSCMatrix>' # <<<<<<<<<<<<<<2740 * return u'<CSCMatrix>' # <<<<<<<<<<<<<<
@@ -2092,8 +2742,8 @@
2092 * def __dealloc__(self):2742 * def __dealloc__(self):
2093 */2743 */
2094 __Pyx_XDECREF(__pyx_r);2744 __Pyx_XDECREF(__pyx_r);
2095 __Pyx_INCREF(((PyObject *)__pyx_kp_35));2745 __Pyx_INCREF(((PyObject *)__pyx_kp_36));
2096 __pyx_r = ((PyObject *)__pyx_kp_35);2746 __pyx_r = ((PyObject *)__pyx_kp_36);
2097 goto __pyx_L0;2747 goto __pyx_L0;
20982748
2099 __pyx_r = Py_None; __Pyx_INCREF(Py_None);2749 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -2103,7 +2753,7 @@
2103 return __pyx_r;2753 return __pyx_r;
2104}2754}
21052755
2106/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":1992756/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":167
2107 * return u'<CSCMatrix>'2757 * return u'<CSCMatrix>'
2108 * 2758 *
2109 * def __dealloc__(self): # <<<<<<<<<<<<<<2759 * def __dealloc__(self): # <<<<<<<<<<<<<<
@@ -2115,7 +2765,7 @@
2115static void __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___dealloc__(PyObject *__pyx_v_self) {2765static void __pyx_pf_6svdlib_7_svdlib_9CSCMatrix___dealloc__(PyObject *__pyx_v_self) {
2116 __Pyx_SetupRefcountContext("__dealloc__");2766 __Pyx_SetupRefcountContext("__dealloc__");
21172767
2118 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2002768 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":168
2119 * 2769 *
2120 * def __dealloc__(self):2770 * def __dealloc__(self):
2121 * svdFreeSMat(self.cmatrix) # <<<<<<<<<<<<<<2771 * svdFreeSMat(self.cmatrix) # <<<<<<<<<<<<<<
@@ -2127,7 +2777,7 @@
2127 __Pyx_FinishRefcountContext();2777 __Pyx_FinishRefcountContext();
2128}2778}
21292779
2130/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2022780/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":170
2131 * svdFreeSMat(self.cmatrix)2781 * svdFreeSMat(self.cmatrix)
2132 * 2782 *
2133 * cdef void setColumnSize(self, int col, int size): # <<<<<<<<<<<<<<2783 * cdef void setColumnSize(self, int col, int size): # <<<<<<<<<<<<<<
@@ -2143,7 +2793,7 @@
2143 PyObject *__pyx_t_4 = NULL;2793 PyObject *__pyx_t_4 = NULL;
2144 __Pyx_SetupRefcountContext("setColumnSize");2794 __Pyx_SetupRefcountContext("setColumnSize");
21452795
2146 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2032796 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":171
2147 * 2797 *
2148 * cdef void setColumnSize(self, int col, int size):2798 * cdef void setColumnSize(self, int col, int size):
2149 * if size == 0: # <<<<<<<<<<<<<<2799 * if size == 0: # <<<<<<<<<<<<<<
@@ -2153,29 +2803,29 @@
2153 __pyx_t_1 = (__pyx_v_size == 0);2803 __pyx_t_1 = (__pyx_v_size == 0);
2154 if (__pyx_t_1) {2804 if (__pyx_t_1) {
21552805
2156 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2042806 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":172
2157 * cdef void setColumnSize(self, int col, int size):2807 * cdef void setColumnSize(self, int col, int size):
2158 * if size == 0:2808 * if size == 0:
2159 * warnings.warn('Column %d is empty' % col) # <<<<<<<<<<<<<<2809 * warnings.warn('Column %d is empty' % col) # <<<<<<<<<<<<<<
2160 * self.cmatrix[0].pointr[0] = 02810 * self.cmatrix[0].pointr[0] = 0
2161 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size2811 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size
2162 */2812 */
2163 __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;}2813 __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;}
2164 __Pyx_GOTREF(__pyx_1);2814 __Pyx_GOTREF(__pyx_1);
2165 __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;}2815 __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;}
2166 __Pyx_GOTREF(__pyx_t_2);2816 __Pyx_GOTREF(__pyx_t_2);
2167 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2817 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2168 __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;}2818 __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;}
2169 __Pyx_GOTREF(__pyx_t_3);2819 __Pyx_GOTREF(__pyx_t_3);
2170 __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;}2820 __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;}
2171 __Pyx_GOTREF(__pyx_t_4);2821 __Pyx_GOTREF(__pyx_t_4);
2172 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;2822 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2173 __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;}2823 __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;}
2174 __Pyx_GOTREF(((PyObject *)__pyx_t_3));2824 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
2175 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);2825 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
2176 __Pyx_GIVEREF(__pyx_t_4);2826 __Pyx_GIVEREF(__pyx_t_4);
2177 __pyx_t_4 = 0;2827 __pyx_t_4 = 0;
2178 __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;}2828 __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;}
2179 __Pyx_GOTREF(__pyx_t_4);2829 __Pyx_GOTREF(__pyx_t_4);
2180 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;2830 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2181 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;2831 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -2184,7 +2834,7 @@
2184 }2834 }
2185 __pyx_L3:;2835 __pyx_L3:;
21862836
2187 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2052837 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":173
2188 * if size == 0:2838 * if size == 0:
2189 * warnings.warn('Column %d is empty' % col)2839 * warnings.warn('Column %d is empty' % col)
2190 * self.cmatrix[0].pointr[0] = 0 # <<<<<<<<<<<<<<2840 * self.cmatrix[0].pointr[0] = 0 # <<<<<<<<<<<<<<
@@ -2193,12 +2843,12 @@
2193 */2843 */
2194 ((__pyx_v_self->cmatrix[0]).pointr[0]) = 0;2844 ((__pyx_v_self->cmatrix[0]).pointr[0]) = 0;
21952845
2196 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2062846 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":174
2197 * warnings.warn('Column %d is empty' % col)2847 * warnings.warn('Column %d is empty' % col)
2198 * self.cmatrix[0].pointr[0] = 02848 * self.cmatrix[0].pointr[0] = 0
2199 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size # <<<<<<<<<<<<<<2849 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size # <<<<<<<<<<<<<<
2200 * 2850 *
2201 * cdef void setValue(self, int index, int rowind, float value):2851 * cdef void setValue(self, int index, int rowind, double value):
2202 */2852 */
2203 (__pyx_v_self->cmatrix->pointr[(__pyx_v_col + 1)]) = ((__pyx_v_self->cmatrix->pointr[__pyx_v_col]) + __pyx_v_size);2853 (__pyx_v_self->cmatrix->pointr[(__pyx_v_col + 1)]) = ((__pyx_v_self->cmatrix->pointr[__pyx_v_col]) + __pyx_v_size);
22042854
@@ -2213,15 +2863,15 @@
2213 __Pyx_FinishRefcountContext();2863 __Pyx_FinishRefcountContext();
2214}2864}
22152865
2216/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2082866/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":176
2217 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size2867 * self.cmatrix.pointr[col+1] = self.cmatrix.pointr[col] + size
2218 * 2868 *
2219 * cdef void setValue(self, int index, int rowind, float value): # <<<<<<<<<<<<<<2869 * cdef void setValue(self, int index, int rowind, double value): # <<<<<<<<<<<<<<
2220 * if value == 0:2870 * if value == 0:
2221 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))2871 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
2222 */2872 */
22232873
2224static 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) {2874static 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) {
2225 PyObject *__pyx_1 = 0;2875 PyObject *__pyx_1 = 0;
2226 int __pyx_t_1;2876 int __pyx_t_1;
2227 PyObject *__pyx_t_2 = NULL;2877 PyObject *__pyx_t_2 = NULL;
@@ -2230,9 +2880,9 @@
2230 PyObject *__pyx_t_5 = NULL;2880 PyObject *__pyx_t_5 = NULL;
2231 __Pyx_SetupRefcountContext("setValue");2881 __Pyx_SetupRefcountContext("setValue");
22322882
2233 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2092883 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":177
2234 * 2884 *
2235 * cdef void setValue(self, int index, int rowind, float value):2885 * cdef void setValue(self, int index, int rowind, double value):
2236 * if value == 0: # <<<<<<<<<<<<<<2886 * if value == 0: # <<<<<<<<<<<<<<
2237 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))2887 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
2238 * self.cmatrix.rowind[index] = rowind2888 * self.cmatrix.rowind[index] = rowind
@@ -2240,23 +2890,23 @@
2240 __pyx_t_1 = (__pyx_v_value == 0);2890 __pyx_t_1 = (__pyx_v_value == 0);
2241 if (__pyx_t_1) {2891 if (__pyx_t_1) {
22422892
2243 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2102893 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":178
2244 * cdef void setValue(self, int index, int rowind, float value):2894 * cdef void setValue(self, int index, int rowind, double value):
2245 * if value == 0:2895 * if value == 0:
2246 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index)) # <<<<<<<<<<<<<<2896 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index)) # <<<<<<<<<<<<<<
2247 * self.cmatrix.rowind[index] = rowind2897 * self.cmatrix.rowind[index] = rowind
2248 * self.cmatrix.value[index] = value2898 * self.cmatrix.value[index] = value
2249 */2899 */
2250 __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;}2900 __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;}
2251 __Pyx_GOTREF(__pyx_1);2901 __Pyx_GOTREF(__pyx_1);
2252 __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;}2902 __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;}
2253 __Pyx_GOTREF(__pyx_t_2);2903 __Pyx_GOTREF(__pyx_t_2);
2254 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2904 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2255 __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;}2905 __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;}
2256 __Pyx_GOTREF(__pyx_t_3);2906 __Pyx_GOTREF(__pyx_t_3);
2257 __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;}2907 __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;}
2258 __Pyx_GOTREF(__pyx_t_4);2908 __Pyx_GOTREF(__pyx_t_4);
2259 __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;}2909 __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;}
2260 __Pyx_GOTREF(((PyObject *)__pyx_t_5));2910 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2261 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);2911 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
2262 __Pyx_GIVEREF(__pyx_t_3);2912 __Pyx_GIVEREF(__pyx_t_3);
@@ -2264,15 +2914,15 @@
2264 __Pyx_GIVEREF(__pyx_t_4);2914 __Pyx_GIVEREF(__pyx_t_4);
2265 __pyx_t_3 = 0;2915 __pyx_t_3 = 0;
2266 __pyx_t_4 = 0;2916 __pyx_t_4 = 0;
2267 __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;}2917 __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;}
2268 __Pyx_GOTREF(__pyx_t_4);2918 __Pyx_GOTREF(__pyx_t_4);
2269 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;2919 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
2270 __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;}2920 __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;}
2271 __Pyx_GOTREF(((PyObject *)__pyx_t_5));2921 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2272 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);2922 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
2273 __Pyx_GIVEREF(__pyx_t_4);2923 __Pyx_GIVEREF(__pyx_t_4);
2274 __pyx_t_4 = 0;2924 __pyx_t_4 = 0;
2275 __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;}2925 __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;}
2276 __Pyx_GOTREF(__pyx_t_4);2926 __Pyx_GOTREF(__pyx_t_4);
2277 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;2927 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2278 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;2928 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -2281,7 +2931,7 @@
2281 }2931 }
2282 __pyx_L3:;2932 __pyx_L3:;
22832933
2284 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2112934 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":179
2285 * if value == 0:2935 * if value == 0:
2286 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))2936 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
2287 * self.cmatrix.rowind[index] = rowind # <<<<<<<<<<<<<<2937 * self.cmatrix.rowind[index] = rowind # <<<<<<<<<<<<<<
@@ -2290,7 +2940,7 @@
2290 */2940 */
2291 (__pyx_v_self->cmatrix->rowind[__pyx_v_index]) = __pyx_v_rowind;2941 (__pyx_v_self->cmatrix->rowind[__pyx_v_index]) = __pyx_v_rowind;
22922942
2293 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2122943 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":180
2294 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))2944 * warnings.warn('Matrix has zero value (row %d, index %d)' % (rowind, index))
2295 * self.cmatrix.rowind[index] = rowind2945 * self.cmatrix.rowind[index] = rowind
2296 * self.cmatrix.value[index] = value # <<<<<<<<<<<<<<2946 * self.cmatrix.value[index] = value # <<<<<<<<<<<<<<
@@ -2311,7 +2961,7 @@
2311 __Pyx_FinishRefcountContext();2961 __Pyx_FinishRefcountContext();
2312}2962}
23132963
2314/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2202964/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":188
2315 * 2965 *
2316 * 2966 *
2317 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<2967 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<
@@ -2331,18 +2981,18 @@
2331 if (unlikely(__pyx_skip_dispatch)) ;2981 if (unlikely(__pyx_skip_dispatch)) ;
2332 /* Check if overriden in Python */2982 /* Check if overriden in Python */
2333 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {2983 else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
2334 __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;}2984 __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;}
2335 __Pyx_GOTREF(__pyx_1);2985 __Pyx_GOTREF(__pyx_1);
2336 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_svdA)) {2986 if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_6svdlib_7_svdlib_9CSCMatrix_svdA)) {
2337 __Pyx_XDECREF(__pyx_r);2987 __Pyx_XDECREF(__pyx_r);
2338 __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;}2988 __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;}
2339 __Pyx_GOTREF(__pyx_t_1);2989 __Pyx_GOTREF(__pyx_t_1);
2340 __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;}2990 __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;}
2341 __Pyx_GOTREF(((PyObject *)__pyx_t_2));2991 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
2342 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);2992 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
2343 __Pyx_GIVEREF(__pyx_t_1);2993 __Pyx_GIVEREF(__pyx_t_1);
2344 __pyx_t_1 = 0;2994 __pyx_t_1 = 0;
2345 __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;}2995 __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;}
2346 __Pyx_GOTREF(__pyx_t_1);2996 __Pyx_GOTREF(__pyx_t_1);
2347 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;2997 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2348 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;2998 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -2353,7 +3003,7 @@
2353 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3003 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2354 }3004 }
23553005
2356 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2223006 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":190
2357 * cpdef object svdA(self, int k):3007 * cpdef object svdA(self, int k):
2358 * cdef svdrec *svdrec3008 * cdef svdrec *svdrec
2359 * svdrec = svdLAS2A(self.cmatrix, k) # <<<<<<<<<<<<<<3009 * svdrec = svdLAS2A(self.cmatrix, k) # <<<<<<<<<<<<<<
@@ -2362,7 +3012,7 @@
2362 */3012 */
2363 __pyx_v_svdrec = svdLAS2A(__pyx_v_self->cmatrix, __pyx_v_k);3013 __pyx_v_svdrec = svdLAS2A(__pyx_v_self->cmatrix, __pyx_v_k);
23643014
2365 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2233015 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":191
2366 * cdef svdrec *svdrec3016 * cdef svdrec *svdrec
2367 * svdrec = svdLAS2A(self.cmatrix, k)3017 * svdrec = svdLAS2A(self.cmatrix, k)
2368 * return wrapSVDrec(svdrec, self.transposed) # <<<<<<<<<<<<<<3018 * return wrapSVDrec(svdrec, self.transposed) # <<<<<<<<<<<<<<
@@ -2370,7 +3020,7 @@
2370 * @cython.boundscheck(False)3020 * @cython.boundscheck(False)
2371 */3021 */
2372 __Pyx_XDECREF(__pyx_r);3022 __Pyx_XDECREF(__pyx_r);
2373 __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;}3023 __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;}
2374 __Pyx_GOTREF(__pyx_t_1);3024 __Pyx_GOTREF(__pyx_t_1);
2375 __pyx_r = __pyx_t_1;3025 __pyx_r = __pyx_t_1;
2376 __pyx_t_1 = 0;3026 __pyx_t_1 = 0;
@@ -2390,7 +3040,7 @@
2390 return __pyx_r;3040 return __pyx_r;
2391}3041}
23923042
2393/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2203043/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":188
2394 * 3044 *
2395 * 3045 *
2396 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<3046 * cpdef object svdA(self, int k): # <<<<<<<<<<<<<<
@@ -2405,7 +3055,7 @@
2405 PyObject *__pyx_t_1 = NULL;3055 PyObject *__pyx_t_1 = NULL;
2406 __Pyx_SetupRefcountContext("svdA");3056 __Pyx_SetupRefcountContext("svdA");
2407 assert(__pyx_arg_k); {3057 assert(__pyx_arg_k); {
2408 __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;}3058 __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;}
2409 }3059 }
2410 goto __pyx_L4_argument_unpacking_done;3060 goto __pyx_L4_argument_unpacking_done;
2411 __pyx_L3_error:;3061 __pyx_L3_error:;
@@ -2413,7 +3063,7 @@
2413 return NULL;3063 return NULL;
2414 __pyx_L4_argument_unpacking_done:;3064 __pyx_L4_argument_unpacking_done:;
2415 __Pyx_XDECREF(__pyx_r);3065 __Pyx_XDECREF(__pyx_r);
2416 __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;}3066 __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;}
2417 __Pyx_GOTREF(__pyx_t_1);3067 __Pyx_GOTREF(__pyx_t_1);
2418 __pyx_r = __pyx_t_1;3068 __pyx_r = __pyx_t_1;
2419 __pyx_t_1 = 0;3069 __pyx_t_1 = 0;
@@ -2431,7 +3081,7 @@
2431 return __pyx_r;3081 return __pyx_r;
2432}3082}
24333083
2434/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2263084/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":194
2435 * 3085 *
2436 * @cython.boundscheck(False)3086 * @cython.boundscheck(False)
2437 * def isvd(self, int k=50, int niter=100, double lrate=.001): # <<<<<<<<<<<<<<3087 * def isvd(self, int k=50, int niter=100, double lrate=.001): # <<<<<<<<<<<<<<
@@ -2533,20 +3183,20 @@
2533 }3183 }
2534 }3184 }
2535 if (unlikely(kw_args > 0)) {3185 if (unlikely(kw_args > 0)) {
2536 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;}3186 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;}
2537 }3187 }
2538 if (values[0]) {3188 if (values[0]) {
2539 __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;}3189 __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;}
2540 } else {3190 } else {
2541 __pyx_v_k = 50;3191 __pyx_v_k = 50;
2542 }3192 }
2543 if (values[1]) {3193 if (values[1]) {
2544 __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;}3194 __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;}
2545 } else {3195 } else {
2546 __pyx_v_niter = 100;3196 __pyx_v_niter = 100;
2547 }3197 }
2548 if (values[2]) {3198 if (values[2]) {
2549 __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;}3199 __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;}
2550 } else {3200 } else {
2551 __pyx_v_lrate = 0.001;3201 __pyx_v_lrate = 0.001;
2552 }3202 }
@@ -2555,16 +3205,16 @@
2555 __pyx_v_niter = 100;3205 __pyx_v_niter = 100;
2556 __pyx_v_lrate = 0.001;3206 __pyx_v_lrate = 0.001;
2557 switch (PyTuple_GET_SIZE(__pyx_args)) {3207 switch (PyTuple_GET_SIZE(__pyx_args)) {
2558 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;}3208 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;}
2559 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;}3209 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;}
2560 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;}3210 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;}
2561 case 0: break;3211 case 0: break;
2562 default: goto __pyx_L5_argtuple_error;3212 default: goto __pyx_L5_argtuple_error;
2563 }3213 }
2564 }3214 }
2565 goto __pyx_L4_argument_unpacking_done;3215 goto __pyx_L4_argument_unpacking_done;
2566 __pyx_L5_argtuple_error:;3216 __pyx_L5_argtuple_error:;
2567 __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;}3217 __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;}
2568 __pyx_L3_error:;3218 __pyx_L3_error:;
2569 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.isvd");3219 __Pyx_AddTraceback("svdlib._svdlib.CSCMatrix.isvd");
2570 return NULL;3220 return NULL;
@@ -2578,29 +3228,29 @@
2578 __pyx_bstruct_u.buf = NULL;3228 __pyx_bstruct_u.buf = NULL;
2579 __pyx_bstruct_v.buf = NULL;3229 __pyx_bstruct_v.buf = NULL;
25803230
2581 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2273231 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":195
2582 * @cython.boundscheck(False)3232 * @cython.boundscheck(False)
2583 * def isvd(self, int k=50, int niter=100, double lrate=.001):3233 * def isvd(self, int k=50, int niter=100, double lrate=.001):
2584 * from csc.divisi.tensor import DenseTensor # <<<<<<<<<<<<<<3234 * from csc.divisi.tensor import DenseTensor # <<<<<<<<<<<<<<
2585 * cdef smat* A = self.cmatrix3235 * cdef smat* A = self.cmatrix
2586 * print "COMPUTING INCREMENTAL SVD"3236 * print "COMPUTING INCREMENTAL SVD"
2587 */3237 */
2588 __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;}3238 __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;}
2589 __Pyx_GOTREF(((PyObject *)__pyx_t_1));3239 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2590 __Pyx_INCREF(__pyx_kp_DenseTensor);3240 __Pyx_INCREF(__pyx_kp_DenseTensor);
2591 PyList_SET_ITEM(__pyx_t_1, 0, __pyx_kp_DenseTensor);3241 PyList_SET_ITEM(__pyx_t_1, 0, __pyx_kp_DenseTensor);
2592 __Pyx_GIVEREF(__pyx_kp_DenseTensor);3242 __Pyx_GIVEREF(__pyx_kp_DenseTensor);
2593 __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;}3243 __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;}
2594 __Pyx_GOTREF(__pyx_1);3244 __Pyx_GOTREF(__pyx_1);
2595 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;3245 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2596 __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;}3246 __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;}
2597 __Pyx_GOTREF(__pyx_2);3247 __Pyx_GOTREF(__pyx_2);
2598 __Pyx_DECREF(__pyx_v_DenseTensor);3248 __Pyx_DECREF(__pyx_v_DenseTensor);
2599 __pyx_v_DenseTensor = __pyx_2;3249 __pyx_v_DenseTensor = __pyx_2;
2600 __pyx_2 = 0;3250 __pyx_2 = 0;
2601 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3251 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
26023252
2603 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2283253 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":196
2604 * def isvd(self, int k=50, int niter=100, double lrate=.001):3254 * def isvd(self, int k=50, int niter=100, double lrate=.001):
2605 * from csc.divisi.tensor import DenseTensor3255 * from csc.divisi.tensor import DenseTensor
2606 * cdef smat* A = self.cmatrix # <<<<<<<<<<<<<<3256 * cdef smat* A = self.cmatrix # <<<<<<<<<<<<<<
@@ -2609,29 +3259,29 @@
2609 */3259 */
2610 __pyx_v_A = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cmatrix;3260 __pyx_v_A = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->cmatrix;
26113261
2612 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2293262 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":197
2613 * from csc.divisi.tensor import DenseTensor3263 * from csc.divisi.tensor import DenseTensor
2614 * cdef smat* A = self.cmatrix3264 * cdef smat* A = self.cmatrix
2615 * print "COMPUTING INCREMENTAL SVD" # <<<<<<<<<<<<<<3265 * print "COMPUTING INCREMENTAL SVD" # <<<<<<<<<<<<<<
2616 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)3266 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)
2617 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)3267 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
2618 */3268 */
2619 if (__Pyx_PrintOne(__pyx_kp_39) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3269 if (__Pyx_PrintOne(__pyx_kp_40) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
26203270
2621 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2303271 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":198
2622 * cdef smat* A = self.cmatrix3272 * cdef smat* A = self.cmatrix
2623 * print "COMPUTING INCREMENTAL SVD"3273 * print "COMPUTING INCREMENTAL SVD"
2624 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<3274 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<
2625 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)3275 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
2626 * 3276 *
2627 */3277 */
2628 __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;}3278 __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;}
2629 __Pyx_GOTREF(__pyx_t_1);3279 __Pyx_GOTREF(__pyx_t_1);
2630 __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;}3280 __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;}
2631 __Pyx_GOTREF(__pyx_t_2);3281 __Pyx_GOTREF(__pyx_t_2);
2632 __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;}3282 __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;}
2633 __Pyx_GOTREF(__pyx_t_3);3283 __Pyx_GOTREF(__pyx_t_3);
2634 __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;}3284 __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;}
2635 __Pyx_GOTREF(((PyObject *)__pyx_t_4));3285 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2636 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);3286 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
2637 __Pyx_GIVEREF(__pyx_t_1);3287 __Pyx_GIVEREF(__pyx_t_1);
@@ -2642,26 +3292,26 @@
2642 __pyx_t_1 = 0;3292 __pyx_t_1 = 0;
2643 __pyx_t_2 = 0;3293 __pyx_t_2 = 0;
2644 __pyx_t_3 = 0;3294 __pyx_t_3 = 0;
2645 __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;}3295 __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;}
2646 __Pyx_GOTREF(__pyx_t_3);3296 __Pyx_GOTREF(__pyx_t_3);
2647 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;3297 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
2648 if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3298 if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2649 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;3299 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
26503300
2651 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2313301 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":199
2652 * print "COMPUTING INCREMENTAL SVD"3302 * print "COMPUTING INCREMENTAL SVD"
2653 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)3303 * print "ROWS: %d, COLUMNS: %d, VALS: %d" % (A.rows, A.cols, A.vals)
2654 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter) # <<<<<<<<<<<<<<3304 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter) # <<<<<<<<<<<<<<
2655 * 3305 *
2656 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)3306 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)
2657 */3307 */
2658 __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;}3308 __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;}
2659 __Pyx_GOTREF(__pyx_t_3);3309 __Pyx_GOTREF(__pyx_t_3);
2660 __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;}3310 __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;}
2661 __Pyx_GOTREF(__pyx_t_4);3311 __Pyx_GOTREF(__pyx_t_4);
2662 __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;}3312 __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;}
2663 __Pyx_GOTREF(__pyx_t_2);3313 __Pyx_GOTREF(__pyx_t_2);
2664 __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;}3314 __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;}
2665 __Pyx_GOTREF(((PyObject *)__pyx_t_1));3315 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2666 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);3316 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
2667 __Pyx_GIVEREF(__pyx_t_3);3317 __Pyx_GIVEREF(__pyx_t_3);
@@ -2672,34 +3322,34 @@
2672 __pyx_t_3 = 0;3322 __pyx_t_3 = 0;
2673 __pyx_t_4 = 0;3323 __pyx_t_4 = 0;
2674 __pyx_t_2 = 0;3324 __pyx_t_2 = 0;
2675 __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;}3325 __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;}
2676 __Pyx_GOTREF(__pyx_t_2);3326 __Pyx_GOTREF(__pyx_t_2);
2677 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;3327 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2678 if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3328 if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2679 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;3329 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
26803330
2681 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2333331 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":201
2682 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)3332 * print "K: %d, LEARNING_RATE: %r, ITERATIONS: %d" % (k, lrate, niter)
2683 * 3333 *
2684 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<3334 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<
2685 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001)3335 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001)
2686 * 3336 *
2687 */3337 */
2688 __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;}3338 __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;}
2689 __Pyx_GOTREF(__pyx_1);3339 __Pyx_GOTREF(__pyx_1);
2690 __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;}3340 __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;}
2691 __Pyx_GOTREF(__pyx_t_2);3341 __Pyx_GOTREF(__pyx_t_2);
2692 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3342 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2693 __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;}3343 __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;}
2694 __Pyx_GOTREF(__pyx_2);3344 __Pyx_GOTREF(__pyx_2);
2695 __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;}3345 __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;}
2696 __Pyx_GOTREF(__pyx_t_1);3346 __Pyx_GOTREF(__pyx_t_1);
2697 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3347 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2698 __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;}3348 __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;}
2699 __Pyx_GOTREF(__pyx_t_4);3349 __Pyx_GOTREF(__pyx_t_4);
2700 __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;}3350 __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;}
2701 __Pyx_GOTREF(__pyx_t_3);3351 __Pyx_GOTREF(__pyx_t_3);
2702 __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;}3352 __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;}
2703 __Pyx_GOTREF(((PyObject *)__pyx_t_5));3353 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2704 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);3354 PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
2705 __Pyx_GIVEREF(__pyx_t_4);3355 __Pyx_GIVEREF(__pyx_t_4);
@@ -2707,25 +3357,25 @@
2707 __Pyx_GIVEREF(__pyx_t_3);3357 __Pyx_GIVEREF(__pyx_t_3);
2708 __pyx_t_4 = 0;3358 __pyx_t_4 = 0;
2709 __pyx_t_3 = 0;3359 __pyx_t_3 = 0;
2710 __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;}3360 __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;}
2711 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3361 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
2712 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));3362 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));
2713 __Pyx_GIVEREF(((PyObject *)__pyx_t_5));3363 __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
2714 __pyx_t_5 = 0;3364 __pyx_t_5 = 0;
2715 __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3365 __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2716 __Pyx_GOTREF(((PyObject *)__pyx_1));3366 __Pyx_GOTREF(((PyObject *)__pyx_1));
2717 __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;}3367 __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;}
2718 __Pyx_GOTREF(__pyx_2);3368 __Pyx_GOTREF(__pyx_2);
2719 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;}3369 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;}
2720 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3370 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2721 __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;}3371 __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;}
2722 __Pyx_GOTREF(__pyx_t_5);3372 __Pyx_GOTREF(__pyx_t_5);
2723 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3373 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2724 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3374 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
2725 __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;3375 __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
2726 __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;}3376 __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;}
2727 __Pyx_GOTREF(__pyx_t_3);3377 __Pyx_GOTREF(__pyx_t_3);
2728 __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;}3378 __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;}
2729 __Pyx_GOTREF(((PyObject *)__pyx_t_1));3379 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2730 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);3380 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
2731 __Pyx_GIVEREF(__pyx_t_5);3381 __Pyx_GIVEREF(__pyx_t_5);
@@ -2733,17 +3383,17 @@
2733 __Pyx_GIVEREF(__pyx_t_3);3383 __Pyx_GIVEREF(__pyx_t_3);
2734 __pyx_t_5 = 0;3384 __pyx_t_5 = 0;
2735 __pyx_t_3 = 0;3385 __pyx_t_3 = 0;
2736 __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;}3386 __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;}
2737 __Pyx_GOTREF(__pyx_t_3);3387 __Pyx_GOTREF(__pyx_t_3);
2738 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;3388 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2739 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;3389 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2740 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;}3390 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;}
2741 __pyx_t_6 = ((PyArrayObject *)__pyx_t_3);3391 __pyx_t_6 = ((PyArrayObject *)__pyx_t_3);
2742 {3392 {
2743 __Pyx_BufFmt_StackElem __pyx_stack[1];3393 __Pyx_BufFmt_StackElem __pyx_stack[1];
2744 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)) {3394 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)) {
2745 __pyx_v_u = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_u.buf = NULL;3395 __pyx_v_u = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_u.buf = NULL;
2746 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3396 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2747 } else {__pyx_bstride_0_u = __pyx_bstruct_u.strides[0]; __pyx_bstride_1_u = __pyx_bstruct_u.strides[1];3397 } else {__pyx_bstride_0_u = __pyx_bstruct_u.strides[0]; __pyx_bstride_1_u = __pyx_bstruct_u.strides[1];
2748 __pyx_bshape_0_u = __pyx_bstruct_u.shape[0]; __pyx_bshape_1_u = __pyx_bstruct_u.shape[1];3398 __pyx_bshape_0_u = __pyx_bstruct_u.shape[0]; __pyx_bshape_1_u = __pyx_bstruct_u.shape[1];
2749 }3399 }
@@ -2752,28 +3402,28 @@
2752 __pyx_v_u = ((PyArrayObject *)__pyx_t_3);3402 __pyx_v_u = ((PyArrayObject *)__pyx_t_3);
2753 __pyx_t_3 = 0;3403 __pyx_t_3 = 0;
27543404
2755 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2343405 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":202
2756 * 3406 *
2757 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)3407 * cdef np.ndarray[DTYPE_t, ndim=2] u = np.add(np.zeros((A.rows, k), dtype=DTYPE), .001)
2758 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<3408 * cdef np.ndarray[DTYPE_t, ndim=2] v = np.add(np.zeros((A.cols, k), dtype=DTYPE), .001) # <<<<<<<<<<<<<<
2759 * 3409 *
2760 * # Maintain a cache of dot-products up to the current axis3410 * # Maintain a cache of dot-products up to the current axis
2761 */3411 */
2762 __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;}3412 __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;}
2763 __Pyx_GOTREF(__pyx_2);3413 __Pyx_GOTREF(__pyx_2);
2764 __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;}3414 __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;}
2765 __Pyx_GOTREF(__pyx_t_3);3415 __Pyx_GOTREF(__pyx_t_3);
2766 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3416 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
2767 __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;}3417 __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;}
2768 __Pyx_GOTREF(__pyx_1);3418 __Pyx_GOTREF(__pyx_1);
2769 __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;}3419 __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;}
2770 __Pyx_GOTREF(__pyx_t_1);3420 __Pyx_GOTREF(__pyx_t_1);
2771 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3421 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2772 __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;}3422 __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;}
2773 __Pyx_GOTREF(__pyx_t_2);3423 __Pyx_GOTREF(__pyx_t_2);
2774 __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;}3424 __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;}
2775 __Pyx_GOTREF(__pyx_t_5);3425 __Pyx_GOTREF(__pyx_t_5);
2776 __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;}3426 __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;}
2777 __Pyx_GOTREF(((PyObject *)__pyx_t_4));3427 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
2778 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);3428 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
2779 __Pyx_GIVEREF(__pyx_t_2);3429 __Pyx_GIVEREF(__pyx_t_2);
@@ -2781,25 +3431,25 @@
2781 __Pyx_GIVEREF(__pyx_t_5);3431 __Pyx_GIVEREF(__pyx_t_5);
2782 __pyx_t_2 = 0;3432 __pyx_t_2 = 0;
2783 __pyx_t_5 = 0;3433 __pyx_t_5 = 0;
2784 __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;}3434 __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;}
2785 __Pyx_GOTREF(((PyObject *)__pyx_t_5));3435 __Pyx_GOTREF(((PyObject *)__pyx_t_5));
2786 PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_4));3436 PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_4));
2787 __Pyx_GIVEREF(((PyObject *)__pyx_t_4));3437 __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
2788 __pyx_t_4 = 0;3438 __pyx_t_4 = 0;
2789 __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3439 __pyx_2 = PyDict_New(); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2790 __Pyx_GOTREF(((PyObject *)__pyx_2));3440 __Pyx_GOTREF(((PyObject *)__pyx_2));
2791 __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;}3441 __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;}
2792 __Pyx_GOTREF(__pyx_1);3442 __Pyx_GOTREF(__pyx_1);
2793 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;}3443 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;}
2794 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3444 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
2795 __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;}3445 __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;}
2796 __Pyx_GOTREF(__pyx_t_4);3446 __Pyx_GOTREF(__pyx_t_4);
2797 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3447 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
2798 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;3448 __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
2799 __Pyx_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;3449 __Pyx_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
2800 __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;}3450 __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;}
2801 __Pyx_GOTREF(__pyx_t_5);3451 __Pyx_GOTREF(__pyx_t_5);
2802 __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;}3452 __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;}
2803 __Pyx_GOTREF(((PyObject *)__pyx_t_1));3453 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
2804 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);3454 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
2805 __Pyx_GIVEREF(__pyx_t_4);3455 __Pyx_GIVEREF(__pyx_t_4);
@@ -2807,17 +3457,17 @@
2807 __Pyx_GIVEREF(__pyx_t_5);3457 __Pyx_GIVEREF(__pyx_t_5);
2808 __pyx_t_4 = 0;3458 __pyx_t_4 = 0;
2809 __pyx_t_5 = 0;3459 __pyx_t_5 = 0;
2810 __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;}3460 __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;}
2811 __Pyx_GOTREF(__pyx_t_5);3461 __Pyx_GOTREF(__pyx_t_5);
2812 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;3462 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
2813 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;3463 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
2814 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;}3464 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;}
2815 __pyx_t_7 = ((PyArrayObject *)__pyx_t_5);3465 __pyx_t_7 = ((PyArrayObject *)__pyx_t_5);
2816 {3466 {
2817 __Pyx_BufFmt_StackElem __pyx_stack[1];3467 __Pyx_BufFmt_StackElem __pyx_stack[1];
2818 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)) {3468 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)) {
2819 __pyx_v_v = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_v.buf = NULL;3469 __pyx_v_v = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_v.buf = NULL;
2820 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}3470 {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
2821 } else {__pyx_bstride_0_v = __pyx_bstruct_v.strides[0]; __pyx_bstride_1_v = __pyx_bstruct_v.strides[1];3471 } else {__pyx_bstride_0_v = __pyx_bstruct_v.strides[0]; __pyx_bstride_1_v = __pyx_bstruct_v.strides[1];
2822 __pyx_bshape_0_v = __pyx_bstruct_v.shape[0]; __pyx_bshape_1_v = __pyx_bstruct_v.shape[1];3472 __pyx_bshape_0_v = __pyx_bstruct_v.shape[0]; __pyx_bshape_1_v = __pyx_bstruct_v.shape[1];
2823 }3473 }
@@ -2826,7 +3476,7 @@
2826 __pyx_v_v = ((PyArrayObject *)__pyx_t_5);3476 __pyx_v_v = ((PyArrayObject *)__pyx_t_5);
2827 __pyx_t_5 = 0;3477 __pyx_t_5 = 0;
28283478
2829 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2373479 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":205
2830 * 3480 *
2831 * # Maintain a cache of dot-products up to the current axis3481 * # Maintain a cache of dot-products up to the current axis
2832 * cdef smat* predicted = svdNewSMat(A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<3482 * cdef smat* predicted = svdNewSMat(A.rows, A.cols, A.vals) # <<<<<<<<<<<<<<
@@ -2835,7 +3485,7 @@
2835 */3485 */
2836 __pyx_v_predicted = svdNewSMat(__pyx_v_A->rows, __pyx_v_A->cols, __pyx_v_A->vals);3486 __pyx_v_predicted = svdNewSMat(__pyx_v_A->rows, __pyx_v_A->cols, __pyx_v_A->vals);
28373487
2838 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2463488 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":214
2839 * # (This should be done with memcpy, but i'm not certain3489 * # (This should be done with memcpy, but i'm not certain
2840 * # how to do that here)3490 * # how to do that here)
2841 * for i in range(A.cols + 1): # <<<<<<<<<<<<<<3491 * for i in range(A.cols + 1): # <<<<<<<<<<<<<<
@@ -2845,7 +3495,7 @@
2845 for (__pyx_t_8 = 0; __pyx_t_8 < (__pyx_v_A->cols + 1); __pyx_t_8+=1) {3495 for (__pyx_t_8 = 0; __pyx_t_8 < (__pyx_v_A->cols + 1); __pyx_t_8+=1) {
2846 __pyx_v_i = __pyx_t_8;3496 __pyx_v_i = __pyx_t_8;
28473497
2848 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2473498 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":215
2849 * # how to do that here)3499 * # how to do that here)
2850 * for i in range(A.cols + 1):3500 * for i in range(A.cols + 1):
2851 * predicted.pointr[i] = A.pointr[i] # <<<<<<<<<<<<<<3501 * predicted.pointr[i] = A.pointr[i] # <<<<<<<<<<<<<<
@@ -2855,7 +3505,7 @@
2855 (__pyx_v_predicted->pointr[__pyx_v_i]) = (__pyx_v_A->pointr[__pyx_v_i]);3505 (__pyx_v_predicted->pointr[__pyx_v_i]) = (__pyx_v_A->pointr[__pyx_v_i]);
2856 }3506 }
28573507
2858 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2493508 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":217
2859 * predicted.pointr[i] = A.pointr[i]3509 * predicted.pointr[i] = A.pointr[i]
2860 * 3510 *
2861 * for i in range(A.vals): # <<<<<<<<<<<<<<3511 * for i in range(A.vals): # <<<<<<<<<<<<<<
@@ -2865,7 +3515,7 @@
2865 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_A->vals; __pyx_t_8+=1) {3515 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_A->vals; __pyx_t_8+=1) {
2866 __pyx_v_i = __pyx_t_8;3516 __pyx_v_i = __pyx_t_8;
28673517
2868 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2503518 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":218
2869 * 3519 *
2870 * for i in range(A.vals):3520 * for i in range(A.vals):
2871 * predicted.rowind[i] = A.rowind[i] # <<<<<<<<<<<<<<3521 * predicted.rowind[i] = A.rowind[i] # <<<<<<<<<<<<<<
@@ -2874,7 +3524,7 @@
2874 */3524 */
2875 (__pyx_v_predicted->rowind[__pyx_v_i]) = (__pyx_v_A->rowind[__pyx_v_i]);3525 (__pyx_v_predicted->rowind[__pyx_v_i]) = (__pyx_v_A->rowind[__pyx_v_i]);
28763526
2877 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2513527 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":219
2878 * for i in range(A.vals):3528 * for i in range(A.vals):
2879 * predicted.rowind[i] = A.rowind[i]3529 * predicted.rowind[i] = A.rowind[i]
2880 * predicted.value[i] = 0 # <<<<<<<<<<<<<<3530 * predicted.value[i] = 0 # <<<<<<<<<<<<<<
@@ -2884,7 +3534,7 @@
2884 (__pyx_v_predicted->value[__pyx_v_i]) = 0;3534 (__pyx_v_predicted->value[__pyx_v_i]) = 0;
2885 }3535 }
28863536
2887 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2533537 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":221
2888 * predicted.value[i] = 03538 * predicted.value[i] = 0
2889 * 3539 *
2890 * for axis in range(k): # <<<<<<<<<<<<<<3540 * for axis in range(k): # <<<<<<<<<<<<<<
@@ -2894,7 +3544,7 @@
2894 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_k; __pyx_t_8+=1) {3544 for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_v_k; __pyx_t_8+=1) {
2895 __pyx_v_axis = __pyx_t_8;3545 __pyx_v_axis = __pyx_t_8;
28963546
2897 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2543547 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":222
2898 * 3548 *
2899 * for axis in range(k):3549 * for axis in range(k):
2900 * for i in range(niter): # <<<<<<<<<<<<<<3550 * for i in range(niter): # <<<<<<<<<<<<<<
@@ -2904,7 +3554,7 @@
2904 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_niter; __pyx_t_9+=1) {3554 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_niter; __pyx_t_9+=1) {
2905 __pyx_v_i = __pyx_t_9;3555 __pyx_v_i = __pyx_t_9;
29063556
2907 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2563557 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":224
2908 * for i in range(niter):3558 * for i in range(niter):
2909 * # Iterate over all values of the sparse matrix3559 * # Iterate over all values of the sparse matrix
2910 * for cur_col in range(A.cols): # <<<<<<<<<<<<<<3560 * for cur_col in range(A.cols): # <<<<<<<<<<<<<<
@@ -2914,7 +3564,7 @@
2914 for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_v_A->cols; __pyx_t_10+=1) {3564 for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_v_A->cols; __pyx_t_10+=1) {
2915 __pyx_v_cur_col = __pyx_t_10;3565 __pyx_v_cur_col = __pyx_t_10;
29163566
2917 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2573567 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":225
2918 * # Iterate over all values of the sparse matrix3568 * # Iterate over all values of the sparse matrix
2919 * for cur_col in range(A.cols):3569 * for cur_col in range(A.cols):
2920 * col_index = A.pointr[cur_col] # <<<<<<<<<<<<<<3570 * col_index = A.pointr[cur_col] # <<<<<<<<<<<<<<
@@ -2923,7 +3573,7 @@
2923 */3573 */
2924 __pyx_v_col_index = (__pyx_v_A->pointr[__pyx_v_cur_col]);3574 __pyx_v_col_index = (__pyx_v_A->pointr[__pyx_v_cur_col]);
29253575
2926 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2583576 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":226
2927 * for cur_col in range(A.cols):3577 * for cur_col in range(A.cols):
2928 * col_index = A.pointr[cur_col]3578 * col_index = A.pointr[cur_col]
2929 * next_col_index = A.pointr[cur_col + 1] # <<<<<<<<<<<<<<3579 * next_col_index = A.pointr[cur_col + 1] # <<<<<<<<<<<<<<
@@ -2932,7 +3582,7 @@
2932 */3582 */
2933 __pyx_v_next_col_index = (__pyx_v_A->pointr[(__pyx_v_cur_col + 1)]);3583 __pyx_v_next_col_index = (__pyx_v_A->pointr[(__pyx_v_cur_col + 1)]);
29343584
2935 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2593585 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":227
2936 * col_index = A.pointr[cur_col]3586 * col_index = A.pointr[cur_col]
2937 * next_col_index = A.pointr[cur_col + 1]3587 * next_col_index = A.pointr[cur_col + 1]
2938 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<3588 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<
@@ -2942,7 +3592,7 @@
2942 for (__pyx_t_11 = __pyx_v_col_index; __pyx_t_11 < __pyx_v_next_col_index; __pyx_t_11+=1) {3592 for (__pyx_t_11 = __pyx_v_col_index; __pyx_t_11 < __pyx_v_next_col_index; __pyx_t_11+=1) {
2943 __pyx_v_value_index = __pyx_t_11;3593 __pyx_v_value_index = __pyx_t_11;
29443594
2945 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2603595 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":228
2946 * next_col_index = A.pointr[cur_col + 1]3596 * next_col_index = A.pointr[cur_col + 1]
2947 * for value_index in range(col_index, next_col_index):3597 * for value_index in range(col_index, next_col_index):
2948 * cur_row = A.rowind[value_index] # <<<<<<<<<<<<<<3598 * cur_row = A.rowind[value_index] # <<<<<<<<<<<<<<
@@ -2951,7 +3601,7 @@
2951 */3601 */
2952 __pyx_v_cur_row = (__pyx_v_A->rowind[__pyx_v_value_index]);3602 __pyx_v_cur_row = (__pyx_v_A->rowind[__pyx_v_value_index]);
29533603
2954 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2623604 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":230
2955 * cur_row = A.rowind[value_index]3605 * cur_row = A.rowind[value_index]
2956 * err = A.value[value_index] - (predicted.value[value_index] +3606 * err = A.value[value_index] - (predicted.value[value_index] +
2957 * u[cur_row, axis] * v[cur_col, axis]) # <<<<<<<<<<<<<<3607 * u[cur_row, axis] * v[cur_col, axis]) # <<<<<<<<<<<<<<
@@ -2964,7 +3614,7 @@
2964 __pyx_t_15 = __pyx_v_axis;3614 __pyx_t_15 = __pyx_v_axis;
2965 __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)))));3615 __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)))));
29663616
2967 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2643617 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":232
2968 * u[cur_row, axis] * v[cur_col, axis])3618 * u[cur_row, axis] * v[cur_col, axis])
2969 * 3619 *
2970 * u_value = u[cur_row, axis] # <<<<<<<<<<<<<<3620 * u_value = u[cur_row, axis] # <<<<<<<<<<<<<<
@@ -2975,7 +3625,7 @@
2975 __pyx_t_17 = __pyx_v_axis;3625 __pyx_t_17 = __pyx_v_axis;
2976 __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));3626 __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));
29773627
2978 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2653628 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":233
2979 * 3629 *
2980 * u_value = u[cur_row, axis]3630 * u_value = u[cur_row, axis]
2981 * u[cur_row, axis] += lrate * err * v[cur_col, axis] # <<<<<<<<<<<<<<3631 * u[cur_row, axis] += lrate * err * v[cur_col, axis] # <<<<<<<<<<<<<<
@@ -2988,7 +3638,7 @@
2988 __pyx_t_21 = __pyx_v_axis;3638 __pyx_t_21 = __pyx_v_axis;
2989 *__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)));3639 *__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)));
29903640
2991 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2663641 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":234
2992 * u_value = u[cur_row, axis]3642 * u_value = u[cur_row, axis]
2993 * u[cur_row, axis] += lrate * err * v[cur_col, axis]3643 * u[cur_row, axis] += lrate * err * v[cur_col, axis]
2994 * v[cur_col, axis] += lrate * err * u_value # <<<<<<<<<<<<<<3644 * v[cur_col, axis] += lrate * err * u_value # <<<<<<<<<<<<<<
@@ -3002,7 +3652,7 @@
3002 }3652 }
3003 }3653 }
30043654
3005 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2693655 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":237
3006 * 3656 *
3007 * # Update cached dot-products3657 * # Update cached dot-products
3008 * for cur_col in range(predicted.cols): # <<<<<<<<<<<<<<3658 * for cur_col in range(predicted.cols): # <<<<<<<<<<<<<<
@@ -3012,7 +3662,7 @@
3012 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_predicted->cols; __pyx_t_9+=1) {3662 for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_predicted->cols; __pyx_t_9+=1) {
3013 __pyx_v_cur_col = __pyx_t_9;3663 __pyx_v_cur_col = __pyx_t_9;
30143664
3015 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2703665 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":238
3016 * # Update cached dot-products3666 * # Update cached dot-products
3017 * for cur_col in range(predicted.cols):3667 * for cur_col in range(predicted.cols):
3018 * col_index = predicted.pointr[cur_col] # <<<<<<<<<<<<<<3668 * col_index = predicted.pointr[cur_col] # <<<<<<<<<<<<<<
@@ -3021,7 +3671,7 @@
3021 */3671 */
3022 __pyx_v_col_index = (__pyx_v_predicted->pointr[__pyx_v_cur_col]);3672 __pyx_v_col_index = (__pyx_v_predicted->pointr[__pyx_v_cur_col]);
30233673
3024 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2713674 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":239
3025 * for cur_col in range(predicted.cols):3675 * for cur_col in range(predicted.cols):
3026 * col_index = predicted.pointr[cur_col]3676 * col_index = predicted.pointr[cur_col]
3027 * next_col_index = predicted.pointr[cur_col + 1] # <<<<<<<<<<<<<<3677 * next_col_index = predicted.pointr[cur_col + 1] # <<<<<<<<<<<<<<
@@ -3030,7 +3680,7 @@
3030 */3680 */
3031 __pyx_v_next_col_index = (__pyx_v_predicted->pointr[(__pyx_v_cur_col + 1)]);3681 __pyx_v_next_col_index = (__pyx_v_predicted->pointr[(__pyx_v_cur_col + 1)]);
30323682
3033 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2723683 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":240
3034 * col_index = predicted.pointr[cur_col]3684 * col_index = predicted.pointr[cur_col]
3035 * next_col_index = predicted.pointr[cur_col + 1]3685 * next_col_index = predicted.pointr[cur_col + 1]
3036 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<3686 * for value_index in range(col_index, next_col_index): # <<<<<<<<<<<<<<
@@ -3040,7 +3690,7 @@
3040 for (__pyx_t_10 = __pyx_v_col_index; __pyx_t_10 < __pyx_v_next_col_index; __pyx_t_10+=1) {3690 for (__pyx_t_10 = __pyx_v_col_index; __pyx_t_10 < __pyx_v_next_col_index; __pyx_t_10+=1) {
3041 __pyx_v_value_index = __pyx_t_10;3691 __pyx_v_value_index = __pyx_t_10;
30423692
3043 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2733693 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":241
3044 * next_col_index = predicted.pointr[cur_col + 1]3694 * next_col_index = predicted.pointr[cur_col + 1]
3045 * for value_index in range(col_index, next_col_index):3695 * for value_index in range(col_index, next_col_index):
3046 * cur_row = predicted.rowind[value_index] # <<<<<<<<<<<<<<3696 * cur_row = predicted.rowind[value_index] # <<<<<<<<<<<<<<
@@ -3049,7 +3699,7 @@
3049 */3699 */
3050 __pyx_v_cur_row = (__pyx_v_predicted->rowind[__pyx_v_value_index]);3700 __pyx_v_cur_row = (__pyx_v_predicted->rowind[__pyx_v_value_index]);
30513701
3052 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2743702 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":242
3053 * for value_index in range(col_index, next_col_index):3703 * for value_index in range(col_index, next_col_index):
3054 * cur_row = predicted.rowind[value_index]3704 * cur_row = predicted.rowind[value_index]
3055 * predicted.value[value_index] += u[cur_row, axis] * v[cur_col, axis] # <<<<<<<<<<<<<<3705 * predicted.value[value_index] += u[cur_row, axis] * v[cur_col, axis] # <<<<<<<<<<<<<<
@@ -3065,32 +3715,32 @@
3065 }3715 }
3066 }3716 }
30673717
3068 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2773718 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":245
3069 * 3719 *
3070 * # Factor out the svals from u and v3720 * # Factor out the svals from u and v
3071 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u))) # <<<<<<<<<<<<<<3721 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u))) # <<<<<<<<<<<<<<
3072 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))3722 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))
3073 * 3723 *
3074 */3724 */
3075 __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;}3725 __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;}
3076 __Pyx_GOTREF(__pyx_1);3726 __Pyx_GOTREF(__pyx_1);
3077 __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;}3727 __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;}
3078 __Pyx_GOTREF(__pyx_t_5);3728 __Pyx_GOTREF(__pyx_t_5);
3079 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3729 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3080 __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;}3730 __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;}
3081 __Pyx_GOTREF(__pyx_2);3731 __Pyx_GOTREF(__pyx_2);
3082 __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;}3732 __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;}
3083 __Pyx_GOTREF(__pyx_t_1);3733 __Pyx_GOTREF(__pyx_t_1);
3084 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3734 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3085 __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;}3735 __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;}
3086 __Pyx_GOTREF(__pyx_t_3);3736 __Pyx_GOTREF(__pyx_t_3);
3087 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3737 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3088 __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;}3738 __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;}
3089 __Pyx_GOTREF(__pyx_1);3739 __Pyx_GOTREF(__pyx_1);
3090 __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;}3740 __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;}
3091 __Pyx_GOTREF(__pyx_t_1);3741 __Pyx_GOTREF(__pyx_t_1);
3092 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3742 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3093 __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;}3743 __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;}
3094 __Pyx_GOTREF(((PyObject *)__pyx_t_4));3744 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3095 __Pyx_INCREF(((PyObject *)__pyx_v_u));3745 __Pyx_INCREF(((PyObject *)__pyx_v_u));
3096 PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));3746 PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
@@ -3098,25 +3748,25 @@
3098 __Pyx_INCREF(((PyObject *)__pyx_v_u));3748 __Pyx_INCREF(((PyObject *)__pyx_v_u));
3099 PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_u));3749 PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_u));
3100 __Pyx_GIVEREF(((PyObject *)__pyx_v_u));3750 __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
3101 __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;}3751 __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;}
3102 __Pyx_GOTREF(__pyx_t_2);3752 __Pyx_GOTREF(__pyx_t_2);
3103 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3753 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3104 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;3754 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
3105 __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;}3755 __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;}
3106 __Pyx_GOTREF(((PyObject *)__pyx_t_4));3756 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3107 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);3757 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
3108 __Pyx_GIVEREF(__pyx_t_2);3758 __Pyx_GIVEREF(__pyx_t_2);
3109 __pyx_t_2 = 0;3759 __pyx_t_2 = 0;
3110 __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;}3760 __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;}
3111 __Pyx_GOTREF(__pyx_t_2);3761 __Pyx_GOTREF(__pyx_t_2);
3112 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;3762 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3113 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;3763 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
3114 __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;}3764 __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;}
3115 __Pyx_GOTREF(((PyObject *)__pyx_t_4));3765 __Pyx_GOTREF(((PyObject *)__pyx_t_4));
3116 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);3766 PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
3117 __Pyx_GIVEREF(__pyx_t_2);3767 __Pyx_GIVEREF(__pyx_t_2);
3118 __pyx_t_2 = 0;3768 __pyx_t_2 = 0;
3119 __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;}3769 __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;}
3120 __Pyx_GOTREF(__pyx_t_2);3770 __Pyx_GOTREF(__pyx_t_2);
3121 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;3771 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
3122 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;3772 __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -3124,32 +3774,32 @@
3124 __pyx_v_u_sigma = __pyx_t_2;3774 __pyx_v_u_sigma = __pyx_t_2;
3125 __pyx_t_2 = 0;3775 __pyx_t_2 = 0;
31263776
3127 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2783777 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":246
3128 * # Factor out the svals from u and v3778 * # Factor out the svals from u and v
3129 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u)))3779 * u_sigma = np.sqrt(np.add.reduce(np.multiply(u, u)))
3130 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v))) # <<<<<<<<<<<<<<3780 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v))) # <<<<<<<<<<<<<<
3131 * 3781 *
3132 * u_tensor = DenseTensor(np.divide(u, u_sigma))3782 * u_tensor = DenseTensor(np.divide(u, u_sigma))
3133 */3783 */
3134 __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;}3784 __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;}
3135 __Pyx_GOTREF(__pyx_2);3785 __Pyx_GOTREF(__pyx_2);
3136 __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;}3786 __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;}
3137 __Pyx_GOTREF(__pyx_t_2);3787 __Pyx_GOTREF(__pyx_t_2);
3138 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3788 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3139 __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;}3789 __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;}
3140 __Pyx_GOTREF(__pyx_1);3790 __Pyx_GOTREF(__pyx_1);
3141 __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;}3791 __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;}
3142 __Pyx_GOTREF(__pyx_t_4);3792 __Pyx_GOTREF(__pyx_t_4);
3143 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3793 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3144 __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;}3794 __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;}
3145 __Pyx_GOTREF(__pyx_t_5);3795 __Pyx_GOTREF(__pyx_t_5);
3146 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;3796 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
3147 __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;}3797 __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;}
3148 __Pyx_GOTREF(__pyx_2);3798 __Pyx_GOTREF(__pyx_2);
3149 __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;}3799 __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;}
3150 __Pyx_GOTREF(__pyx_t_4);3800 __Pyx_GOTREF(__pyx_t_4);
3151 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3801 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3152 __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;}3802 __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;}
3153 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3803 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3154 __Pyx_INCREF(((PyObject *)__pyx_v_v));3804 __Pyx_INCREF(((PyObject *)__pyx_v_v));
3155 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));3805 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));
@@ -3157,25 +3807,25 @@
3157 __Pyx_INCREF(((PyObject *)__pyx_v_v));3807 __Pyx_INCREF(((PyObject *)__pyx_v_v));
3158 PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_v));3808 PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_v));
3159 __Pyx_GIVEREF(((PyObject *)__pyx_v_v));3809 __Pyx_GIVEREF(((PyObject *)__pyx_v_v));
3160 __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;}3810 __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;}
3161 __Pyx_GOTREF(__pyx_t_1);3811 __Pyx_GOTREF(__pyx_t_1);
3162 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;3812 __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
3163 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3813 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3164 __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;}3814 __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;}
3165 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3815 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3166 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);3816 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
3167 __Pyx_GIVEREF(__pyx_t_1);3817 __Pyx_GIVEREF(__pyx_t_1);
3168 __pyx_t_1 = 0;3818 __pyx_t_1 = 0;
3169 __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;}3819 __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;}
3170 __Pyx_GOTREF(__pyx_t_1);3820 __Pyx_GOTREF(__pyx_t_1);
3171 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;3821 __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
3172 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3822 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3173 __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;}3823 __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;}
3174 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3824 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3175 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);3825 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
3176 __Pyx_GIVEREF(__pyx_t_1);3826 __Pyx_GIVEREF(__pyx_t_1);
3177 __pyx_t_1 = 0;3827 __pyx_t_1 = 0;
3178 __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;}3828 __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;}
3179 __Pyx_GOTREF(__pyx_t_1);3829 __Pyx_GOTREF(__pyx_t_1);
3180 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;3830 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3181 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3831 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -3183,19 +3833,19 @@
3183 __pyx_v_v_sigma = __pyx_t_1;3833 __pyx_v_v_sigma = __pyx_t_1;
3184 __pyx_t_1 = 0;3834 __pyx_t_1 = 0;
31853835
3186 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2803836 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":248
3187 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))3837 * v_sigma = np.sqrt(np.add.reduce(np.multiply(v, v)))
3188 * 3838 *
3189 * u_tensor = DenseTensor(np.divide(u, u_sigma)) # <<<<<<<<<<<<<<3839 * u_tensor = DenseTensor(np.divide(u, u_sigma)) # <<<<<<<<<<<<<<
3190 * v_tensor = DenseTensor(np.divide(v, v_sigma))3840 * v_tensor = DenseTensor(np.divide(v, v_sigma))
3191 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))3841 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
3192 */3842 */
3193 __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;}3843 __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;}
3194 __Pyx_GOTREF(__pyx_1);3844 __Pyx_GOTREF(__pyx_1);
3195 __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;}3845 __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;}
3196 __Pyx_GOTREF(__pyx_t_1);3846 __Pyx_GOTREF(__pyx_t_1);
3197 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3847 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3198 __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;}3848 __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;}
3199 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3849 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3200 __Pyx_INCREF(((PyObject *)__pyx_v_u));3850 __Pyx_INCREF(((PyObject *)__pyx_v_u));
3201 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_u));3851 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_u));
@@ -3203,35 +3853,35 @@
3203 __Pyx_INCREF(__pyx_v_u_sigma);3853 __Pyx_INCREF(__pyx_v_u_sigma);
3204 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_u_sigma);3854 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_u_sigma);
3205 __Pyx_GIVEREF(__pyx_v_u_sigma);3855 __Pyx_GIVEREF(__pyx_v_u_sigma);
3206 __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;}3856 __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;}
3207 __Pyx_GOTREF(__pyx_t_2);3857 __Pyx_GOTREF(__pyx_t_2);
3208 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3858 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3209 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3859 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3210 __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;}3860 __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;}
3211 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3861 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3212 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);3862 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
3213 __Pyx_GIVEREF(__pyx_t_2);3863 __Pyx_GIVEREF(__pyx_t_2);
3214 __pyx_t_2 = 0;3864 __pyx_t_2 = 0;
3215 __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;}3865 __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;}
3216 __Pyx_GOTREF(__pyx_t_2);3866 __Pyx_GOTREF(__pyx_t_2);
3217 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3867 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3218 __Pyx_DECREF(__pyx_v_u_tensor);3868 __Pyx_DECREF(__pyx_v_u_tensor);
3219 __pyx_v_u_tensor = __pyx_t_2;3869 __pyx_v_u_tensor = __pyx_t_2;
3220 __pyx_t_2 = 0;3870 __pyx_t_2 = 0;
32213871
3222 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2813872 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":249
3223 * 3873 *
3224 * u_tensor = DenseTensor(np.divide(u, u_sigma))3874 * u_tensor = DenseTensor(np.divide(u, u_sigma))
3225 * v_tensor = DenseTensor(np.divide(v, v_sigma)) # <<<<<<<<<<<<<<3875 * v_tensor = DenseTensor(np.divide(v, v_sigma)) # <<<<<<<<<<<<<<
3226 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))3876 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
3227 * 3877 *
3228 */3878 */
3229 __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;}3879 __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;}
3230 __Pyx_GOTREF(__pyx_2);3880 __Pyx_GOTREF(__pyx_2);
3231 __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;}3881 __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;}
3232 __Pyx_GOTREF(__pyx_t_2);3882 __Pyx_GOTREF(__pyx_t_2);
3233 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;3883 __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
3234 __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;}3884 __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;}
3235 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3885 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3236 __Pyx_INCREF(((PyObject *)__pyx_v_v));3886 __Pyx_INCREF(((PyObject *)__pyx_v_v));
3237 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));3887 PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_v));
@@ -3239,35 +3889,35 @@
3239 __Pyx_INCREF(__pyx_v_v_sigma);3889 __Pyx_INCREF(__pyx_v_v_sigma);
3240 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);3890 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);
3241 __Pyx_GIVEREF(__pyx_v_v_sigma);3891 __Pyx_GIVEREF(__pyx_v_v_sigma);
3242 __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;}3892 __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;}
3243 __Pyx_GOTREF(__pyx_t_1);3893 __Pyx_GOTREF(__pyx_t_1);
3244 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;3894 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3245 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3895 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3246 __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;}3896 __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;}
3247 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3897 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3248 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);3898 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
3249 __Pyx_GIVEREF(__pyx_t_1);3899 __Pyx_GIVEREF(__pyx_t_1);
3250 __pyx_t_1 = 0;3900 __pyx_t_1 = 0;
3251 __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;}3901 __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;}
3252 __Pyx_GOTREF(__pyx_t_1);3902 __Pyx_GOTREF(__pyx_t_1);
3253 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3903 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3254 __Pyx_DECREF(__pyx_v_v_tensor);3904 __Pyx_DECREF(__pyx_v_v_tensor);
3255 __pyx_v_v_tensor = __pyx_t_1;3905 __pyx_v_v_tensor = __pyx_t_1;
3256 __pyx_t_1 = 0;3906 __pyx_t_1 = 0;
32573907
3258 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2823908 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":250
3259 * u_tensor = DenseTensor(np.divide(u, u_sigma))3909 * u_tensor = DenseTensor(np.divide(u, u_sigma))
3260 * v_tensor = DenseTensor(np.divide(v, v_sigma))3910 * v_tensor = DenseTensor(np.divide(v, v_sigma))
3261 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma)) # <<<<<<<<<<<<<<3911 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma)) # <<<<<<<<<<<<<<
3262 * 3912 *
3263 * svdFreeSMat(predicted)3913 * svdFreeSMat(predicted)
3264 */3914 */
3265 __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;}3915 __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;}
3266 __Pyx_GOTREF(__pyx_1);3916 __Pyx_GOTREF(__pyx_1);
3267 __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;}3917 __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;}
3268 __Pyx_GOTREF(__pyx_t_1);3918 __Pyx_GOTREF(__pyx_t_1);
3269 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;3919 __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
3270 __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;}3920 __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;}
3271 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3921 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3272 __Pyx_INCREF(__pyx_v_u_sigma);3922 __Pyx_INCREF(__pyx_v_u_sigma);
3273 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_u_sigma);3923 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_u_sigma);
@@ -3275,23 +3925,23 @@
3275 __Pyx_INCREF(__pyx_v_v_sigma);3925 __Pyx_INCREF(__pyx_v_v_sigma);
3276 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);3926 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_v_sigma);
3277 __Pyx_GIVEREF(__pyx_v_v_sigma);3927 __Pyx_GIVEREF(__pyx_v_v_sigma);
3278 __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;}3928 __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;}
3279 __Pyx_GOTREF(__pyx_t_2);3929 __Pyx_GOTREF(__pyx_t_2);
3280 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;3930 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3281 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3931 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3282 __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;}3932 __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;}
3283 __Pyx_GOTREF(((PyObject *)__pyx_t_3));3933 __Pyx_GOTREF(((PyObject *)__pyx_t_3));
3284 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);3934 PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
3285 __Pyx_GIVEREF(__pyx_t_2);3935 __Pyx_GIVEREF(__pyx_t_2);
3286 __pyx_t_2 = 0;3936 __pyx_t_2 = 0;
3287 __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;}3937 __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;}
3288 __Pyx_GOTREF(__pyx_t_2);3938 __Pyx_GOTREF(__pyx_t_2);
3289 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;3939 __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
3290 __Pyx_DECREF(__pyx_v_sigma);3940 __Pyx_DECREF(__pyx_v_sigma);
3291 __pyx_v_sigma = __pyx_t_2;3941 __pyx_v_sigma = __pyx_t_2;
3292 __pyx_t_2 = 0;3942 __pyx_t_2 = 0;
32933943
3294 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2843944 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":252
3295 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))3945 * sigma = DenseTensor(np.multiply(u_sigma, v_sigma))
3296 * 3946 *
3297 * svdFreeSMat(predicted) # <<<<<<<<<<<<<<3947 * svdFreeSMat(predicted) # <<<<<<<<<<<<<<
@@ -3300,7 +3950,7 @@
3300 */3950 */
3301 svdFreeSMat(__pyx_v_predicted);3951 svdFreeSMat(__pyx_v_predicted);
33023952
3303 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2863953 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":254
3304 * svdFreeSMat(predicted)3954 * svdFreeSMat(predicted)
3305 * 3955 *
3306 * if self.transposed: # <<<<<<<<<<<<<<3956 * if self.transposed: # <<<<<<<<<<<<<<
@@ -3310,7 +3960,7 @@
3310 __pyx_t_27 = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed;3960 __pyx_t_27 = ((struct __pyx_obj_6svdlib_7_svdlib_CSCMatrix *)__pyx_v_self)->transposed;
3311 if (__pyx_t_27) {3961 if (__pyx_t_27) {
33123962
3313 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2873963 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":255
3314 * 3964 *
3315 * if self.transposed:3965 * if self.transposed:
3316 * return v_tensor, u_tensor, sigma # <<<<<<<<<<<<<<3966 * return v_tensor, u_tensor, sigma # <<<<<<<<<<<<<<
@@ -3318,7 +3968,7 @@
3318 * return u_tensor, v_tensor, sigma3968 * return u_tensor, v_tensor, sigma
3319 */3969 */
3320 __Pyx_XDECREF(__pyx_r);3970 __Pyx_XDECREF(__pyx_r);
3321 __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;}3971 __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;}
3322 __Pyx_GOTREF(((PyObject *)__pyx_t_2));3972 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
3323 __Pyx_INCREF(__pyx_v_v_tensor);3973 __Pyx_INCREF(__pyx_v_v_tensor);
3324 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_v_tensor);3974 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_v_tensor);
@@ -3336,15 +3986,15 @@
3336 }3986 }
3337 /*else*/ {3987 /*else*/ {
33383988
3339 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2893989 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":257
3340 * return v_tensor, u_tensor, sigma3990 * return v_tensor, u_tensor, sigma
3341 * else:3991 * else:
3342 * return u_tensor, v_tensor, sigma # <<<<<<<<<<<<<<3992 * return u_tensor, v_tensor, sigma # <<<<<<<<<<<<<<
3343 * 3993 *
3344 * def svd(tensor, k=50, row_factors=None):3994 * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
3345 */3995 */
3346 __Pyx_XDECREF(__pyx_r);3996 __Pyx_XDECREF(__pyx_r);
3347 __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;}3997 __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;}
3348 __Pyx_GOTREF(((PyObject *)__pyx_t_2));3998 __Pyx_GOTREF(((PyObject *)__pyx_t_2));
3349 __Pyx_INCREF(__pyx_v_u_tensor);3999 __Pyx_INCREF(__pyx_v_u_tensor);
3350 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_u_tensor);4000 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_u_tensor);
@@ -3396,12 +4046,12 @@
3396 return __pyx_r;4046 return __pyx_r;
3397}4047}
33984048
3399/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2914049/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":259
3400 * return u_tensor, v_tensor, sigma4050 * return u_tensor, v_tensor, sigma
3401 * 4051 *
3402 * def svd(tensor, k=50, row_factors=None): # <<<<<<<<<<<<<<4052 * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
3403 * CSC = CSCMatrix(tensor, row_factors)4053 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
3404 * CSC.pack()4054 * CSC.pack(row_factors)
3405 */4055 */
34064056
3407static PyObject *__pyx_pf_6svdlib_7_svdlib_svd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/4057static PyObject *__pyx_pf_6svdlib_7_svdlib_svd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3409,20 +4059,26 @@
3409 PyObject *__pyx_v_tensor = 0;4059 PyObject *__pyx_v_tensor = 0;
3410 PyObject *__pyx_v_k = 0;4060 PyObject *__pyx_v_k = 0;
3411 PyObject *__pyx_v_row_factors = 0;4061 PyObject *__pyx_v_row_factors = 0;
4062 PyObject *__pyx_v_offset_for_row = 0;
4063 PyObject *__pyx_v_offset_for_col = 0;
3412 PyObject *__pyx_v_CSC;4064 PyObject *__pyx_v_CSC;
3413 PyObject *__pyx_r = NULL;4065 PyObject *__pyx_r = NULL;
3414 PyObject *__pyx_t_1 = NULL;4066 PyObject *__pyx_t_1 = NULL;
3415 PyObject *__pyx_t_2 = NULL;4067 PyObject *__pyx_t_2 = NULL;
3416 PyObject *__pyx_t_3 = NULL;4068 PyObject *__pyx_t_3 = NULL;
3417 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,0};4069 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};
3418 __Pyx_SetupRefcountContext("svd");4070 __Pyx_SetupRefcountContext("svd");
3419 __pyx_self = __pyx_self;4071 __pyx_self = __pyx_self;
3420 if (unlikely(__pyx_kwds)) {4072 if (unlikely(__pyx_kwds)) {
3421 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);4073 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
3422 PyObject* values[3] = {0,0,0};4074 PyObject* values[5] = {0,0,0,0,0};
3423 values[1] = __pyx_int_50;4075 values[1] = __pyx_int_50;
3424 values[2] = Py_None;4076 values[2] = Py_None;
4077 values[3] = Py_None;
4078 values[4] = Py_None;
3425 switch (PyTuple_GET_SIZE(__pyx_args)) {4079 switch (PyTuple_GET_SIZE(__pyx_args)) {
4080 case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
4081 case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
3426 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);4082 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
3427 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);4083 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
3428 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);4084 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3444,17 +4100,33 @@
3444 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);4100 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);
3445 if (unlikely(value)) { values[2] = value; kw_args--; }4101 if (unlikely(value)) { values[2] = value; kw_args--; }
3446 }4102 }
4103 case 3:
4104 if (kw_args > 0) {
4105 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
4106 if (unlikely(value)) { values[3] = value; kw_args--; }
4107 }
4108 case 4:
4109 if (kw_args > 0) {
4110 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
4111 if (unlikely(value)) { values[4] = value; kw_args--; }
4112 }
3447 }4113 }
3448 if (unlikely(kw_args > 0)) {4114 if (unlikely(kw_args > 0)) {
3449 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;}4115 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;}
3450 }4116 }
3451 __pyx_v_tensor = values[0];4117 __pyx_v_tensor = values[0];
3452 __pyx_v_k = values[1];4118 __pyx_v_k = values[1];
3453 __pyx_v_row_factors = values[2];4119 __pyx_v_row_factors = values[2];
4120 __pyx_v_offset_for_row = values[3];
4121 __pyx_v_offset_for_col = values[4];
3454 } else {4122 } else {
3455 __pyx_v_k = __pyx_int_50;4123 __pyx_v_k = __pyx_int_50;
3456 __pyx_v_row_factors = Py_None;4124 __pyx_v_row_factors = Py_None;
4125 __pyx_v_offset_for_row = Py_None;
4126 __pyx_v_offset_for_col = Py_None;
3457 switch (PyTuple_GET_SIZE(__pyx_args)) {4127 switch (PyTuple_GET_SIZE(__pyx_args)) {
4128 case 5: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 4);
4129 case 4: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 3);
3458 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);4130 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);
3459 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);4131 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);
3460 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);4132 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3464,70 +4136,79 @@
3464 }4136 }
3465 goto __pyx_L4_argument_unpacking_done;4137 goto __pyx_L4_argument_unpacking_done;
3466 __pyx_L5_argtuple_error:;4138 __pyx_L5_argtuple_error:;
3467 __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;}4139 __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;}
3468 __pyx_L3_error:;4140 __pyx_L3_error:;
3469 __Pyx_AddTraceback("svdlib._svdlib.svd");4141 __Pyx_AddTraceback("svdlib._svdlib.svd");
3470 return NULL;4142 return NULL;
3471 __pyx_L4_argument_unpacking_done:;4143 __pyx_L4_argument_unpacking_done:;
3472 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);4144 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
34734145
3474 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2924146 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":260
3475 * 4147 *
3476 * def svd(tensor, k=50, row_factors=None):4148 * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
3477 * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<4149 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col) # <<<<<<<<<<<<<<
3478 * CSC.pack()4150 * CSC.pack(row_factors)
3479 * return CSC.svdA(k)4151 * return CSC.svdA(k)
3480 */4152 */
3481 __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;}4153 __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;}
3482 __Pyx_GOTREF(((PyObject *)__pyx_t_1));4154 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3483 __Pyx_INCREF(__pyx_v_tensor);4155 __Pyx_INCREF(__pyx_v_tensor);
3484 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);4156 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
3485 __Pyx_GIVEREF(__pyx_v_tensor);4157 __Pyx_GIVEREF(__pyx_v_tensor);
4158 __Pyx_INCREF(__pyx_v_offset_for_row);
4159 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_offset_for_row);
4160 __Pyx_GIVEREF(__pyx_v_offset_for_row);
4161 __Pyx_INCREF(__pyx_v_offset_for_col);
4162 PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_offset_for_col);
4163 __Pyx_GIVEREF(__pyx_v_offset_for_col);
4164 __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;}
4165 __Pyx_GOTREF(__pyx_t_2);
4166 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4167 __Pyx_DECREF(__pyx_v_CSC);
4168 __pyx_v_CSC = __pyx_t_2;
4169 __pyx_t_2 = 0;
4170
4171 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":261
4172 * def svd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4173 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4174 * CSC.pack(row_factors) # <<<<<<<<<<<<<<
4175 * return CSC.svdA(k)
4176 *
4177 */
4178 __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;}
4179 __Pyx_GOTREF(__pyx_t_2);
4180 __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;}
4181 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3486 __Pyx_INCREF(__pyx_v_row_factors);4182 __Pyx_INCREF(__pyx_v_row_factors);
3487 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);4183 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
3488 __Pyx_GIVEREF(__pyx_v_row_factors);4184 __Pyx_GIVEREF(__pyx_v_row_factors);
3489 __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;}4185 __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;}
3490 __Pyx_GOTREF(__pyx_t_2);4186 __Pyx_GOTREF(__pyx_t_3);
3491 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3492 __Pyx_DECREF(__pyx_v_CSC);
3493 __pyx_v_CSC = __pyx_t_2;
3494 __pyx_t_2 = 0;
3495
3496 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":293
3497 * def svd(tensor, k=50, row_factors=None):
3498 * CSC = CSCMatrix(tensor, row_factors)
3499 * CSC.pack() # <<<<<<<<<<<<<<
3500 * return CSC.svdA(k)
3501 *
3502 */
3503 __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;}
3504 __Pyx_GOTREF(__pyx_t_2);
3505 __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;}
3506 __Pyx_GOTREF(__pyx_t_1);
3507 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;4187 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3508 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;4188 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4189 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
35094190
3510 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2944191 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":262
3511 * CSC = CSCMatrix(tensor, row_factors)4192 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
3512 * CSC.pack()4193 * CSC.pack(row_factors)
3513 * return CSC.svdA(k) # <<<<<<<<<<<<<<4194 * return CSC.svdA(k) # <<<<<<<<<<<<<<
3514 * 4195 *
3515 * def dictSvd(tensor, k=50, row_factors=None):4196 * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
3516 */4197 */
3517 __Pyx_XDECREF(__pyx_r);4198 __Pyx_XDECREF(__pyx_r);
3518 __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;}4199 __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;}
3519 __Pyx_GOTREF(__pyx_t_1);4200 __Pyx_GOTREF(__pyx_t_3);
3520 __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;}4201 __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;}
3521 __Pyx_GOTREF(((PyObject *)__pyx_t_2));4202 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3522 __Pyx_INCREF(__pyx_v_k);4203 __Pyx_INCREF(__pyx_v_k);
3523 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);4204 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
3524 __Pyx_GIVEREF(__pyx_v_k);4205 __Pyx_GIVEREF(__pyx_v_k);
3525 __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;}4206 __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;}
3526 __Pyx_GOTREF(__pyx_t_3);4207 __Pyx_GOTREF(__pyx_t_2);
3527 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;4208 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3528 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;4209 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3529 __pyx_r = __pyx_t_3;4210 __pyx_r = __pyx_t_2;
3530 __pyx_t_3 = 0;4211 __pyx_t_2 = 0;
3531 goto __pyx_L0;4212 goto __pyx_L0;
35324213
3533 __pyx_r = Py_None; __Pyx_INCREF(Py_None);4214 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -3545,12 +4226,12 @@
3545 return __pyx_r;4226 return __pyx_r;
3546}4227}
35474228
3548/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2964229/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":264
3549 * return CSC.svdA(k)4230 * return CSC.svdA(k)
3550 * 4231 *
3551 * def dictSvd(tensor, k=50, row_factors=None): # <<<<<<<<<<<<<<4232 * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None): # <<<<<<<<<<<<<<
3552 * CSC = CSCMatrix(tensor, row_factors)4233 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
3553 * CSC.dictPack()4234 * CSC.dictPack(row_factors)
3554 */4235 */
35554236
3556static PyObject *__pyx_pf_6svdlib_7_svdlib_dictSvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/4237static PyObject *__pyx_pf_6svdlib_7_svdlib_dictSvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3558,20 +4239,26 @@
3558 PyObject *__pyx_v_tensor = 0;4239 PyObject *__pyx_v_tensor = 0;
3559 PyObject *__pyx_v_k = 0;4240 PyObject *__pyx_v_k = 0;
3560 PyObject *__pyx_v_row_factors = 0;4241 PyObject *__pyx_v_row_factors = 0;
4242 PyObject *__pyx_v_offset_for_row = 0;
4243 PyObject *__pyx_v_offset_for_col = 0;
3561 PyObject *__pyx_v_CSC;4244 PyObject *__pyx_v_CSC;
3562 PyObject *__pyx_r = NULL;4245 PyObject *__pyx_r = NULL;
3563 PyObject *__pyx_t_1 = NULL;4246 PyObject *__pyx_t_1 = NULL;
3564 PyObject *__pyx_t_2 = NULL;4247 PyObject *__pyx_t_2 = NULL;
3565 PyObject *__pyx_t_3 = NULL;4248 PyObject *__pyx_t_3 = NULL;
3566 static PyObject **__pyx_pyargnames[] = {&__pyx_kp_tensor,&__pyx_kp_k,&__pyx_kp_row_factors,0};4249 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};
3567 __Pyx_SetupRefcountContext("dictSvd");4250 __Pyx_SetupRefcountContext("dictSvd");
3568 __pyx_self = __pyx_self;4251 __pyx_self = __pyx_self;
3569 if (unlikely(__pyx_kwds)) {4252 if (unlikely(__pyx_kwds)) {
3570 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);4253 Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
3571 PyObject* values[3] = {0,0,0};4254 PyObject* values[5] = {0,0,0,0,0};
3572 values[1] = __pyx_int_50;4255 values[1] = __pyx_int_50;
3573 values[2] = Py_None;4256 values[2] = Py_None;
4257 values[3] = Py_None;
4258 values[4] = Py_None;
3574 switch (PyTuple_GET_SIZE(__pyx_args)) {4259 switch (PyTuple_GET_SIZE(__pyx_args)) {
4260 case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
4261 case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
3575 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);4262 case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
3576 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);4263 case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
3577 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);4264 case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3593,17 +4280,33 @@
3593 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);4280 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_row_factors);
3594 if (unlikely(value)) { values[2] = value; kw_args--; }4281 if (unlikely(value)) { values[2] = value; kw_args--; }
3595 }4282 }
4283 case 3:
4284 if (kw_args > 0) {
4285 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_row);
4286 if (unlikely(value)) { values[3] = value; kw_args--; }
4287 }
4288 case 4:
4289 if (kw_args > 0) {
4290 PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_offset_for_col);
4291 if (unlikely(value)) { values[4] = value; kw_args--; }
4292 }
3596 }4293 }
3597 if (unlikely(kw_args > 0)) {4294 if (unlikely(kw_args > 0)) {
3598 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;}4295 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;}
3599 }4296 }
3600 __pyx_v_tensor = values[0];4297 __pyx_v_tensor = values[0];
3601 __pyx_v_k = values[1];4298 __pyx_v_k = values[1];
3602 __pyx_v_row_factors = values[2];4299 __pyx_v_row_factors = values[2];
4300 __pyx_v_offset_for_row = values[3];
4301 __pyx_v_offset_for_col = values[4];
3603 } else {4302 } else {
3604 __pyx_v_k = __pyx_int_50;4303 __pyx_v_k = __pyx_int_50;
3605 __pyx_v_row_factors = Py_None;4304 __pyx_v_row_factors = Py_None;
4305 __pyx_v_offset_for_row = Py_None;
4306 __pyx_v_offset_for_col = Py_None;
3606 switch (PyTuple_GET_SIZE(__pyx_args)) {4307 switch (PyTuple_GET_SIZE(__pyx_args)) {
4308 case 5: __pyx_v_offset_for_col = PyTuple_GET_ITEM(__pyx_args, 4);
4309 case 4: __pyx_v_offset_for_row = PyTuple_GET_ITEM(__pyx_args, 3);
3607 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);4310 case 3: __pyx_v_row_factors = PyTuple_GET_ITEM(__pyx_args, 2);
3608 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);4311 case 2: __pyx_v_k = PyTuple_GET_ITEM(__pyx_args, 1);
3609 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);4312 case 1: __pyx_v_tensor = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3613,70 +4316,79 @@
3613 }4316 }
3614 goto __pyx_L4_argument_unpacking_done;4317 goto __pyx_L4_argument_unpacking_done;
3615 __pyx_L5_argtuple_error:;4318 __pyx_L5_argtuple_error:;
3616 __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;}4319 __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;}
3617 __pyx_L3_error:;4320 __pyx_L3_error:;
3618 __Pyx_AddTraceback("svdlib._svdlib.dictSvd");4321 __Pyx_AddTraceback("svdlib._svdlib.dictSvd");
3619 return NULL;4322 return NULL;
3620 __pyx_L4_argument_unpacking_done:;4323 __pyx_L4_argument_unpacking_done:;
3621 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);4324 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
36224325
3623 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2974326 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":265
3624 * 4327 *
3625 * def dictSvd(tensor, k=50, row_factors=None):4328 * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
3626 * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<4329 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col) # <<<<<<<<<<<<<<
3627 * CSC.dictPack()4330 * CSC.dictPack(row_factors)
3628 * return CSC.svdA(k)4331 * return CSC.svdA(k)
3629 */4332 */
3630 __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;}4333 __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;}
3631 __Pyx_GOTREF(((PyObject *)__pyx_t_1));4334 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3632 __Pyx_INCREF(__pyx_v_tensor);4335 __Pyx_INCREF(__pyx_v_tensor);
3633 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);4336 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
3634 __Pyx_GIVEREF(__pyx_v_tensor);4337 __Pyx_GIVEREF(__pyx_v_tensor);
4338 __Pyx_INCREF(__pyx_v_offset_for_row);
4339 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_offset_for_row);
4340 __Pyx_GIVEREF(__pyx_v_offset_for_row);
4341 __Pyx_INCREF(__pyx_v_offset_for_col);
4342 PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_offset_for_col);
4343 __Pyx_GIVEREF(__pyx_v_offset_for_col);
4344 __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;}
4345 __Pyx_GOTREF(__pyx_t_2);
4346 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4347 __Pyx_DECREF(__pyx_v_CSC);
4348 __pyx_v_CSC = __pyx_t_2;
4349 __pyx_t_2 = 0;
4350
4351 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":266
4352 * def dictSvd(tensor, k=50, row_factors=None, offset_for_row=None, offset_for_col=None):
4353 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
4354 * CSC.dictPack(row_factors) # <<<<<<<<<<<<<<
4355 * return CSC.svdA(k)
4356 *
4357 */
4358 __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;}
4359 __Pyx_GOTREF(__pyx_t_2);
4360 __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;}
4361 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3635 __Pyx_INCREF(__pyx_v_row_factors);4362 __Pyx_INCREF(__pyx_v_row_factors);
3636 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);4363 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
3637 __Pyx_GIVEREF(__pyx_v_row_factors);4364 __Pyx_GIVEREF(__pyx_v_row_factors);
3638 __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;}4365 __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;}
3639 __Pyx_GOTREF(__pyx_t_2);4366 __Pyx_GOTREF(__pyx_t_3);
3640 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3641 __Pyx_DECREF(__pyx_v_CSC);
3642 __pyx_v_CSC = __pyx_t_2;
3643 __pyx_t_2 = 0;
3644
3645 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":298
3646 * def dictSvd(tensor, k=50, row_factors=None):
3647 * CSC = CSCMatrix(tensor, row_factors)
3648 * CSC.dictPack() # <<<<<<<<<<<<<<
3649 * return CSC.svdA(k)
3650 *
3651 */
3652 __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;}
3653 __Pyx_GOTREF(__pyx_t_2);
3654 __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;}
3655 __Pyx_GOTREF(__pyx_t_1);
3656 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;4367 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3657 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;4368 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4369 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
36584370
3659 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":2994371 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":267
3660 * CSC = CSCMatrix(tensor, row_factors)4372 * CSC = CSCMatrix(tensor, offset_for_row, offset_for_col)
3661 * CSC.dictPack()4373 * CSC.dictPack(row_factors)
3662 * return CSC.svdA(k) # <<<<<<<<<<<<<<4374 * return CSC.svdA(k) # <<<<<<<<<<<<<<
3663 * 4375 *
3664 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):4376 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
3665 */4377 */
3666 __Pyx_XDECREF(__pyx_r);4378 __Pyx_XDECREF(__pyx_r);
3667 __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;}4379 __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;}
3668 __Pyx_GOTREF(__pyx_t_1);4380 __Pyx_GOTREF(__pyx_t_3);
3669 __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;}4381 __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;}
3670 __Pyx_GOTREF(((PyObject *)__pyx_t_2));4382 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3671 __Pyx_INCREF(__pyx_v_k);4383 __Pyx_INCREF(__pyx_v_k);
3672 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);4384 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
3673 __Pyx_GIVEREF(__pyx_v_k);4385 __Pyx_GIVEREF(__pyx_v_k);
3674 __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;}4386 __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;}
3675 __Pyx_GOTREF(__pyx_t_3);4387 __Pyx_GOTREF(__pyx_t_2);
3676 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;4388 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
3677 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;4389 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3678 __pyx_r = __pyx_t_3;4390 __pyx_r = __pyx_t_2;
3679 __pyx_t_3 = 0;4391 __pyx_t_2 = 0;
3680 goto __pyx_L0;4392 goto __pyx_L0;
36814393
3682 __pyx_r = Py_None; __Pyx_INCREF(Py_None);4394 __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -3694,12 +4406,12 @@
3694 return __pyx_r;4406 return __pyx_r;
3695}4407}
36964408
3697/* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":3014409/* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":269
3698 * return CSC.svdA(k)4410 * return CSC.svdA(k)
3699 * 4411 *
3700 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None): # <<<<<<<<<<<<<<4412 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None): # <<<<<<<<<<<<<<
3701 * CSC = CSCMatrix(tensor, row_factors)4413 * CSC = CSCMatrix(tensor)
3702 * CSC.pack()4414 * CSC.pack(row_factors)
3703 */4415 */
37044416
3705static PyObject *__pyx_pf_6svdlib_7_svdlib_isvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/4417static PyObject *__pyx_pf_6svdlib_7_svdlib_isvd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3760,7 +4472,7 @@
3760 }4472 }
3761 }4473 }
3762 if (unlikely(kw_args > 0)) {4474 if (unlikely(kw_args > 0)) {
3763 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;}4475 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;}
3764 }4476 }
3765 __pyx_v_tensor = values[0];4477 __pyx_v_tensor = values[0];
3766 __pyx_v_k = values[1];4478 __pyx_v_k = values[1];
@@ -3784,76 +4496,79 @@
3784 }4496 }
3785 goto __pyx_L4_argument_unpacking_done;4497 goto __pyx_L4_argument_unpacking_done;
3786 __pyx_L5_argtuple_error:;4498 __pyx_L5_argtuple_error:;
3787 __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;}4499 __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;}
3788 __pyx_L3_error:;4500 __pyx_L3_error:;
3789 __Pyx_AddTraceback("svdlib._svdlib.isvd");4501 __Pyx_AddTraceback("svdlib._svdlib.isvd");
3790 return NULL;4502 return NULL;
3791 __pyx_L4_argument_unpacking_done:;4503 __pyx_L4_argument_unpacking_done:;
3792 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);4504 __pyx_v_CSC = Py_None; __Pyx_INCREF(Py_None);
37934505
3794 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":3024506 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":270
3795 * 4507 *
3796 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):4508 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
3797 * CSC = CSCMatrix(tensor, row_factors) # <<<<<<<<<<<<<<4509 * CSC = CSCMatrix(tensor) # <<<<<<<<<<<<<<
3798 * CSC.pack()4510 * CSC.pack(row_factors)
3799 * return CSC.isvd(k, niter, lrate)4511 * return CSC.isvd(k, niter, lrate)
3800 */4512 */
3801 __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;}4513 __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;}
3802 __Pyx_GOTREF(((PyObject *)__pyx_t_1));4514 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3803 __Pyx_INCREF(__pyx_v_tensor);4515 __Pyx_INCREF(__pyx_v_tensor);
3804 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);4516 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tensor);
3805 __Pyx_GIVEREF(__pyx_v_tensor);4517 __Pyx_GIVEREF(__pyx_v_tensor);
4518 __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;}
4519 __Pyx_GOTREF(__pyx_t_2);
4520 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4521 __Pyx_DECREF(__pyx_v_CSC);
4522 __pyx_v_CSC = __pyx_t_2;
4523 __pyx_t_2 = 0;
4524
4525 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":271
4526 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
4527 * CSC = CSCMatrix(tensor)
4528 * CSC.pack(row_factors) # <<<<<<<<<<<<<<
4529 * return CSC.isvd(k, niter, lrate)
4530 *
4531 */
4532 __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;}
4533 __Pyx_GOTREF(__pyx_t_2);
4534 __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;}
4535 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3806 __Pyx_INCREF(__pyx_v_row_factors);4536 __Pyx_INCREF(__pyx_v_row_factors);
3807 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_factors);4537 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_row_factors);
3808 __Pyx_GIVEREF(__pyx_v_row_factors);4538 __Pyx_GIVEREF(__pyx_v_row_factors);
3809 __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;}4539 __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;}
3810 __Pyx_GOTREF(__pyx_t_2);4540 __Pyx_GOTREF(__pyx_t_3);
3811 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
3812 __Pyx_DECREF(__pyx_v_CSC);
3813 __pyx_v_CSC = __pyx_t_2;
3814 __pyx_t_2 = 0;
3815
3816 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":303
3817 * def isvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
3818 * CSC = CSCMatrix(tensor, row_factors)
3819 * CSC.pack() # <<<<<<<<<<<<<<
3820 * return CSC.isvd(k, niter, lrate)
3821 *
3822 */
3823 __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;}
3824 __Pyx_GOTREF(__pyx_t_2);
3825 __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;}
3826 __Pyx_GOTREF(__pyx_t_1);
3827 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;4541 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
3828 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;4542 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
4543 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
38294544
3830 /* "/home/kcarnold/csc/divisi/svdlib/_svdlib.pyx":3044545 /* "/home/kcarnold/code/divisi/svdlib/_svdlib.pyx":272
3831 * CSC = CSCMatrix(tensor, row_factors)4546 * CSC = CSCMatrix(tensor)
3832 * CSC.pack()4547 * CSC.pack(row_factors)
3833 * return CSC.isvd(k, niter, lrate) # <<<<<<<<<<<<<<4548 * return CSC.isvd(k, niter, lrate) # <<<<<<<<<<<<<<
3834 * 4549 *
3835 * def dictIsvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):4550 * def dictIsvd(tensor, k=50, niter=100, lrate=.001, row_factors=None):
3836 */4551 */
3837 __Pyx_XDECREF(__pyx_r);4552 __Pyx_XDECREF(__pyx_r);
3838 __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;}4553 __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;}
3839 __Pyx_GOTREF(__pyx_t_1);4554 __Pyx_GOTREF(__pyx_t_3);
3840 __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;}4555 __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;}
3841 __Pyx_GOTREF(((PyObject *)__pyx_t_2));4556 __Pyx_GOTREF(((PyObject *)__pyx_t_1));
3842 __Pyx_INCREF(__pyx_v_k);4557 __Pyx_INCREF(__pyx_v_k);
3843 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);4558 PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
3844 __Pyx_GIVEREF(__pyx_v_k);4559 __Pyx_GIVEREF(__pyx_v_k);
3845 __Pyx_INCREF(__pyx_v_niter);4560 __Pyx_INCREF(__pyx_v_niter);
3846 PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_niter);4561 PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_niter);
3847 __Pyx_GIVEREF(__pyx_v_niter);4562 __Pyx_GIVEREF(__pyx_v_niter);
3848 __Pyx_INCREF(__pyx_v_lrate);4563 __Pyx_INCREF(__pyx_v_lrate);
3849 PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_lrate);4564 PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_lrate);
3850 __Pyx_GIVEREF(__pyx_v_lrate);4565 __Pyx_GIVEREF(__pyx_v_lrate);
3851 __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