Skip to content

feat: add AVLSet implementation, unit tests and benchmarks#17

Open
LeoN192 wants to merge 6 commits into
Lamagraph:mainfrom
LeoN192:avlset
Open

feat: add AVLSet implementation, unit tests and benchmarks#17
LeoN192 wants to merge 6 commits into
Lamagraph:mainfrom
LeoN192:avlset

Conversation

@LeoN192
Copy link
Copy Markdown

@LeoN192 LeoN192 commented May 8, 2026

No description provided.

Copy link
Copy Markdown
Member

@gsvgit gsvgit left a comment

Choose a reason for hiding this comment

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

Лучше явно разделить дерево и множество.

Comment thread QuadTree.Benchmark/AVLSet.fs
Comment thread QuadTree.Tests/QuadTree.Tests.fsproj
Comment thread QuadTree/AVLSet.fs Outdated

let value n =
match n with
| Empty -> failwith "Empty node has no value"
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.

Посмотрите внимательнее. Мы стараемся не использовать failwith. Пользуемся result вместо этого.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

А имеет ли смысл Result, если скрыть от пользователя модули Tree и Node? Для пользователя есть только модуль AVLSet, который гарантирует, что эти ошибки в принципе недостижимы (по аксиомам АВЛ-дерева) при вызове функций, иначе ошибка в логике. Все-таки у меня задача написать множество на основе дерева, а не само дерево.

Comment thread QuadTree/AVLSet.fs Outdated
balance ln rnNew v
| _ ->
match right with
| Empty -> failwith "Unreacheable message 2"
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.

Не очень информативное сообщение.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Изменил их все на более информативные, но также оставил предложение, что эти сообщения в принципе не должны быть достижимы.

Comment thread QuadTree/AVLSet.fs Outdated
let mutable leftUnion = Empty
let mutable rightUnion = Empty

Parallel.Invoke(
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.

Уверены, что через таски - лучший вариант?

Ну и в целом, посмотрите, как пространства имён в .net устроены. Например, на array.parallel

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Переделал все на async. Разделил пространства

@gsvgit
Copy link
Copy Markdown
Member

gsvgit commented May 10, 2026

Да. Внятное описание к реквесту тоже не будет лишним.

@LeoN192
Copy link
Copy Markdown
Author

LeoN192 commented May 15, 2026

  • Теперь модули Tree и Node internal, а AVLSet public.
  • Удалил атрибут HardwareCounters.
  • Вынес в отдельное пространство и модуль параллельные операции (QuadTree.AVLSet.Parallel и ParallelAVLSet), а операции путем обхода дерева в отдельный подмодуль (Traversal).
  • Часть Unit-тестов превращена в Property-тесты (1 тест удален).
  • Сообщение в failwith сделал более информативными.
  • Теперь параллельные операции выполняются через Async, а не таски.

Copy link
Copy Markdown
Member

@gsvgit gsvgit left a comment

Choose a reason for hiding this comment

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

У Вас конфликты. И не надо липить сопоставление с образцом везде.

Comment thread QuadTree/AVLSet.fs Outdated

let value n =
match n with
| Empty -> failwith "Empty node has no value. This error should be unreachable"
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.

Посмотрите на другой код в библиотеке. Мы не используем Failwith (стараемся, по крайней мере). Вместо этого --- Result

Comment thread QuadTree/AVLSet.fs Outdated
match n with
| Empty -> Node(0, value, Empty, Empty)
| Node(h, v, ln, rn) ->
match value with
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.

Мне кажется, или это if?


module ParallelAVLSet =
let rec unionAsync threads set1 set2 =
async {
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.

А async точно быстрее? Почему его выбрали?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Нет, он не быстрее тасков, если говорить о работе с деревьями. Но он подходит больше для ФП стиля (без mutable), чем таски. Плюс у Async холодный старт. Поэтому и изменил

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.

Видимо, вопрос в том, зачем именно Вы делали параллельную версию.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Сравнить производмтельность операций с разными реализациями. Параллельные гораздо быстрее

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.

Было бы здорово добавить описание бенчмарок (примерно, как тут сделано). Ну и ссылку в основное ребми тоже. А в Вашем случае ещё и результаты замеров хотя бы в описании реквеста сделать.

@LeoN192
Copy link
Copy Markdown
Author

LeoN192 commented May 16, 2026

  • Теперь все модули публичные
  • Тип AVLTree теперь называется AVLSet
  • Удален модуль Node и все его функции-геттеры (кроме геттера высоты, он теперь в модуле Tree)
  • Функции вращения переделаны (теперь через паттерн-матчинг)
  • Удалены ненужные паттер-матчинги
  • Вместо failwith invalidArg (операции должны выбросить исключение, если пользователь передал бред)
  • minNode теперь возвращает Option<AVLSet<'A>, 'A>

@LeoN192
Copy link
Copy Markdown
Author

LeoN192 commented May 16, 2026

Насчет Result: Я не совсем понимаю необходимость в нем. Стандартные библиотеки в F# также выбрасывают исключение в случае передачи невалидных аргументов. А если я перепишу все на Result, то у меня буквально весь код и все операции превратятся в нагромождение Ok и Error, даже функция add будет это возвращать, хотя это не очень удбно для конвейера

@gsvgit
Copy link
Copy Markdown
Member

gsvgit commented May 18, 2026

Насчет Result: Я не совсем понимаю необходимость в нем. Стандартные библиотеки в F# также выбрасывают исключение в случае передачи невалидных аргументов. А если я перепишу все на Result, то у меня буквально весь код и все операции превратятся в нагромождение Ok и Error, даже функция add будет это возвращать, хотя это не очень удбно для конвейера

Необходимость в том, что это прототип и будет переписываться на языки, где исключений нет. А чтобы не было чуть проще жить, в основной ветке уже даже есть workflow соответствующий. Можете изучить, ребейзнуться и пользоваться.

LeoN192 added 5 commits May 19, 2026 22:48
- Encapsulate implementation by marking Node and Tree as internal.
- Keep AVLSet module public as the primary API.
- Implement InternalsVisibleTo to allow testing of internal structures.
- Move parallel operations to a dedicated sub-module for better SoC.
- Add FsCheck property-based tests for core set operations.
- Fix and stabilize benchmarks.
…n matching, open modules, clean up redundant pattern matchings and replace them with if-else
@LeoN192
Copy link
Copy Markdown
Author

LeoN192 commented May 19, 2026

Удалил все исключения и заменил все на Result<AVLSet<'A>,AVLSetError>. Ну, и, соответственно, бенчмарки с тестами тоже
И ребейзнулся я тоже вроде как

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.

2 participants