/
amatrix.ts
57 lines (41 loc) · 1.32 KB
/
amatrix.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { assert } from "@thi.ng/api";
import type { NzEntry } from "./api";
export abstract class ASparseMatrix {
m: number;
n: number;
constructor(m: number, n: number) {
this.m = m;
this.n = n;
}
abstract nzEntries(): IterableIterator<NzEntry>;
abstract at(m: number, n: number, safe?: boolean): number;
abstract setAt(m: number, n: number, v: number, safe?: boolean): this;
abstract nnz(): number;
abstract nnzCol(n: number): number;
abstract nnzRow(m: number): number;
abstract nzColRows(n: number): number[];
abstract nzColVals(n: number): number[];
abstract nzRowCols(m: number): number[];
abstract nzRowVals(m: number): number[];
abstract toDense(): number[];
trace() {
assert(this.m === this.n, "matrix is non-square");
let trace = 0;
for (let i = this.m; --i >= 0; ) {
trace += this.at(i, i, false);
}
return trace;
}
protected ensureIndex(m: number, n: number) {
assert(
m >= 0 && m < this.m && n >= 0 && n < this.n,
`index out of bounds (${m}, ${n})`
);
}
protected ensureSize(mat: ASparseMatrix) {
assert(
mat.m === this.m && mat.n === this.n,
`incompatible size: (${mat.m},${mat.n})`
);
}
}