@@ -2,81 +2,114 @@ namespace GraphBLAS.FSharp
2
2
3
3
open Brahma.FSharp .OpenCL .WorkflowBuilder .Evaluation
4
4
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
+
5
40
[<AbstractClass>]
6
41
type Matrix < 'a when 'a : struct and 'a : equality >( nrow : int , ncol : int ) =
7
42
abstract RowCount: int
8
43
abstract ColumnCount: int
9
44
default this.RowCount = nrow
10
45
default this.ColumnCount = ncol
11
46
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 >>
44
77
45
78
static member inline (+) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseAdd y
46
79
static member inline (*) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.EWiseMult y
47
80
static member inline (@.) ( x : Matrix < 'a >, y : Matrix < 'a >) = x.Mxm y
48
81
static member inline (@.) ( x : Matrix < 'a >, y : Vector < 'a >) = x.Mxv y
49
82
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 >>
75
107
76
108
static member inline (+) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseAdd y
77
109
static member inline (*) ( x : Vector < 'a >, y : Vector < 'a >) = x.EWiseMult y
78
110
static member inline (@.) ( x : Vector < 'a >, y : Matrix < 'a >) = x.Vxm y
79
111
112
+
80
113
and Mask1D ( indices : int [], length : int , isComplemented : bool ) =
81
114
member this.Indices = indices
82
115
member this.Length = length
@@ -85,9 +118,10 @@ and Mask1D(indices: int[], length: int, isComplemented: bool) =
85
118
member this.Item
86
119
with get ( idx : int ) : bool =
87
120
this.Indices
88
- |> Array.exists ((=) idx)
121
+ |> Array.contains idx
89
122
|> (<>) this.IsComplemented
90
123
124
+
91
125
and Mask2D ( indices : ( int * int )[], rowCount : int , columnCount : int , isComplemented : bool ) =
92
126
member this.Rows = indices |> Array.unzip |> fst
93
127
member this.Columns = indices |> Array.unzip |> snd
@@ -99,5 +133,5 @@ and Mask2D(indices: (int * int)[], rowCount: int, columnCount: int, isComplement
99
133
with get ( rowIdx : int , colIdx : int ) : bool =
100
134
( this.Rows, this.Columns)
101
135
||> Array.zip
102
- |> Array.exists ((=) ( rowIdx, colIdx) )
136
+ |> Array.contains ( rowIdx, colIdx)
103
137
|> (<>) this.IsComplemented
0 commit comments