@@ -2,81 +2,114 @@ namespace GraphBLAS.FSharp
22
33open Brahma.FSharp .OpenCL .WorkflowBuilder .Evaluation
44
5+ (*
6+ везде вместо того, чтобы возвращать unit, можно возвращать измененный объект,
7+ но нужно подумать, насколько создание нового объекта лучше/хуже изменения существующего
8+ копирование большмх матриц явно хуже и зачем, а вот Clear сделать не inplace мб имеет смысл
9+
10+ везде методы, тк проперти не соответсвуют концепции отсутствия вычислений,
11+ хотя выглядеть будет оч плохо
12+
13+ можно все операции, в которых не меняется структура объекта, сделать inplace
14+ (хотя, если операция затрагивает весь объект, то все равно читать и писать,
15+ единственно, что памяти единовременно в 2 раза больше потребуется)
16+
17+ теперь есть единственный метод GetMask (без GetComplemented)
18+ тк это теперь не свойство, то требует аргумента, а значит можно передавать isComplemented
19+
20+ методы Extract и Assign, которые возвращают/присваивают подграф, семантически отличаются от тех, что в C
21+ здесь возвращаемый подграф (подматрица) всегда того же размера, что и изначальная матрица
22+ (т.е в матрице смежности вершины графа не удалаются, а только ребра)
23+ поэтому перед операцией нужно сравнивать размерности матрицы и маски, по которой мы получаем подграф
24+ чтобы удалить еще и вершины, можно потом сделать resize
25+
26+ у вектора размерность теперь называется size, а не length, потому что идейно вектор -- набор вершин
27+ + в C API тоже size
28+
29+ метод Prune можно переименовать в Select или Filter
30+
31+ нужно выяснить, как Partitial Aplication методы интеропятся с C#
32+
33+ возможно, стоит отказаться от перегрузок Extract и Assign, чтобы сделать их PA,
34+ тем самым, избавившись от скобок при вызове
35+
36+ можно все методы сделать как методы C# (без PA), а рядом положить модуль с PA функциями
37+ это нужно, для более гибкого интерфейся и лучшего интеропа с C#
38+ *)
39+
540[<AbstractClass>]
641type Matrix < 'a when 'a : struct and 'a : equality >( nrow : int , ncol : int ) =
742 abstract RowCount: int
843 abstract ColumnCount: int
944 default this.RowCount = nrow
1045 default this.ColumnCount = ncol
1146
12- abstract Extract: Mask2D option -> Matrix < 'a >
13- abstract Extract: ( Mask1D option * int ) -> Vector < 'a >
14- abstract Extract: ( int * Mask1D option ) -> Vector < 'a >
15- abstract Extract: ( int * int ) -> Scalar < 'a >
16- // Размерности должны совпадать
17- abstract Assign: Mask2D option * Matrix < 'a > -> unit
18- abstract Assign: ( Mask1D option * int ) * Vector < 'a > -> unit
19- abstract Assign: ( int * Mask1D option ) * Vector < 'a > -> unit
20- abstract Assign: ( int * int ) * Scalar < 'a > -> unit
21- abstract Assign: Mask2D option * Scalar < 'a > -> unit
22- abstract Assign: ( Mask1D option * int ) * Scalar < 'a > -> unit
23- abstract Assign: ( int * Mask1D option ) * Scalar < 'a > -> unit
24- // abstract Resize
25- // abstract Dup
26- // abstract Clear
27- // abstract NNZ
28- // abstract Tuples: OpenCLEvaluation<{| Rows: int[]; Columns: int[]; Values: 'a[] |}>
29-
30- abstract Mxm: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> Matrix < 'a >
31- abstract Mxv: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
32- abstract EWiseAdd: Matrix < 'a > -> Mask2D option -> Monoid < 'a > -> Matrix < 'a >
33- abstract EWiseMult: Matrix < 'a > -> Mask2D option -> Monoid < 'a > -> Matrix < 'a >
34- abstract Apply: Mask2D option -> UnaryOp < 'a , 'b > -> Matrix < 'b >
35- abstract Prune: Mask2D option -> UnaryOp < 'a , bool > -> Matrix < 'a >
36- abstract ReduceIn: Mask1D option -> Monoid < 'a > -> Vector < 'a >
37- abstract ReduceOut: Mask1D option -> Monoid < 'a > -> Vector < 'a >
38- abstract Reduce: Monoid < 'a > -> Scalar < 'a >
39- abstract T: Matrix < 'a >
40- // abstract Kronecker
41-
42- abstract Mask: Mask2D option
43- abstract Complemented: Mask2D option
47+ abstract Clear: unit -> OpenCLEvaluation < unit >
48+ abstract Copy: unit -> OpenCLEvaluation < Matrix < 'a >>
49+ abstract Resize: int -> int -> OpenCLEvaluation < Matrix < 'a >>
50+ abstract GetNNZ: unit -> OpenCLEvaluation < int >
51+ abstract GetTuples: unit -> OpenCLEvaluation <{| Rows : int []; Columns : int []; Values : 'a [] |}>
52+ abstract GetMask: bool -> OpenCLEvaluation < Mask2D option >
53+
54+ abstract Extract: Mask2D option -> OpenCLEvaluation < Matrix < 'a >>
55+ abstract Extract: ( Mask1D option * int ) -> OpenCLEvaluation < Vector < 'a >>
56+ abstract Extract: ( int * Mask1D option ) -> OpenCLEvaluation < Vector < 'a >>
57+ abstract Extract: ( int * int ) -> OpenCLEvaluation < Scalar < 'a >>
58+ abstract Assign: Mask2D option * Matrix < 'a > -> OpenCLEvaluation < unit >
59+ abstract Assign: ( Mask1D option * int ) * Vector < 'a > -> OpenCLEvaluation < unit >
60+ abstract Assign: ( int * Mask1D option ) * Vector < 'a > -> OpenCLEvaluation < unit >
61+ abstract Assign: ( int * int ) * Scalar < 'a > -> OpenCLEvaluation < unit >
62+ abstract Assign: Mask2D option * Scalar < 'a > -> OpenCLEvaluation < unit >
63+ abstract Assign: ( Mask1D option * int ) * Scalar < 'a > -> OpenCLEvaluation < unit >
64+ abstract Assign: ( int * Mask1D option ) * Scalar < 'a > -> OpenCLEvaluation < unit >
65+
66+ abstract Mxm: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> OpenCLEvaluation < Matrix < 'a >>
67+ abstract Mxv: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> OpenCLEvaluation < Vector < 'a >>
68+ abstract EWiseAdd: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> OpenCLEvaluation < Matrix < 'a >>
69+ abstract EWiseMult: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> OpenCLEvaluation < Matrix < 'a >>
70+ abstract Apply: Mask2D option -> UnaryOp < 'a , 'b > -> OpenCLEvaluation < Matrix < 'b >>
71+ abstract Prune: Mask2D option -> UnaryOp < 'a , bool > -> OpenCLEvaluation < Matrix < 'a >>
72+ abstract ReduceIn: Mask1D option -> Monoid < 'a > -> OpenCLEvaluation < Vector < 'a >>
73+ abstract ReduceOut: Mask1D option -> Monoid < 'a > -> OpenCLEvaluation < Vector < 'a >>
74+ abstract Reduce: Monoid < 'a > -> OpenCLEvaluation < Scalar < 'a >>
75+ abstract Transpose: unit -> OpenCLEvaluation < Matrix < 'a >>
76+ abstract Kronecker: Matrix < 'a > -> Mask2D option -> Semiring < 'a > -> OpenCLEvaluation < Matrix < 'a >>
4477
4578 static member inline (+) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseAdd y
4679 static member inline (*) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseMult y
4780 static member inline (@.) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.Mxm y
4881 static member inline (@.) ( x : Matrix < 'a >, y : Vector < 'a >) = x.Mxv y
4982
50- and [<AbstractClass>] Vector < 'a when 'a : struct and 'a : equality >( length : int ) =
51- abstract Length: int
52- default this.Length = length
53-
54- abstract Clear: unit -> unit
55- abstract Extract: Mask1D option -> Vector < 'a >
56- abstract Extract: int -> Scalar < 'a >
57- abstract Assign: Mask1D option * Vector < 'a > -> unit
58- abstract Assign: int * Scalar < 'a > -> unit
59- abstract Assign: Mask1D option * Scalar < 'a > -> unit
60- // abstract Dup
61- // abstract Resize
62- // abstrct Clear
63- // abstract NNZ
64- // abstract Tuples: {| Indices: int[]; Values: 'a[] |}
65-
66- abstract Vxm: Matrix < 'a > -> Mask1D option -> Semiring < 'a > -> Vector < 'a >
67- abstract EWiseAdd: Vector < 'a > -> Mask1D option -> Monoid < 'a > -> Vector < 'a >
68- abstract EWiseMult: Vector < 'a > -> Mask1D option -> Monoid < 'a > -> Vector < 'a >
69- abstract Apply: Mask1D option -> UnaryOp < 'a , 'b > -> Vector < 'b >
70- abstract Prune: Mask1D option -> UnaryOp < 'a , bool > -> Vector < 'a >
71- abstract Reduce: Monoid < 'a > -> Scalar < 'a >
72-
73- abstract Mask: Mask1D option
74- abstract Complemented: Mask1D option
83+
84+ and [<AbstractClass>] Vector < 'a when 'a : struct and 'a : equality >( size : int ) =
85+ abstract Size: int
86+ default this.Size = size
87+
88+ abstract Clear: unit -> OpenCLEvaluation < unit >
89+ abstract Copy: unit -> OpenCLEvaluation < Vector < 'a >>
90+ abstract Resize: int -> OpenCLEvaluation < Vector < 'a >>
91+ abstract GetNNZ: unit -> OpenCLEvaluation < int >
92+ abstract GetTuples: unit -> OpenCLEvaluation <{| Indices : int []; Values : 'a [] |}>
93+ abstract GetMask: bool -> OpenCLEvaluation < Mask1D option >
94+
95+ abstract Extract: Mask1D option -> OpenCLEvaluation < Vector < 'a >>
96+ abstract Extract: int -> OpenCLEvaluation < Scalar < 'a >>
97+ abstract Assign: Mask1D option * Vector < 'a > -> OpenCLEvaluation < unit >
98+ abstract Assign: int * Scalar < 'a > -> OpenCLEvaluation < unit >
99+ abstract Assign: Mask1D option * Scalar < 'a > -> OpenCLEvaluation < unit >
100+
101+ abstract Vxm: Matrix < 'a > -> Mask1D option -> Semiring < 'a > -> OpenCLEvaluation < Vector < 'a >>
102+ abstract EWiseAdd: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> OpenCLEvaluation < Vector < 'a >>
103+ abstract EWiseMult: Vector < 'a > -> Mask1D option -> Semiring < 'a > -> OpenCLEvaluation < Vector < 'a >>
104+ abstract Apply: Mask1D option -> UnaryOp < 'a , 'b > -> OpenCLEvaluation < Vector < 'b >>
105+ abstract Prune: Mask1D option -> UnaryOp < 'a , bool > -> OpenCLEvaluation < Vector < 'a >>
106+ abstract Reduce: Monoid < 'a > -> OpenCLEvaluation < Scalar < 'a >>
75107
76108 static member inline (+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAdd y
77109 static member inline (*) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMult y
78110 static member inline (@.) ( x : Vector < 'a >, y : Matrix < 'a >) = x.Vxm y
79111
112+
80113and Mask1D ( indices : int [], length : int , isComplemented : bool ) =
81114 member this.Indices = indices
82115 member this.Length = length
@@ -85,9 +118,10 @@ and Mask1D(indices: int[], length: int, isComplemented: bool) =
85118 member this.Item
86119 with get ( idx : int ) : bool =
87120 this.Indices
88- |> Array.exists ((=) idx)
121+ |> Array.contains idx
89122 |> (<>) this.IsComplemented
90123
124+
91125and Mask2D ( indices : ( int * int )[], rowCount : int , columnCount : int , isComplemented : bool ) =
92126 member this.Rows = indices |> Array.unzip |> fst
93127 member this.Columns = indices |> Array.unzip |> snd
@@ -99,5 +133,5 @@ and Mask2D(indices: (int * int)[], rowCount: int, columnCount: int, isComplement
99133 with get ( rowIdx : int , colIdx : int ) : bool =
100134 ( this.Rows, this.Columns)
101135 ||> Array.zip
102- |> Array.exists ((=) ( rowIdx, colIdx) )
136+ |> Array.contains ( rowIdx, colIdx)
103137 |> (<>) this.IsComplemented
0 commit comments