NetAnalisys — это терминальное приложение для загрузки графовых датасетов, вычисления метрик графа и анализа приближенного поведения кратчайших путей с помощью landmark-методов.
Проект написан на Rust и сейчас работает как интерактивная TUI-утилита: пользователь запускает программу, выбирает файл графа во встроенном меню, затем выбирает метод оценки диаметра и после этого просматривает вычисленные метрики и созданные артефакты.
- Что делает проект
- Текущие возможности
- Требования
- Установка и запуск
- Как пользоваться программой
- Поддерживаемые форматы графов
- Как устроен анализ
- Интерактивный режим landmarks
- Выходные файлы
- Структура проекта
- Проверки качества и разработка
- Ограничения и известные проблемы
- Направления улучшения
Приложение загружает граф из файла и вычисляет набор структурных метрик сети:
- тип графа
- число вершин и ребер
- плотность
- компоненты слабой связности
- компоненты сильной связности для ориентированных графов
- долю вершин в крупнейшей компоненте
- распределение степеней
- приближенные оценки диаметра
- число треугольников
- коэффициенты кластеризации
- устойчивость при случайном удалении вершин и удалении вершин-хабов
После основного анализа программа также может открыть интерактивный режим для landmark-оценки расстояний и простого accuracy-бенчмарка относительно точного BFS.
Текущая реализация уже поддерживает:
- загрузку графов из
txt,csvиmtx - обработку ориентированных и неориентированных графов
- переназначение внешних ID вершин во внутренние компактные ID
- построение графиков распределения степеней в терминале и в PNG
- поиск компонент слабой связности
- поиск SCC через алгоритм Тарьяна для ориентированных графов
- подсчет треугольников
- вычисление среднего и глобального коэффициентов кластеризации
- несколько стратегий приближенного вычисления диаметра
- анализ устойчивости к удалению вершин
- интерактивные запросы расстояний через landmarks
- accuracy-бенчмарк для landmark-оценок
Что реализовано только частично:
- пункт меню
speed_benchmarkв landmark-режиме пока является заглушкой - автоматизация качества существует только как ручные команды, без CI
- тестовое покрытие по сути отсутствует
Для запуска проекта нужны:
- стабильный toolchain Rust
cargo- терминал с поддержкой интерактивного ввода через
crossterm
Рекомендуемая проверка:
rustc --version
cargo --versionКлонируйте репозиторий и запустите приложение из корня проекта:
cargo runПрограмма откроет интерактивное текстовое меню.
Если в репозитории уже есть примерные графы в каталоге graphs/, их можно использовать сразу. В текущем репозитории есть, например:
graphs/Directed/web-Google.txtgraphs/Directed/Wiki-Vote.txtgraphs/Directed/soc-wiki-Vote.mtxgraphs/Undirected/musae_git_edges.csvgraphs/Very Big Graphs/vk.csv
- Запустите программу командой
cargo run. - В стартовом меню выберите
Load graph from file. - В файловом меню выберите датасет из репозитория.
- Выберите метод вычисления диаметра:
Double BFSRandom 500 BFSSnowball samplingAll methods simultaneously
- Дождитесь завершения парсинга и анализа.
- Просмотрите построенные графики в терминале и PNG-файлы.
- В меню после анализа выберите один из вариантов:
View analysis resultsInteractive landmark distance estimationExit
Большинство меню поддерживает:
- стрелки
Up/Downдля навигации Enterдля выбораqилиEscдля выхода/возврата- прямой числовой выбор в некоторых меню
После загрузки графа программа:
- Парсит выбранный файл.
- Строит представление графа в памяти с внутренними компактными ID.
- Вычисляет ряд метрик параллельно там, где это реализовано.
- Печатает графики распределения степеней в терминале.
- Сохраняет PNG-графики на диск.
- Записывает замеры производительности в лог-файлы.
- Открывает меню результатов для дальнейшей работы.
Парсер сейчас поддерживает три расширения файлов:
.txt.csv.mtx
Ожидаемый формат:
u v
v w
x y
Поведение:
- поля разделяются ASCII-пробелами
- строки, начинающиеся с
#, игнорируются - пустые строки игнорируются
Ожидаемый формат:
u,v
v,w
x,y
Поведение:
- поля разделяются запятой
- пробелы по краям полей обрезаются
- строки, начинающиеся с
#, игнорируются - пустые строки игнорируются
Формат интерпретируется как пары ребер после заголовка:
%%MatrixMarket matrix coordinate pattern symmetric
% comment
5 5 4
1 2
2 3
3 4
4 5
Поведение:
- строки, начинающиеся с
%, игнорируются - дополнительно пропускается первая непустая строка после комментариев как строка размерности/заголовка
- остальные строки парсятся как пары вершин, разделенные пробелами
Это важный момент: программа сейчас не определяет направленность графа по содержимому файла.
Вместо этого она смотрит на имя родительской папки выбранного файла:
- если родительская папка называется
Directed, граф считается ориентированным - если родительская папка называется
Undirected, граф считается неориентированным - во всех остальных случаях граф по умолчанию считается неориентированным
Примеры:
graphs/Directed/web-Google.txt-> ориентированный графgraphs/Undirected/CA-GrQc.txt-> неориентированный граф- любой файл вне этих названий папок -> по умолчанию неориентированный
Основная структура графа хранит:
- списки смежности по внутренним ID вершин
- отображение внешних ID датасета во внутренние ID
- обратное отображение внутренних ID в исходные ID
- флаг типа графа
Это позволяет программе работать с произвольными ID вершин из датасета и при этом использовать компактное внутреннее представление для обходов.
Программа всегда вычисляет:
- тип графа
- число вершин
- число ребер
- плотность
Для неориентированных графов плотность вычисляется как:
2E / (V * (V - 1))
Для ориентированных графов:
E / (V * (V - 1))
В анализ входят:
- компоненты слабой связности
- число компонент слабой связности
- доля вершин в крупнейшей слабой компоненте
Для ориентированных графов дополнительно вычисляются:
- компоненты сильной связности через алгоритм Тарьяна
- число компонент сильной связности
- доля вершин в крупнейшей сильной компоненте
Приложение вычисляет:
- степень каждой вершины
- минимальную степень
- максимальную степень
- среднюю степень
- вероятностное распределение степеней
- логарифмическое преобразование распределения степеней
Создаются два визуальных результата:
- обычный график распределения степеней
- log-log график распределения степеней
Доступны следующие стратегии:
Double BFS- выбирается стартовая вершина
- ищется максимально удаленная достижимая вершина
- затем выполняется второй BFS из этой вершины
- максимальное найденное расстояние используется как оценка
Random 500 BFS- многократно выбираются случайные стартовые вершины
- из каждой запускается BFS
- сохраняется максимальное найденное расстояние
Snowball sampling- строится BFS-подобная выборка части графа
- диаметр оценивается на этой выборке
All methods simultaneously- запускаются все методы и выводятся все результаты
Текущая реализация ориентирована на практические приближения, а не на точное вычисление диаметра через полный all-pairs подход.
Программа вычисляет 90 percentile of distance of the graph, то есть практическую сводную характеристику наблюдаемых расстояний в графе.
В анализ входят:
- общее число треугольников
- средний коэффициент кластеризации графа
- глобальный коэффициент кластеризации
- средний коэффициент кластеризации крупнейшей слабой компоненты
Измеряются два сценария устойчивости:
- случайное удаление
5%..100%вершин - удаление вершин наибольшей степени с шагом
5%
Для каждого шага программа выводит долю активных вершин, которая остается в крупнейшей слабой компоненте.
После завершения основного анализа выберите:
Interactive landmark distance estimation
Это открывает отдельный TUI-режим для приближенных запросов кратчайших путей.
Query distance between two verticesAccuracy benchmark (vs exact BFS)Speed benchmark (landmarks only)Change number of landmarksChange strategy of landmarks samplesBack to main menu
Сейчас поддерживаются:
RandomHighest degreeFarthest-first coverage
Пользователь вводит два ID вершин в том виде, в котором они были в исходном датасете.
После этого программа показывает:
- точное расстояние через BFS
- оценку
Basic LM - оценку
BFS LM - время работы каждого метода
Если вершина отсутствует в графе, интерфейс выводит предупреждение.
Бенчмарк:
- выбирает заданное пользователем число случайных пар вершин
- считает точный BFS и обе landmark-оценки
- сравнивает число точных совпадений и среднюю/максимальную ошибку
- показывает среднее время работы точного BFS и обоих landmark-подходов
Текущее состояние:
- пункт меню существует
- реализация не завершена
- функция пока выводит сообщение-заглушку и завершает работу
Это следует считать незавершенной функциональностью.
После анализа программа может создать в корне проекта следующие файлы:
degree_data1.png- PNG-график распределения степеней
log_degree_data.png- PNG-график логарифмированного распределения степеней
performance.log- лог длительности основных этапов анализа
trace.log- лог стартов ключевых этапов пайплайна
Эти файлы перезаписываются или дополняются в зависимости от конкретного типа выходного файла и текущей логики кода.
Текущая структура исходников:
src/
analysis/
graph/
interactive_landmarks/
landmarks/
parser/
ui/
main.rs
Содержит реализации метрик графа:
- связность
- степени
- диаметр
- устойчивость
- подсчет треугольников
- оценка кластеризации
Содержит структуру графа и вспомогательные функции обхода, такие как BFS/DFS и связанные утилиты.
Содержит:
- обработку типа файла
- enum для directed/undirected
- логику парсинга файлов
Содержит основной terminal UI:
- стартовое меню
- файловый выбор
- выбор метода диаметра
- меню результатов
- анимацию загрузки
- функции для отображения и сохранения графиков распределения степеней
Содержит TUI-сценарий для интерактивного исследования landmark-оценок расстояний и бенчмарков.
Содержит два текущих landmark-подхода:
LandmarkBasicLandmarkBFS
Полезные команды:
cargo build
cargo run
cargo test
cargo fmt
cargo clippy --all-targets --all-featuresНа момент подготовки этого README:
cargo testзавершается успешно- в проекте сейчас
0тестов cargo clippy --all-targets --all-features -- -D warningsпока не проходит
Это означает, что проект запускается, но инженерные quality gate'ы пока не доведены до нормального состояния.
Текущие ограничения проекта:
- нет автоматического тестового покрытия публичного поведения
clippy -D warningsсейчас падает- во многих runtime-сценариях используются
unwrap/expect - парсинг достаточно мягкий и может молча пропускать некорректные строки
- тип графа определяется по имени родительской папки, а не по содержимому файла или явному CLI-параметру
speed_benchmarkв landmark-режиме не реализован- основной бинарник смешивает UI, orchestration, logging и вычисления в одном потоке
- проект сейчас работает как бинарное приложение, а не как переиспользуемая библиотека
Возможные практические последствия:
- неожиданная ошибка терминала или входных данных может привести к panic
- рефакторинг рискован, потому что нет regression-test сетки
- часть поведения на поврежденных датасетах недостаточно прозрачно видна пользователю
Наиболее важные следующие шаги:
- Добавить автотесты для parser, graph structure, connectivity, diameter и triangle counting.
- Довести
cargo clippy --all-targets --all-features -- -D warningsдо зеленого состояния. - Заменить
unwrap/expectв критичных runtime-путях на нормальную обработку ошибок. - Разбить крупные UI и orchestration-модули на более мелкие и сфокусированные.
- Выделить движок анализа в библиотечный crate помимо TUI-бинарника.
- Сделать тип графа явным параметром, а не зависимостью от имени папки.
- Нормально реализовать отсутствующий landmark speed benchmark.
Этот README специально описывает проект таким, какой он есть сейчас, включая незавершенные части и текущий технический долг. Его нужно воспринимать как точную эксплуатационную документацию по текущему состоянию репозитория, а не как описание идеальной будущей версии.