Skip to content

add slice in Vector.fs and Matrix.fs, add reduceRows and reduceCols in Matrix.fs, add tests - #18

Merged
gsvgit merged 22 commits into
Lamagraph:mainfrom
Brulevich-Nikita:brulevich-n-work
Sep 25, 2026
Merged

gsvgit merged 22 commits into
Lamagraph:mainfrom
Brulevich-Nikita:brulevich-n-work

Conversation

@Brulevich-Nikita

Copy link
Copy Markdown
Contributor

add:
slice in Vector.fs
slice in Matrix.fs
reduceRows in Matrix.fs
reduceCols in Matrix.fs
map in Matrix.fs
(mapi in Matrix.fs and Vector.fs have been already released)
4 map tests in Vector.fs
3 fromCoordinateList tests in Vector.fs
4 mapi tests in Vector.fs
11 slice tests in Vector.fs
6 map tests in Matrix.fs
3 fromCoordinateList tests in Matrix.fs
5 mapi tests in Matrix.fs
21 slice tests in Matrix.fs
7 reduceRows tests in Matrix.fs
7 reduceCols tests in Matrix.fs

to be done:
kronecker with tests

Comment thread QuadTree.Tests/Tests.Matrix.fs
Comment thread QuadTree.Tests/Tests.Matrix.fs
Comment thread QuadTree.Tests/Tests.Vector.fs
Comment thread QuadTree/Matrix.fs Outdated
Comment thread QuadTree/Matrix.fs Outdated
Comment thread QuadTree/Matrix.fs Outdated
Comment thread QuadTree/Vector.fs Outdated
Comment thread QuadTree/Matrix.fs Outdated
Comment thread QuadTree/Matrix.fs Outdated
@Brulevich-Nikita

Copy link
Copy Markdown
Contributor Author

@gsvgit , здравствуйте! Изменение получилось большим, поэтому опишу по пунктам основные изменения, чтобы проще было понимать:

  1. поправил небольшие недочёты

  2. fold и правда общего вида, я вынес его в отдельную функцию и переписал с её использованием reduceRows, reduceCols и Kronecker

  3. Вы спрашивали про принцип работы Кронекера (извините, что сразу не увидел Ваше сообщение). Если кратко, то:

    1. создаётся пустое хранилище нужного размера для итоговой матрицы
    2. инициализируется функция insert для вставки значения
    3. foldMatrixB обходит всё дерево B, применяя для каждого элемента f, вычисляя результат Some computedVal, высчитывает новые координаты элемента и вставляет в итоговое дерево (acc) через insert
    4. основной проход по A при помощи foldQuadtree (вынес его в отдельную внешнюю функцию по Вашей рекомендации), для каждого элемента из A вызывает foldMatrixB, передавая текущее итоговое дерево, координаты и значение A
    5. Подсчитывает nvals и в случае успеха создаёт SparseMatrix
      Данный способ показался мне наиболее приемлемым (пытался сделать чуть проще - не получалось).
  4. Обернул fromCoordinateList в Option (Result Error / Ok) для матрицы и вектора, из-за этого пришлось переделывать все места во всех файлах QTreeFSharp'а, где использовался fromCoordinateList. Во многих местах из-за этого теряется читаемость и внешний вид, но таким образом валидация данных происходит сразу на уровне координатного списка и избегаются failwith'ы. Подскажите пожалуйста, есть ли у Вас замечания по данному решению?

  5. Исправил свои и чужие failwith'ы, а так же два моих ThrowException, теперь вместо них Result

  6. В данном пункте я могу ошибаться, но хотел бы его с Вами обсудить. Когда я поменял сигнатуру fromCoordinateList'а, пришлось менять все тесты, но изменения, само собой, чисто под сигнатуру, без изменения данных. При запуске все тесты прошли, кроме тестов Борувки. Я посидел с Борувкой и заметил несколько вещей:

    1. Тесты, если я не ошибаюсь, вообще проходят мимо, так как в исходном checkResult функция принимает три аргумента "let checkResult name actual expected =", а в каждом тесте два аргумента "checkResult (Graph.Boruvka.mst graph) expected".
    2. Когда я это поправил, некоторые тесты продолжили падать из-за своей невалидности. Посмотрите, пожалуйста, как минимум на тест Boruvka MST 10 nodes random.. actual там равно expected на графе с 13 рёбрами и 10 вершинами (что невозможно для Борувки), так к тому же expected содержит явный цикл (0 - 1 - 5 - 6), а изначальный тест горит зелёным.
    3. Даже несмотря на пропуск тестов, реализация была не до конца корректной из-за симметричного дублирования рёбер, поэтому я внёс небольшие изменения с каноническим представлением ребра, чтобы алгоритм работал корректно, оставил //комментарии по аналогии с теми, что были.
      Я не до конца могу быть уверен в том, что верно всё понял про Борувку, поэтому, возможно, залез куда не требовалось, но всё же хочу попросить вас посмотреть и проверить, насколько верны мои изменения (как минимум очень смущает случай с якобы проходящим тестом, где в expected циклический граф, когда Борувка должна строить минимальное остовное дерево, что друг другу противоречит), и если был не прав, то откачу изменения назад

Если изменения верные, то начну с замерами.

Comment thread QuadTree.Benchmark/BFS.fs Outdated
Comment thread QuadTree.Benchmark/SSSP.fs
Comment thread QuadTree.Tests/Tests.LinearAlgebra.fs Outdated
Comment thread QuadTree.Tests/Tests.SSSP.fs Outdated

@Danil-Zaripov Danil-Zaripov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very well done👍

Comment thread QuadTree.Benchmark/MatrixSlice.fs Outdated
Comment thread QuadTree.Benchmark/Reduce.fs Outdated

@Danil-Zaripov Danil-Zaripov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's resolve these comments and this PR will be good to go

Comment thread QuadTree.Benchmark/ReduceComparison.fs
Comment thread QuadTree.Benchmark/ReduceComparison.fs Outdated
Comment thread QuadTree.Benchmark/ReduceComparison.fs Outdated
@gsvgit

gsvgit commented Sep 25, 2026

Copy link
Copy Markdown
Member

@Brulevich-Nikita , порешайте проблемы, чтобы вмёржить можно было. Судя по всему, есть неподписанные коммиты. Возможно ещё что-то.

Commits must have verified signatures.
Cannot change this locked branch

@Brulevich-Nikita

Copy link
Copy Markdown
Contributor Author

@Brulevich-Nikita , порешайте проблемы, чтобы вмёржить можно было. Судя по всему, есть неподписанные коммиты. Возможно ещё что-то.

Commits must have verified signatures.
Cannot change this locked branch

Подписал коммиты. Никогда раньше не делал этого, надеюсь всё получилось правильно

@gsvgit
gsvgit merged commit eeca0f2 into Lamagraph:main Sep 25, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants