11namespace GraphBLAS.FSharp
22
3+ open Brahma.FSharp .OpenCL
4+ open GraphBLAS.FSharp .Backend
5+
36type MatrixFromat =
47 | CSR
58 | COO
@@ -18,6 +21,89 @@ type Matrix<'a when 'a: struct> =
1821 | MatrixCSR matrix -> matrix.ColumnCount
1922 | MatrixCOO matrix -> matrix.ColumnCount
2023
24+ member this.NNZCount =
25+ match this with
26+ | MatrixCOO m -> m.Values.Length
27+ | MatrixCSR m -> m.Values.Length
28+
29+ member this.ToBackend ( context : ClContext ) =
30+ match this with
31+ | MatrixCOO m ->
32+ let rows = context.CreateClArray m.Rows
33+ let columns = context.CreateClArray m.Columns
34+ let values = context.CreateClArray m.Values
35+
36+ let result =
37+ { Backend.COOMatrix.Context = context
38+ RowCount = m.RowCount
39+ ColumnCount = m.ColumnCount
40+ Rows = rows
41+ Columns = columns
42+ Values = values }
43+
44+ Backend.MatrixCOO result
45+ | MatrixCSR m ->
46+ let rows = context.CreateClArray m.RowPointers
47+ let columns = context.CreateClArray m.ColumnIndices
48+ let values = context.CreateClArray m.Values
49+
50+ let result =
51+ { Backend.CSRMatrix.Context = context
52+ RowCount = m.RowCount
53+ ColumnCount = m.ColumnCount
54+ RowPointers = rows
55+ Columns = columns
56+ Values = values }
57+
58+ Backend.MatrixCSR result
59+
60+ static member FromBackend ( q : MailboxProcessor < _ >) matrix =
61+ match matrix with
62+ | Backend.MatrixCOO m ->
63+ let rows = Array.zeroCreate m.Rows.Length
64+ let columns = Array.zeroCreate m.Columns.Length
65+ let values = Array.zeroCreate m.Values.Length
66+
67+ let _ =
68+ q.Post( Msg.CreateToHostMsg( m.Rows, rows))
69+
70+ let _ =
71+ q.Post( Msg.CreateToHostMsg( m.Columns, columns))
72+
73+ let _ =
74+ q.PostAndReply( fun ch -> Msg.CreateToHostMsg( m.Values, values, ch))
75+
76+ let result =
77+ { RowCount = m.RowCount
78+ ColumnCount = m.ColumnCount
79+ Rows = rows
80+ Columns = columns
81+ Values = values }
82+
83+ MatrixCOO result
84+ | Backend.MatrixCSR m ->
85+ let rows = Array.zeroCreate m.RowPointers.Length
86+ let columns = Array.zeroCreate m.Columns.Length
87+ let values = Array.zeroCreate m.Values.Length
88+
89+ let _ =
90+ q.Post( Msg.CreateToHostMsg( m.RowPointers, rows))
91+
92+ let _ =
93+ q.Post( Msg.CreateToHostMsg( m.Columns, columns))
94+
95+ let _ =
96+ q.PostAndReply( fun ch -> Msg.CreateToHostMsg( m.Values, values, ch))
97+
98+ let result =
99+ { RowCount = m.RowCount
100+ ColumnCount = m.ColumnCount
101+ RowPointers = rows
102+ ColumnIndices = columns
103+ Values = values }
104+
105+ MatrixCSR result
106+
21107and CSRMatrix < 'a > =
22108 { RowCount: int
23109 ColumnCount: int
0 commit comments