@@ -5,26 +5,28 @@ 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 CreateMask: bool -> Mask2D
9+
10+ abstract Item: Mask2D -> Matrix < 'a > with get, set
11+ abstract Item: Mask1D * int -> Vector < 'a > with get, set
12+ abstract Item: int * Mask1D -> Vector < 'a > with get, set
1113 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 >
14+ abstract Item: Mask2D -> Scalar < 'a > with set
15+ abstract Item: Mask1D * int -> Scalar < 'a > with set
16+ abstract Item: int * Mask1D -> Scalar < 'a > with set
17+
18+ abstract Mxm: Matrix < 'a > -> Mask2D -> Semiring < 'a > -> Matrix < 'a >
19+ abstract Mxv: Vector < 'a > -> Mask1D -> Semiring < 'a > -> Vector < 'a >
20+ abstract EWiseAdd: Matrix < 'a > -> Mask2D -> Semiring < 'a > -> Matrix < 'a >
21+ abstract EWiseMult: Matrix < 'a > -> Mask2D -> Semiring < 'a > -> Matrix < 'a >
22+ abstract Apply: Mask1D -> UnaryOp < 'a , 'b > -> Matrix < 'b >
23+ abstract ReduceIn: Mask1D -> Monoid < 'a > -> Vector < 'a >
24+ abstract ReduceOut: Mask1D -> Monoid < 'a > -> Vector < 'a >
2325 abstract T: Matrix < 'a >
2426
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
27+ abstract EWiseAddInplace: Matrix < 'a > -> Mask2D -> Semiring < 'a > -> unit
28+ abstract EWiseMultInplace: Matrix < 'a > -> Mask2D -> Semiring < 'a > -> unit
29+ abstract ApplyInplace: Mask2D -> UnaryOp < 'a , 'b > -> unit
2830
2931 static member inline (+) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseAdd y
3032 static member inline (*) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseMult y
@@ -37,32 +39,56 @@ and [<AbstractClass>] Vector<'a when 'a : struct and 'a : equality>() =
3739 abstract Length: int
3840 abstract AsArray: 'a []
3941
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
42+ abstract CreateMask: bool -> Mask1D
4343
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 >
44+ abstract Item: Mask1D -> Vector < 'a > with get, set
45+ abstract Item: int -> Scalar < 'a > with get, set
46+ abstract Item: Mask1D -> Scalar < 'a > with set
47+
48+ abstract Vxm: Matrix < 'a > -> Mask1D -> Semiring < 'a > -> Vector < 'a >
49+ abstract EWiseAdd: Vector < 'a > -> Mask1D -> Semiring < 'a > -> Vector < 'a >
50+ abstract EWiseMult: Vector < 'a > -> Mask1D -> Semiring < 'a > -> Vector < 'a >
51+ abstract Apply: Mask1D -> UnaryOp < 'a , 'b > -> Vector < 'b >
4852 abstract Reduce: Monoid < 'a > -> Scalar < 'a >
4953
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
54+ abstract EWiseAddInplace: Vector < 'a > -> Mask1D -> Semiring < 'a > -> unit
55+ abstract EWiseMultInplace: Vector < 'a > -> Mask1D -> Semiring < 'a > -> unit
56+ abstract ApplyInplace: Mask1D -> UnaryOp < 'a , 'b > -> unit
5357
5458 static member inline (+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAdd y
5559 static member inline (*) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMult y
5660 static member inline (+. *) ( x : Vector < 'a >, y : Matrix < 'a >) = x.Vxm y
5761 static member inline (.+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAddInplace y
5862 static member inline (. *) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMultInplace y
5963
60- and Mask1D < 'a when 'a : struct and 'a : equality > =
61- | Mask1D of Vector < 'a >
62- | Complemented1D of Vector < 'a >
63- | None
64+ and Mask1D ( isNone : bool , indices : int [], length : int , isRegular : bool ) =
65+ member this.IsNone = isNone
66+ member this.IsRegular = isRegular
67+
68+ member this.Indices = indices
69+ member this.Length = length
70+
71+ member this.Item
72+ with get ( idx : int ) : bool =
73+ this.IsNone || this.Indices |> Array.exists ( ( = ) idx) |> ( = ) this.IsRegular
74+
75+ static member Create ( vector : Vector < 'a >) = vector.CreateMask true
76+ static member Complemented ( vector : Vector < 'a >) = vector.CreateMask false
77+ static member None = Mask1D( true , Array.empty, 0 , true )
78+
79+ and Mask2D ( isNone : bool , rows : int [], columns : int [], rowCount : int , columnCount : int , isRegular : bool ) =
80+ member this.IsNone = isNone
81+ member this.IsRegular = isRegular
82+
83+ member this.Rows = rows
84+ member this.Columns = columns
85+ member this.RowCount = rowCount
86+ member this.ColumnCount = columnCount
87+
88+ member this.Item
89+ with get ( rowIdx : int , colIdx : int ) : bool =
90+ this.IsNone || Array.zip this.Rows this.Columns |> Array.exists ( ( = ) ( rowIdx, colIdx)) |> ( = ) this.IsRegular
6491
65- and Mask2D < 'a when 'a : struct and 'a : equality > =
66- | Mask2D of Matrix < 'a >
67- | Complemented2D of Matrix < 'a >
68- | None
92+ static member Create ( matrix : Matrix < 'a >) = matrix.CreateMask true
93+ static member Complemented ( matrix : Matrix < 'a >) = matrix.CreateMask false
94+ static member None = Mask2D( true , Array.empty, Array.empty, 0 , 0 , true )
0 commit comments