Matrix multiplication and triangle counting#7
Conversation
QuadTree/LinearAlgebra.fs
Outdated
| (Matrix.mkNode tree (Matrix.qtree.Leaf Dummy) (Matrix.qtree.Leaf Dummy) (Matrix.qtree.Leaf Dummy)) | ||
| (expandRatio / 2UL) | ||
|
|
||
| let mxm op_add op_mult (m1: Matrix.SparseMatrix<'a>) (m2: Matrix.SparseMatrix<'a>) = |
QuadTree/LinearAlgebra.fs
Outdated
| else | ||
| (Error.InconsistentSizeOfArguments(vector, matrix)) |> Result.Failure | ||
|
|
||
| let rec shrink tree (size: uint64<storageSize>) = |
There was a problem hiding this comment.
Правда ли эти функции должны быть на верхнем уровне?
| // DDDD | ||
| let tree = | ||
| qtree.Node( | ||
| qtree.Leaf << UserValue <| Some 2, |
There was a problem hiding this comment.
А может сделать для таких вещей вспомогательные функции?
Типа
leaf_v v = qtree.Leaf << UserValue <| Some v
leaf_n = qtree.Leaf << UserValue <| None
и т.д.
QuadTree/LinearAlgebra.fs
Outdated
| let halfSize = size / 2UL | ||
|
|
||
| // Double check this code | ||
| let nw1xnw2, ne1xsw2, nw1xne2, ne1xse2, sw1xnw2, se1xsw2, sw1xne2, se1xse2 = |
QuadTree/LinearAlgebra.fs
Outdated
| (multiply halfSize se1 se2) | ||
|
|
||
| match nw1xnw2, ne1xsw2, nw1xne2, ne1xse2, sw1xnw2, se1xsw2, sw1xne2, se1xse2 with | ||
| | Result.Success(tnw1xnw2, nvals_nw1xnw2), |
|
|
||
| match m1, m2 with | ||
| | Matrix.qtree.Leaf(UserValue v1), Matrix.qtree.Leaf(UserValue v2) -> | ||
| let res = multScalar op_add (uint64 size) (op_mult v1 v2) |
There was a problem hiding this comment.
Чот меня тип size смущает. Если я правильно понимаю, то тут он уже uint64. Тогда каст не нужен. Хотя я и не уверен, что это хорошая затея. Я бы предпочёл до последнего тянуть типизированный uint, и только в самом конце конвертировать к другим единицам. Больше кода, но и больше контроля со стороны компилятора.
QuadTree/LinearAlgebra.fs
Outdated
| let m1_tree, m2_tree = | ||
| if m1.storage.size < m2.storage.size then | ||
| expand (m1.storage.data) (m2.storage.size / (uint64 m1.storage.size)), m2.storage.data | ||
| else if m1.storage.size > m2.storage.size then |
| ) | ||
| Matrix.qtree.Node(leaf_n (), leaf_v 1, leaf_v 3, leaf_v 2), | ||
| Matrix.qtree.Node(leaf_v 1, leaf_n (), leaf_v 2, leaf_v 3), | ||
| Matrix.qtree.Node(leaf_n (), leaf_n (), Matrix.qtree.Leaf(Dummy), Matrix.qtree.Leaf(Dummy)), |
|
|
||
| [<Fact>] | ||
| let ``7V Triangle count`` () = | ||
| // Lower triangle |
There was a problem hiding this comment.
То есть Вы считаете, что в функцию подсчёта треугольиков сразу подаётся треугольная матрица?
There was a problem hiding this comment.
В коде самой функции, вроде, есть получение треугольника. Может тогда тут всё же полноценная матрица смежности графа пусть будет?
There was a problem hiding this comment.
Писать долго руками, и не понятно что это дает
There was a problem hiding this comment.
Даёт отсутствие ложных ожиданий от функции. Тесты - тоже документация. Можно, например, граф попроще взять.
QuadTree/Matrix.fs
Outdated
| Leaf (s, op v1) | ||
| | Node (s,x1,x2,x3,x4) -> | ||
| mkNode s (map op x1) (map op x2) (map op x3) (map op x4) | ||
| for _ in 1UL .. area do |
There was a problem hiding this comment.
Не очень нравится такой код. В сети хорошо транслируется и параллелится код в духе рекурсивного "разделяй и властвуй". А с такимим циклами не понятно, что делать.
QuadTree/Matrix.fs
Outdated
| else | ||
| (Error.InconsistentSizeOfArguments(matrix1, matrix2)) |> Result.Failure | ||
|
|
||
| let fold (folder: 'State option -> 'T option -> 'State option) (state: 'State option) (matrix: SparseMatrix<'T>) = |
There was a problem hiding this comment.
Надо не забыть потом написать что-то в духе fold_values, чтобы пустые куски не обходить. Вообще, надо потом подумать, как такое глобально дизайнить. Может и для map должна быть пара, которая только значеня обходит.
| Assert.Equal(expected, actual) | ||
|
|
||
| [<Fact>] | ||
| let ``4x4 lower triangle`` () = |
There was a problem hiding this comment.
А для нечётного размера? А для каких-нибудь "пустых" блоков со странной структурой?
|
|
||
| Assert.Equal(expected.storage.data, actual.storage.data) | ||
|
|
||
| [<Fact>] |
QuadTree/TriangleCount.fs
Outdated
| // Assume non-oriented graph adjacency matrix | ||
| // Some () -> edge, None -> no edge | ||
| // Computes triangle count | ||
| let triangle_count (graph: Matrix.SparseMatrix<unit>) = |
There was a problem hiding this comment.
Почему unit? Вам же всё равно, что там на рёбрах.
QuadTree/TriangleCount.fs
Outdated
|
|
||
| let op_mult o1 o2 = | ||
| match o1, o2 with | ||
| | Some(), Some() -> Some 1UL |
There was a problem hiding this comment.
Во. Вам точно всё равно, что на рёбрах.
| else | ||
| (Error.InconsistentSizeOfArguments(matrix1, matrix2)) |> Result.Failure | ||
|
|
||
| let foldAssociative (folder: 'T option -> 'T option -> 'T option) (state: 'T option) (matrix: SparseMatrix<'T>) = |
There was a problem hiding this comment.
Получился в тоге reduce. Давайте так и назовём. А над тем, как fold нормальный делать, я ещё подумаю.
No description provided.