Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
dd61e63
add example
PushinMax Feb 19, 2025
029e4cf
Added algo
kohlrabka Feb 19, 2025
04af3e3
Add: main test
slivanovich Feb 19, 2025
80918c9
Add: memory benchmarking
slivanovich Feb 19, 2025
eaac40b
Fix: style
slivanovich Feb 19, 2025
bc36aa2
Delete: delete redefinition
slivanovich Feb 19, 2025
00da523
Merge branch 'dev-readme' into dev-bfs-with-zero-edges
slivanovich Feb 19, 2025
dc217b3
Why is it failing on ci.cd?
slivanovich Feb 19, 2025
65e94fe
Fix: tests?
slivanovich Feb 19, 2025
b36c6e4
))
slivanovich Feb 19, 2025
12b2c95
No linux for me ))
slivanovich Feb 19, 2025
7d01838
Last try
slivanovich Feb 19, 2025
f6a8eeb
Last try ))
slivanovich Feb 19, 2025
7035d0a
...
slivanovich Feb 19, 2025
47517a6
Fix ci
kohlrabka Feb 20, 2025
112c1cb
fix
kohlrabka Feb 20, 2025
70f4494
Fix
kohlrabka Feb 20, 2025
cd27615
Fix
kohlrabka Feb 20, 2025
994fb2c
Fix
kohlrabka Feb 20, 2025
f709a78
Fix
kohlrabka Feb 20, 2025
67f8d4f
Fix
kohlrabka Feb 20, 2025
4ba07fd
Fix
kohlrabka Feb 20, 2025
fc5d57b
Fix
kohlrabka Feb 20, 2025
6e3f212
Fix
kohlrabka Feb 20, 2025
d5039f1
Fix
kohlrabka Feb 20, 2025
a9b735a
Fix
kohlrabka Feb 20, 2025
b36629d
Fix
kohlrabka Feb 20, 2025
e43d389
New day new life
slivanovich Feb 26, 2025
e335274
Based
slivanovich Feb 26, 2025
1cf1af2
HSE corporation moment
slivanovich Feb 26, 2025
9e0387d
Some minor fixes in examples
slivanovich Feb 26, 2025
f520f79
Fix: typedefs
slivanovich Feb 26, 2025
4133a38
Add: some READMEs
slivanovich Feb 26, 2025
e1d4994
Add: micro benchmarks
slivanovich Feb 26, 2025
18c61a4
Merged
kohlrabka Feb 26, 2025
a7a7f85
Fix
kohlrabka Feb 26, 2025
864236c
Fix
kohlrabka Feb 26, 2025
b529c94
Fix
kohlrabka Feb 26, 2025
f359456
Fix
kohlrabka Feb 28, 2025
5226714
Fix
kohlrabka Feb 28, 2025
c7d61f1
Fix
kohlrabka Feb 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions .cache/graph_example_1.txt

This file was deleted.

10 changes: 0 additions & 10 deletions .cache/graph_example_2.txt

This file was deleted.

11 changes: 0 additions & 11 deletions .cache/graph_example_3.txt

This file was deleted.

5 changes: 0 additions & 5 deletions .cache/graph_example_4.txt

This file was deleted.

65 changes: 55 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,68 @@
name: Build project

on: [push]

jobs:
ci:
ci-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Installing cmake...
run: sudo apt install cmake
- name: Building...

- name: Install dependencies on Ubuntu
run: sudo apt update && sudo apt install cmake -y

- name: Build the project on Ubuntu
run: |
cd src
cd cpp
mkdir .build && cd .build
cmake ..
make -j
- name: Testing...

- name: Run tests on Ubuntu
run: |
cd src/.build
./HSE_SD_tests
cd cpp/.build
export ASAN_OPTIONS="alloc_dealloc_mismatch=0"
./tests/algo_analysis_tests

ci-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: Windows moment ))
run: choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System' --yes

# - name: Windows moment ))
# run: |
# cd cpp
# mkdir .build && cd .build
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# cmake --build . --config Debug -- /m
# - name: Debug Windows build output
# run: dir cpp\.build

# - name: List files in Debug folder
# run: dir cpp\.build\Debug

# - name: Run tests on Windows
# run: |
# cd src\.build
# .\Debug\HSE_SD_tests.exe

ci-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

- name: Install dependencies on macOS
run: brew install cmake

- name: Build the project on macOS
run: |
cd cpp
mkdir .build && cd .build
cmake ..
make -j

- name: Run tests on macOS
run: |
cd cpp/.build
./tests/algo_analysis_tests
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ src/cmake-build-debug/*
*/.build/*
build/*
.build/*
cpp/micro_benchmarks/build
230 changes: 37 additions & 193 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,212 +1,56 @@
# Документация по библиотеке графовых алгоритмов
# algo_analysis
![Build Status](https://github.com/HSE-Software-Development/algorithms_analysis/actions/workflows/ci.yml/badge.svg)
![License](https://img.shields.io/badge/License-MIT-blue.svg)

1. [Класс GeneralGraph](#класс-generalgraph)
2. [Формат графа](#формат-графа)
3. [Алгоритмы](#алгоритмы)
- [FordBellman](#fordbellman)
- [DFS](#dfs)
- [BSF](#bfs)
- [Dijkstra](#dijkstra)
Данная библиотека предназначена для реализации различных алгоритмов поиска кратчайшего пути с учетом стоимости, таких как алгоритмы Форда-Беллмана, Дейкстры и другие. Экспериментальная среда будет позволять тестировать и сравнивать производительность этих алгоритмов на различных данных.

## Архитектура

### Пространство имен algorithms
В пространстве имен algorithms находятся шаблонные методы для выполнения графовых алгоритмов. Каждый алгоритм принимает на вход объект класса GeneralGraph, и опциональные переменные.

### Класс GeneralGraph
Класс GeneralGraph является шаблонным и имеет две переменные типа:
- TVertex — тип данных для вершин
- TEdge — тип данных для ребер
## Алгоритмы

#### Конструкторы
Класс GeneralGraph предлагает два конструктора для инициализации графа:
1. GeneralGraph(const std::string& filePath)
Конструктор, принимающий путь до файла, в котором хранится граф в необходимом формате.
**Задача SSSP** (single-source shortest path problem): Найти расстояния от выделенной вершины s до всех вершин

2. GeneralGraph(std::istream& inputStream)
Конструктор, принимающий поток ввода для задания графа в необходимом формате.
**Задача APSP** (all pairs shortest path problem): Найти расстояния между всеми парами вершин, матрицу расстояний (SSSP ⊂ APSP)

## Примеры использования
1. DFS (SSSP)
2. BFS + queue (SSSP)
3. BFS + deque (SSSP)
4. Dijkstra (SSSP)
5. Dijkstra + fib-heap (SSSP)
6. A\* (SSSP)
7. Ford-Bellman (SSSP)
8. Floid (APSP)

### Пример создания графа из файла
```
#include "GeneralGraph.h"
#include "algorithms.h"

int main() {
GeneralGraph<int, double> graph("path/to/graph.txt");
algorithms::someGraphAlgorithm(graph, ...);
return 0;
}
```
Подробнее в [документации по алгоритмам](docs/algorithms.md)

## Build

## Формат графа
Для корректного создания графа, необходимо следующее оформление данных:
- В первом ряду указывается два числа: n - количество вершин в графе и число 0 или 1(При отсутствии веса в вершинах или наличии соответственно)
- В случае, если был выставлен флаг 1:
- В каждом из следующих n строчек указывается вес внутри вершины с соответствующим номером
- В каждом следующем ряду указывается новое ребро:
- Формат записи:
vertex1 vertex2 weight \
где:
- vertex1 и vertex2 — идентификаторы вершин, соединенных ребром.
- weight — вес ребра (должен быть типом данных TEdge).
### For Unix(Linux/MacOs)

### Пример формата графа
1. **Build the project with tests and micro benchmarking:**
```sh
git clone git@github.com:HSE-Software-Development/algorithms_analysis.git
cd algorithms_analysis
sh scripts/build_algo_analysis.sh
```
4 1
1
2
3
4
0 1 10
1 2 20
2 3 30
3 0 40
0 2 50
1 3 60
Если вы не хотите запускать тесты автоматически после сборки библиотеки то:
```sh
sh scripts/build_algo_analysis.sh 0
```

В данном примере указан полный граф на 4-ех вершинах с указанными весами на ребрах и в вершинах.

## Алгоритмы

### FordBellman
#### Описание
Функция реализует алгоритм Форда - Беллмана для поиска кратчайших путей от одной начальной вершины до всех остальных в графе, в том числе с учетом отрицательных весов.

#### Шаблон
```c++
template <typename T, typename K>
void FordBellman(size_t startIndex, GeneralGraph<T, K> *graph, std::vector<T> &distances);
2. **Run the tests:**
```sh
cd cpp/build
./tests/algo_analysis_tests
```
#### Параметры
- startIndex — начальный индекс для алгоритма (указатель на начальную вершину для вычисления кратчайших путей).
- graph — указатель на объект GeneralGraph, который представляет граф.
- distances — ссылка на вектор, который будет заполнен наименьшими расстояниями от начальной вершины до всех остальных.

#### Пример использования
```c++
#include "GeneralGraph.h"
#include "algorithms.h"

int main() {
GeneralGraph<int, double> graph("path/to/graph_with_negatives.txt");
std::vector<double> distances(graph.vertexCount(), std::numeric_limits<double>::infinity());

size_t startIndex = 0; // Начальная вершина
algorithms::FordBellman(startIndex, &graph, distances);

// Теперь вектор distances содержит кратчайшие расстояния, даже с учетом отрицательных весов
return 0;
}
```

### DFS
#### Функция DFS

#### Описание
Функция выполняет поиск в глубину (DFS) в графе и может использоваться для вычисления кратчайших расстояний в графе без отрицательных весов.

#### Шаблон
```c++
template <typename T, typename K>
void DFS(size_t startIndex, GeneralGraph<T, K> *graph, std::vector<T> &distances);
```
### For Windows (MSVC)

#### Параметры
- startIndex — начальный индекс для поиска (указатель на начальную вершину).
- graph — указатель на объект GeneralGraph, содержащий граф, по которому будет выполнен поиск.
- distances — ссылка на вектор, который будет заполнен расстояниями от начальной вершины до всех остальных.

#### Пример использования
```c++
#include "GeneralGraph.h"
#include "algorithms.h"

int main() {
GeneralGraph<int, double> graph("path/to/graph.txt");
std::vector<double> distances(graph.vertexCount(), std::numeric_limits<double>::infinity());

size_t startIndex = 0; // Начальная вершина
algorithms::DFS(startIndex, &graph, distances);

// Теперь вектор distances содержит расстояния
return 0;
}
```
### BFS
#### Описание
Функция реализует алгоритм поиска в ширину (BFS) для нахождения кратчайших путей от одной стартовой вершины до всех остальных. Алгоритм работает для графов без отрицательных весов и подходит для неориентированных и ориентированных графов.

#### Шаблон
```c++
template <typename T, typename K>
void BFS(size_t startIndex, GeneralGraph<T, K> *graph, std::vector<T> &distances);
```
До слез

#### Параметры
- startIndex — начальный индекс для поиска, указывающий на стартовую вершину.
- graph — указатель на объект GeneralGraph, представляющий сам граф.
- distances — ссылка на вектор, который будет заполнен кратчайшими расстояниями от начальной вершины до всех остальных.

#### Пример использования
```c++
#include "GeneralGraph.h"
#include "algorithms.h"

int main() {
GeneralGraph<int, double> graph("path/to/graph.txt");
std::vector<double> distances(graph.vertexCount(), std::numeric_limits<double>::infinity());

size_t startIndex = 0; // Начальная вершина
algorithms::BFS(startIndex, &graph, distances);

// distances теперь содержит кратчайшие расстояния от startIndex до всех других вершин
return 0;
}
```
## Installation and contributing
[Примеры использования тут](examples/README.md)

### Dijkstra
#### Описание
Функция реализует алгоритм Дейкстры для решения задачи нахождения кратчайшего пути от одной стартовой вершины до всех остальных вершин в графе с неотрицательными весами.
Также у вас есть возможность дополнять нашу библиотеку алгоритмов путем их добавления в пространство имен algorithms или же просто как отдельные методы (важно: чтобы этими методами могли оперировать [классы задач](docs/architecture.md) они должны обладать конкретными параметрами в своем определении)

#### Шаблон
```c++
template <typename T, typename K>
void Dijkstra(size_t startIndex, GeneralGraph<T, K> *graph, std::vector<T> &distances);
```
## License

#### Параметры
- startIndex — начальный индекс для поиска кратчайших путей, указывающий на стартовую вершину в графе.
- graph — указатель на объект GeneralGraph, представляющий граф, по которому будет выполняться поиск кратчайших путей.
- distances — ссылка на вектор, который будет заполнен расстояниями от начальной вершины до всех остальных. Вектор должен быть инициализирован (например, значением "бесконечность" для всех вершин, кроме стартовой).

#### Пример использования
```c++
#include "GeneralGraph.h"
#include "algorithms.h"
#include <limits>
#include <iostream>

int main() {
GeneralGraph<int, double> graph("path/to/graph.txt");
std::vector<double> distances(graph.vertexCount(), std::numeric_limits<double>::infinity());

size_t startIndex = 0; // Начальная вершина
distances[startIndex] = 0; // Расстояние до самой себя - 0
algorithms::Dijkstra(startIndex, &graph, distances);

// Вывод расстояний от стартовой вершины до всех остальных
for (size_t i = 0; i < distances.size(); ++i) {
if (distances[i] == std::numeric_limits<double>::infinity()) {
std::cout << "Расстояние до вершины " << i << ": бесконечность" << std::endl;
} else {
std::cout << "Расстояние до вершины " << i << ": " << distances[i] << std::endl;
}
}

return 0;
}
```
This project is licensed under the [MIT license](LICENSE)
Loading
Loading