@@ -5,26 +5,29 @@ type Matrix<'a when 'a : struct and 'a : equality>() =
55 abstract RowCount: int
66 abstract ColumnCount: int
77
8- abstract Item: Mask2D < 'a > -> Matrix < 'a > with get, set
9- abstract Item: Mask1D < 'a > * int -> Vector < 'a > with get, set
10- abstract Item: int * Mask1D < 'a > -> Vector < 'a > with get, set
8+ abstract Mask: Mask2D option
9+ abstract Complemented: Mask2D option
10+
11+ abstract Item: Mask2D option -> Matrix < 'a > with get, set
12+ abstract Item: Mask1D option * int -> Vector < 'a > with get, set
13+ abstract Item: int * Mask1D option -> Vector < 'a > with get, set
1114 abstract Item: int * int -> Scalar < 'a > with get, set
12- abstract Item: Mask2D < 'a > -> Scalar < 'a > with set
13- abstract Item: Mask1D < 'a > * int -> Scalar < 'a > with set
14- abstract Item: int * Mask1D < 'a > -> Scalar < 'a > with set
15-
16- abstract Mxm: Matrix < 'a > -> Mask2D < 'a > -> Semiring < 'a > -> Matrix < 'a >
17- abstract Mxv: Vector < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> Vector < 'a >
18- abstract EWiseAdd: Matrix < 'a > -> Mask2D < 'a > -> Semiring < 'a > -> Matrix < 'a >
19- abstract EWiseMult: Matrix < 'a > -> Mask2D < 'a > -> Semiring < 'a > -> Matrix < 'a >
20- abstract Apply: Mask1D < 'a > -> UnaryOp < 'a , 'b > -> Matrix < 'b >
21- abstract ReduceIn: Mask1D < 'a > -> Monoid < 'a > -> Vector < 'a >
22- abstract ReduceOut: Mask1D < 'a > -> Monoid < 'a > -> Vector < 'a >
15+ abstract Item: Mask2D option -> Scalar < 'a > with set
16+ abstract Item: Mask1D option * int -> Scalar < 'a > with set
17+ abstract Item: int * Mask1D option -> Scalar < 'a > with set
18+
19+ abstract Mxm: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> Matrix < 'a >
20+ abstract Mxv: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
21+ abstract EWiseAdd: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> Matrix < 'a >
22+ abstract EWiseMult: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> Matrix < 'a >
23+ abstract Apply: Mask1D option -> UnaryOp < 'a , 'b > -> Matrix < 'b >
24+ abstract ReduceIn: Mask1D option -> Monoid < 'a > -> Vector < 'a >
25+ abstract ReduceOut: Mask1D option -> Monoid < 'a > -> Vector < 'a >
2326 abstract T: Matrix < 'a >
2427
25- abstract EWiseAddInplace: Matrix < 'a > -> Mask2D < 'a > -> Semiring < 'a > -> unit
26- abstract EWiseMultInplace: Matrix < 'a > -> Mask2D < 'a > -> Semiring < 'a > -> unit
27- abstract ApplyInplace: Mask2D < 'a > -> UnaryOp < 'a , 'b > -> unit
28+ abstract EWiseAddInplace: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> unit
29+ abstract EWiseMultInplace: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> unit
30+ abstract ApplyInplace: Mask2D option -> UnaryOp < 'a , 'b > -> unit
2831
2932 static member inline (+) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseAdd y
3033 static member inline (*) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseMult y
@@ -37,32 +40,47 @@ and [<AbstractClass>] Vector<'a when 'a : struct and 'a : equality>() =
3740 abstract Length: int
3841 abstract AsArray: 'a []
3942
40- abstract Item: Mask1D < 'a > -> Vector < 'a > with get, set
41- abstract Item: int * int -> Scalar < 'a > with get, set
42- abstract Item: Mask1D < 'a > -> Scalar < 'a > with set
43+ abstract Mask: Mask1D option
44+ abstract Complemented: Mask1D option
45+
46+ abstract Item: Mask1D option -> Vector < 'a > with get, set
47+ abstract Item: int -> Scalar < 'a > with get, set
48+ abstract Item: Mask1D option -> Scalar < 'a > with set
4349
44- abstract Vxm: Matrix < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> Vector < 'a >
45- abstract EWiseAdd: Vector < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> Vector < 'a >
46- abstract EWiseMult: Vector < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> Vector < 'a >
47- abstract Apply: Mask1D < 'a > -> UnaryOp < 'a , 'b > -> Vector < 'b >
50+ abstract Vxm: Matrix < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
51+ abstract EWiseAdd: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
52+ abstract EWiseMult: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
53+ abstract Apply: Mask1D option -> UnaryOp < 'a , 'b > -> Vector < 'b >
4854 abstract Reduce: Monoid < 'a > -> Scalar < 'a >
4955
50- abstract EWiseAddInplace: Vector < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> unit
51- abstract EWiseMultInplace: Vector < 'a > -> Mask1D < 'a > -> Semiring < 'a > -> unit
52- abstract ApplyInplace: Mask1D < 'a > -> UnaryOp < 'a , 'b > -> unit
56+ abstract EWiseAddInplace: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> unit
57+ abstract EWiseMultInplace: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> unit
58+ abstract ApplyInplace: Mask1D option -> UnaryOp < 'a , 'b > -> unit
5359
5460 static member inline (+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAdd y
5561 static member inline (*) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMult y
5662 static member inline (+. *) ( x : Vector < 'a >, y : Matrix < 'a >) = x.Vxm y
5763 static member inline (.+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAddInplace y
5864 static member inline (. *) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMultInplace y
5965
60- and Mask1D < 'a when 'a : struct and 'a : equality > =
61- | Mask1D of Vector < 'a >
62- | Complemented1D of Vector < 'a >
63- | None
66+ and Mask1D ( indices : int [], length : int , isComplemented : bool ) =
67+ member this.IsComplemented = isComplemented
68+
69+ member this.Indices = indices
70+ member this.Length = length
71+
72+ member this.Item
73+ with get ( idx : int ) : bool =
74+ this.Indices |> Array.exists ( ( = ) idx) |> ( <> ) this.IsComplemented
75+
76+ and Mask2D ( indices : ( int * int )[], rowCount : int , columnCount : int , isComplemented : bool ) =
77+ member this.IsComplemented = isComplemented
78+
79+ member this.Rows = indices |> Array.unzip |> fst
80+ member this.Columns = indices |> Array.unzip |> snd
81+ member this.RowCount = rowCount
82+ member this.ColumnCount = columnCount
6483
65- and Mask2D < 'a when 'a : struct and 'a : equality > =
66- | Mask2D of Matrix < 'a >
67- | Complemented2D of Matrix < 'a >
68- | None
84+ member this.Item
85+ with get ( rowIdx : int , colIdx : int ) : bool =
86+ Array.zip this.Rows this.Columns |> Array.exists ( ( = ) ( rowIdx, colIdx)) |> ( <> ) this.IsComplemented
0 commit comments