Skip to content

Commit d28348d

Browse files
committed
Add storage for dense vector; extended api with unmasked methods
1 parent b29f5b2 commit d28348d

11 files changed

Lines changed: 196 additions & 94 deletions

File tree

src/GraphBLAS-sharp/AlgebraicStructures.fs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,21 @@ open Microsoft.FSharp.Quotations
44

55
type UnaryOp<'a, 'b> =
66
| UnaryOp of Expr<'a -> 'b>
7-
static member op_Implicit (UnaryOp source) = source
87

98
type BinaryOp<'a, 'b, 'c> =
109
| BinaryOp of Expr<'a -> 'b -> 'c>
11-
static member op_Implicit (BinaryOp source) = source
1210

13-
// делать отдельными классами или оставить аллиасами
1411
type ClosedUnaryOp<'a> =
1512
| ClosedUnaryOp of Expr<'a -> 'a>
16-
static member op_Implicit (UnaryOp source) = source
1713

1814
type ClosedBinaryOp<'a> =
1915
| ClosedBinaryOp of Expr<'a -> 'a -> 'a>
20-
static member op_Implicit (UnaryOp source) = source
2116

2217
// associative closed bin op (magma with associative)
2318
type ISemigroup<'a> =
2419
abstract Plus: ClosedBinaryOp<'a>
2520

26-
// semigroup with id
21+
/// Semigroup with identity
2722
type IMonoid<'a> =
2823
inherit ISemigroup<'a>
2924
abstract Zero: 'a

src/GraphBLAS-sharp/Algorithms/BFS.fs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,24 @@ open GraphBLAS.FSharp
66
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
77
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
88

9-
[<AutoOpen>]
109
module BFS =
11-
let levelBFS (matrix: Matrix<bool>) (source: int) : GraphblasEvaluation<Vector<int>> =
10+
let level (matrix: Matrix<bool>) (source: int) = graphblas {
1211
let vertexCount = Matrix.rowCount matrix
13-
let levels = Vector.ofArray <| (=) 0 <| Array.zeroCreate vertexCount
12+
let levels = Vector.zeroCreate vertexCount 0
1413
let frontier = Vector.ofList vertexCount [source, true]
1514

16-
graphblas {
17-
let mutable currentLevel = 1
18-
while currentLevel < vertexCount do
19-
let! frontierMask = Vector.mask frontier
20-
do! Vector.fillSubVector frontierMask (Scalar currentLevel) levels
21-
let! levelsComplemented = Vector.complemented levels
22-
let! frontier = Vector.vxm AnyAll.bool levelsComplemented frontier matrix
23-
currentLevel <- currentLevel + 1
24-
25-
return levels
26-
}
15+
let mutable currentLevel = 1
16+
while currentLevel < vertexCount do
17+
let! frontierMask = Vector.mask frontier
18+
do! levels |> Vector.fillSubVector frontierMask (Scalar currentLevel)
19+
20+
let! levelsComplemented = Vector.complemented levels
21+
let! frontier = (frontier, matrix) ||> Vector.vxmWithMask AnyAll.bool levelsComplemented
22+
23+
currentLevel <- currentLevel + 1
24+
25+
return levels
26+
}
2727

2828
// let parentBFS (matrix: Matrix<bool>) (source: int) : Vector<int> =
2929
// let vertexCount = matrix.RowCount

src/GraphBLAS-sharp/Algorithms/SSSP.fs

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace GraphBLAS.FSharp.Algorithms
2+
3+
open GraphBLAS.FSharp.Predefined
4+
open GraphBLAS.FSharp
5+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
6+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
7+
8+
module ShortestPath =
9+
let singleSource (matrix: Matrix<float>) (source: int) = graphblas {
10+
let vertexCount = Matrix.rowCount matrix
11+
let distance = Vector.ofList vertexCount [source, 0.]
12+
13+
for _ = 1 to vertexCount - 1 do
14+
let! step = (distance, matrix) ||> Vector.vxm MinAdd.float
15+
do! distance |> Vector.assignVector step
16+
17+
return distance
18+
}

src/GraphBLAS-sharp/Algorithms/TriangleCounting.fs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@ open GraphBLAS.FSharp
55
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
66
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
77

8-
[<AutoOpen>]
98
module TriangleCounting =
10-
let sandiaTriangleCount (lowerTriangular: Matrix<bool>) : GraphblasEvaluation<int> =
9+
let sandia (lowerTriangular: Matrix<bool>) = graphblas {
1110
let bool2int = function
1211
| true -> 1
1312
| false -> 0
1413

15-
graphblas {
16-
let! convertedMatrix = lowerTriangular |> Matrix.apply (UnaryOp <@ bool2int @>) None
17-
let! convertedTransposed = convertedMatrix |> Matrix.transpose
18-
let! lowerTriangularMask = lowerTriangular |> Matrix.mask
19-
let! result = Matrix.mxm AddMult.int lowerTriangularMask convertedMatrix convertedTransposed
20-
let! (Scalar count) = result |> Matrix.reduce Add.int
21-
return count
22-
}
14+
let! convertedMatrix = lowerTriangular |> Matrix.apply (UnaryOp <@ bool2int @>)
15+
let! convertedTransposed = convertedMatrix |> Matrix.transpose
16+
let! lowerTriangularMask = lowerTriangular |> Matrix.mask
17+
let! result = Matrix.mxmWithMask AddMult.int lowerTriangularMask convertedMatrix convertedTransposed
18+
let! (Scalar count) = result |> Matrix.reduce Add.int
19+
return count
20+
}

src/GraphBLAS-sharp/GraphBLAS-sharp.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<Compile Include="Predefined/Semirings/AddMult.fs" />
3030
<Compile Include="Predefined/Semirings/MinAdd.fs" />
3131
<Compile Include="Algorithms/BFS.fs" />
32-
<Compile Include="Algorithms/SSSP.fs" />
32+
<Compile Include="Algorithms/ShortestPath.fs" />
3333
<Compile Include="Algorithms/TriangleCounting.fs" />
3434
<Content Include="YC.OpenCL.NET.dll.config">
3535
<CopyToOutputDirectory>Always</CopyToOutputDirectory>

src/GraphBLAS-sharp/Methods/Matrix.fs

Lines changed: 97 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace GraphBLAS.FSharp
22

33
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
4-
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
54
open GraphBLAS.FSharp.Backend
65

76
type MatrixTuples<'a> =
@@ -56,50 +55,124 @@ module Matrix =
5655
let resize (rowCount: int) (columnCount: int) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
5756
let nnz (matrix: Matrix<'a>) : GraphblasEvaluation<int> = failwith "Not Implemented yet"
5857
let tuples (matrix: Matrix<'a>) : GraphblasEvaluation<MatrixTuples<'a>> = failwith "Not Implemented yet"
59-
let mask (matrix: Matrix<'a>) : GraphblasEvaluation<Mask2D option> = failwith "Not Implemented yet"
60-
let complemented (matrix: Matrix<'a>) : GraphblasEvaluation<Mask2D option> = failwith "Not Implemented yet"
58+
let mask (matrix: Matrix<'a>) : GraphblasEvaluation<Mask2D> = failwith "Not Implemented yet"
59+
let complemented (matrix: Matrix<'a>) : GraphblasEvaluation<Mask2D> = failwith "Not Implemented yet"
6160
let synchronize (matrix: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
6261

6362
(*
6463
assignment, extraction and filling
6564
*)
6665

67-
let extractSubMatrix (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
68-
let extractSubRow (rowIdx: int) (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
69-
let extractSubCol (colIdx: int) (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
70-
let extractElement (rowIdx: int) (colIdx: int) (matrix: Matrix<'a>) : GraphblasEvaluation<Scalar<'a>> = failwith "Not Implemented yet"
71-
let assignSubMatrix (mask: Mask2D option) (source: Matrix<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
72-
let assignSubRow (rowIdx: int) (mask: Mask2D option) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
73-
let assignSubCol (colIdx: int) (mask: Mask2D option) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
74-
let assignElement (rowIdx: int) (colIdx: int) (source: Scalar<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
75-
let fillSubMatrix (mask: Mask2D option) (filler: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
76-
let fillSubRow (rowIdx: int) (mask: Mask2D option) (filler: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
77-
let fillSubCol (colIdx: int) (mask: Mask2D option) (filler: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> = failwith "Not Implemented yet"
66+
/// mat.[mask]
67+
let extractSubMatrix (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> =
68+
failwith "Not Implemented yet"
69+
70+
/// mat.[rowIdx. *]
71+
let extractRow (rowIdx: int) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> =
72+
failwith "Not Implemented yet"
73+
74+
/// mat.[rowIdx, mask]
75+
let extractSubRow (rowIdx: int) (mask: Mask2D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> =
76+
failwith "Not Implemented yet"
77+
78+
/// mat.[*, colIdx]
79+
let extractCol (colIdx: int) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> =
80+
failwith "Not Implemented yet"
81+
82+
/// mat.[mask. colIdx]
83+
let extractSubCol (colIdx: int) (mask: Mask2D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> =
84+
failwith "Not Implemented yet"
85+
86+
/// mat.[rowIdx, colIdx]
87+
let extractValue (rowIdx: int) (colIdx: int) (matrix: Matrix<'a>) : GraphblasEvaluation<Scalar<'a>> =
88+
failwith "Not Implemented yet"
89+
90+
/// t <- s
91+
let assignMatrix (source: Matrix<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
92+
failwith "Not Implemented yet"
93+
94+
/// t.[mask] <- s
95+
let assignSubMatrix (mask: Mask2D) (source: Matrix<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
96+
failwith "Not Implemented yet"
97+
98+
/// t.[rowIdx, *] <- s
99+
let assignRow (rowIdx: int) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
100+
failwith "Not Implemented yet"
101+
102+
/// t.[rowIdx, mask] <- s
103+
let assignSubRow (rowIdx: int) (mask: Mask1D) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
104+
failwith "Not Implemented yet"
105+
106+
/// t.[*, colIdx] <- s
107+
let assignCol (colIdx: int) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
108+
failwith "Not Implemented yet"
109+
110+
/// t.[mask, colIdx] <- s
111+
let assignSubCol (colIdx: int) (mask: Mask1D) (source: Vector<'a>) (target: Matrix<'a>) : GraphblasEvaluation<unit> =
112+
failwith "Not Implemented yet"
113+
114+
/// mat.[i, j] <- value
115+
let assignValue (rowIdx: int) (colIdx: int) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
116+
failwith "Not Implemented yet"
117+
118+
/// mat.[*, *] <- value
119+
let fillMatrix (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
120+
failwith "Not Implemented yet"
121+
122+
/// mat.[mask] <- value
123+
let fillSubMatrix (mask: Mask2D) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
124+
failwith "Not Implemented yet"
125+
126+
/// mat.[rowIdx, *] <- value
127+
let fillRow (rowIdx: int) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
128+
failwith "Not Implemented yet"
129+
130+
/// mat.[rowIdx, mask] <- value
131+
let fillSubRow (rowIdx: int) (mask: Mask1D) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
132+
failwith "Not Implemented yet"
133+
134+
/// mat.[*, colIdx] <- value
135+
let fillCol (colIdx: int) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
136+
failwith "Not Implemented yet"
137+
138+
/// mat.[mask, colIdx] <- value
139+
let fillSubCol (colIdx: int) (mask: Mask1D) (value: Scalar<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<unit> =
140+
failwith "Not Implemented yet"
78141

79142
(*
80143
operations
81144
*)
82145

83-
let mxm (semiring: ISemiring<'a>) (mask: Mask2D option) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
84-
let mxv (semiring: ISemiring<'a>) (mask: Mask1D option) (matrix: Matrix<'a>) (vector: Vector<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
146+
let mxm (semiring: ISemiring<'a>) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
147+
let mxv (semiring: ISemiring<'a>) (matrix: Matrix<'a>) (vector: Vector<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
85148

86-
let eWiseAdd (semiring: ISemiring<'a>) (mask: Mask2D option) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> =
149+
let eWiseAdd (semiring: ISemiring<'a>) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> =
87150
let operationResult =
88151
match leftMatrix, rightMatrix with
89152
| MatrixCOO left, MatrixCOO right ->
90153
opencl {
91-
let! result = COOMatrix.EWiseAdd.run left right mask semiring
154+
let! result = COOMatrix.EWiseAdd.run left right None semiring
92155
return MatrixCOO result
93156
}
94157
| _ -> failwith "Not Implemented"
95158

96159
graphblas { return! EvalGB.fromCl operationResult }
97160

98-
let eWiseMult (semiring: ISemiring<'a>) (mask: Mask2D option) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
99-
let apply (mapper: UnaryOp<'a, 'b>) (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'b>> = failwith "Not Implemented yet"
100-
let prune (predicate: UnaryOp<'a, bool>) (mask: Mask2D option) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
101-
let reduceRows (monoid: IMonoid<'a>) (mask: Mask1D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
102-
let reduceCols (monoid: IMonoid<'a>) (mask: Mask1D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
161+
let eWiseMult (semiring: ISemiring<'a>) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
162+
let apply (mapper: UnaryOp<'a, 'b>) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'b>> = failwith "Not Implemented yet"
163+
let prune (predicate: UnaryOp<'a, bool>) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
164+
let reduceRows (monoid: IMonoid<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
165+
let reduceCols (monoid: IMonoid<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
103166
let reduce (monoid: IMonoid<'a>) (matrix: Matrix<'a>) : GraphblasEvaluation<Scalar<'a>> = failwith "Not Implemented yet"
104167
let transpose (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'b>> = failwith "Not Implemented yet"
105-
let kronecker (semiring: ISemiring<'a>) (mask: Mask2D option) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
168+
let kronecker (semiring: ISemiring<'a>) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
169+
170+
let mxmWithMask (semiring: ISemiring<'a>) (mask: Mask2D) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
171+
let mxvWithMask (semiring: ISemiring<'a>) (mask: Mask1D) (matrix: Matrix<'a>) (vector: Vector<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
172+
let eWiseAddWithMask (semiring: ISemiring<'a>) (mask: Mask2D) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
173+
let eWiseMultWithMask (semiring: ISemiring<'a>) (mask: Mask2D) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
174+
let applyWithMask (mapper: UnaryOp<'a, 'b>) (mask: Mask2D) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'b>> = failwith "Not Implemented yet"
175+
let pruneWithMask (predicate: UnaryOp<'a, bool>) (mask: Mask2D) (matrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"
176+
let reduceRowsWithMask (monoid: IMonoid<'a>) (mask: Mask1D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
177+
let reduceColsWithMask (monoid: IMonoid<'a>) (mask: Mask1D) (matrix: Matrix<'a>) : GraphblasEvaluation<Vector<'a>> = failwith "Not Implemented yet"
178+
let kroneckerWithMask (semiring: ISemiring<'a>) (mask: Mask2D) (leftMatrix: Matrix<'a>) (rightMatrix: Matrix<'a>) : GraphblasEvaluation<Matrix<'a>> = failwith "Not Implemented yet"

0 commit comments

Comments
 (0)