comparison yetilab/matrix/matrix.yeti @ 252:efdb1aee9d21

Another minor improvement
author Chris Cannam
date Tue, 21 May 2013 14:29:22 +0100
parents 9fe3192cce38
children 5eb57c649de0 8043f7405eae
comparison
equal deleted inserted replaced
251:9fe3192cce38 252:efdb1aee9d21
69 end = d.pointers[n+1]; 69 end = d.pointers[n+1];
70 { 70 {
71 values = vec.slice d.values start end, 71 values = vec.slice d.values start end,
72 indices = slice d.indices start end, 72 indices = slice d.indices start end,
73 }); 73 });
74
75 nonEmptySlices d =
76 (ne = array [];
77 for [0..length d.pointers - 2] do i:
78 if d.pointers[i] != d.pointers[i+1] then
79 push ne i
80 fi
81 done;
82 ne);
74 83
75 fromSlice n m d = 84 fromSlice n m d =
76 (slice = sparseSlice n d; 85 (slice = sparseSlice n d;
77 var v = 0; 86 var v = 0;
78 for [0..length slice.indices - 1] do i: 87 for [0..length slice.indices - 1] do i:
387 SparseCSC d: 396 SparseCSC d:
388 (e = enumerateSparse m1; 397 (e = enumerateSparse m1;
389 entries = 398 entries =
390 (map do j': 399 (map do j':
391 cs = sparseSlice j' d; 400 cs = sparseSlice j' d;
392 if empty? cs.indices then 401 hin = mapIntoHash
393 [] 402 (at cs.indices) ((flip vec.at) cs.values)
394 else 403 [0..length cs.indices - 1];
395 hin = mapIntoHash 404 hout = [:];
396 (at cs.indices) ((flip vec.at) cs.values) 405 for e do { v, i, j }:
397 [0..length cs.indices - 1]; 406 if j in hin then
398 hout = [:]; 407 p = v * hin[j];
399 for e do { v, i, j }: 408 hout[i] := p + (if i in hout then hout[i] else 0 fi);
400 if j in hin then 409 fi
401 p = v * hin[j]; 410 done;
402 hout[i] := p + (if i in hout then hout[i] else 0 fi); fi 411 map do i:
403 done; 412 { i, j = j', v = hout[i] }
404 map do i: 413 done (keys hout);
405 { i, j = j', v = hout[i] } 414 done (nonEmptySlices d));
406 done (keys hout);
407 fi
408 done [0..size.columns - 1]);
409 makeSparse (ColumnMajor ()) size (concat entries)); 415 makeSparse (ColumnMajor ()) size (concat entries));
410 SparseCSR _: 416 SparseCSR _:
411 sparseProduct size m1 (flipped m2); 417 sparseProduct size m1 (flipped m2);
412 _: failWith "sparseProduct called for non-sparse matrices"; 418 _: failWith "sparseProduct called for non-sparse matrices";
413 esac; 419 esac;