# Graf: Библиотека для работы с графами и алгоритмами
**Graf** - это библиотека Python, предоставляющая инструменты для работы с графами и реализации различных алгоритмов на них. Она включает в себя алгоритмы Дейкстры, Флойда-Уоршалла, поиска Эйлерова цикла, а также возможность читать и визуализировать графы из файлов формата DOT.
## Установка
Для установки `Graf-Lab-4-Py`, используйте `pip`:
`pip install Graf-Lab-4-Py`
## Зависимости
Graf зависит от следующих библиотек:
- networkx - для работы с графами, например для создания, добавления ребер, расположения узлов и отображения.
- matplotlib - для визуализации графов.
- numpy - для хранения и манипулирования числовыми данными (матрицами) для графов.
Эти зависимости будут установлены автоматически при установке пакета с помощью pip. # Будут же?
## Модули
Библиотека состоит из следующих модулей:
• Graf.Algorithm.floyd_warshall: Реализация алгоритма Уоршалла-Флойда.
• Graf.Algorithm.dijkstra: Реализация алгоритма Дейкстры.
• Graf.Algorithm.euler: Реализация нахождение Эйлерова цикла.
• Graf.Matrix.Vis_matrix: Реализация базовой структуры графа с помощью класса Graph (c методами для добавления ребер) и вывода матрицы весов.
• Graf.Matrix.Incidence_matrix: Реализация вывода матрици инцидентности.
• Graf.Matrix.Adjacency_matrix: Реализация вывода матрици смежности.
## Использование
### Алгоритм Дейкстры
```
python
from Graf.Algorithm.dijkstra import dijkstra
graph = {
'A': {'B': 1, 'C': 4},
'B': {'A': 1, 'C': 2, 'D': 5},
'C': {'A': 4, 'B': 2, 'D': 1},
'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
shortest_distances = dijkstra(graph, start_vertex)
print(shortest_distances) # Выведет {'A': 0, 'B': 1, 'C': 3, 'D': 4}
```
### Алгоритм Уоршалла-Флойда
Для работы алгоритма необходимо создать файл graph.dot с описанием графа в формате DOT
**Пример:** u -> v [label="w"], где u - начальная вершина, v - целевая вершина, w - вес ребра
```
# digraph G {
# 1 -> 2 [label="5"];
# 2 -> 3 [label="1"];
# 3 -> 1 [label="2"];
# }
```
```
python
from Graf.floyd_warshall import floyd_warshall
from Graf.graph_utils import read_graph_from_dot
graph = read_graph_from_dot("graph.dot")
shortest_paths = floyd_warshall(graph)
# Результат в shortest_paths - матрица кратчайших расстояний
with open("shortest_paths.txt", 'w', encoding='utf-8') as f:
for i in range(len(graph)):
for j in range(len(graph)):
if shortest_paths[i][j] == float('inf'):
f.write(f"Расстояние от {i + 1} до {j + 1}: ∞\n")
else:
f.write(f"Расстояние от {i + 1} до {j + 1}: {shortest_paths[i][j]}\n")
print("Кратчайшие пути (Флойд-Уоршалл) записаны в shortest_paths.txt")
```
### Нахождениие Эйлерова цикла
```
# Находим Эйлеров цикл
eulerian_cycle = find_eulerian_cycle(graph, start_vertex)
# Вывод результата
if eulerian_cycle:
print("Эйлеров цикл:", eulerian_cycle)
else:
print("Эйлеров цикл не существует.")
```
### Визуализация графа для алгоритм Уоршалла-Флойда
Для визуализации графа необходимо прочитать его из файла .dot.
```
python
from Graf.floyd_warshall import read_graph_from_dot, draw_graph
graph = read_graph_from_dot("graph.dot")
draw_graph(graph)
```
### Вывод матрици весов
```
python
g = Graph(4)
g.add_edge(0, 1, 10)
g.add_edge(0, 2, 15)
g.add_edge(1, 2, 20)
g.add_edge(2, 3, 30)
# выводим матрицу весов
g.print_matrix()
```
### Вывод матрици инцидентности
```
python
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
inc_matrix = incidence_matrix(graph)
print("\nМатрица инцидентности:")
print(inc_matrix)
```
### Вывод матрици смежности
```
python
g = Graph(4)
g.add_edge(0, 1, 10)
g.add_edge(0, 2, 15)
g.add_edge(1, 2, 20)
g.add_edge(2, 3, 30)
# выводим матрицу весов
g.print_matrix()
```
## Автор
• Садова Диана
• Жукова Арина
## Лицензия
Этот проект лицензирован под MIT License.
## Дополнительная информация
Пожалуйста, посетите страницу проекта на [GitHub](https://github.com/DianaSadova/Graf) для получения дополнительной информации и кода.
Raw data
{
"_id": null,
"home_page": "https://github.com/DianaSadova/Graf",
"name": "Graf-Lab-4-Py",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "graf, mathematics",
"author": "Sadova Diana, Zhukova Arina",
"author_email": "grnshinnosha@gmail.com,arichka2005@yandex.ru",
"download_url": "https://files.pythonhosted.org/packages/93/32/dd896f98ce0a3fd4ad8e1d4dd136f67227b9f555c24e373bda80528b5e9f/graf_lab_4_py-1.0.3.tar.gz",
"platform": null,
"description": "# Graf: \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438\r\n\r\n**Graf** - \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u043d\u0438\u0445. \u041e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b, \u0424\u043b\u043e\u0439\u0434\u0430-\u0423\u043e\u0440\u0448\u0430\u043b\u043b\u0430, \u043f\u043e\u0438\u0441\u043a\u0430 \u042d\u0439\u043b\u0435\u0440\u043e\u0432\u0430 \u0446\u0438\u043a\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 DOT.\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\r\n\r\n\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 `Graf-Lab-4-Py`, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 `pip`:\r\n\r\n`pip install Graf-Lab-4-Py`\r\n\r\n## \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\r\n\r\nGraf \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a:\r\n\r\n- networkx - \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0431\u0435\u0440, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.\r\n- matplotlib - \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u043e\u0432.\r\n- numpy - \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438) \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u043e\u0432.\r\n\r\n\u042d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e pip. # \u0411\u0443\u0434\u0443\u0442 \u0436\u0435?\r\n\r\n## \u041c\u043e\u0434\u0443\u043b\u0438\r\n\r\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:\r\n\r\n\u2022 Graf.Algorithm.floyd_warshall: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0423\u043e\u0440\u0448\u0430\u043b\u043b\u0430-\u0424\u043b\u043e\u0439\u0434\u0430.\r\n\r\n\u2022 Graf.Algorithm.dijkstra: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b.\r\n\r\n\u2022 Graf.Algorithm.euler: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u042d\u0439\u043b\u0435\u0440\u043e\u0432\u0430 \u0446\u0438\u043a\u043b\u0430.\r\n\r\n\u2022 Graf.Matrix.Vis_matrix: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0433\u0440\u0430\u0444\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 Graph (c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0431\u0435\u0440) \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0435\u0441\u043e\u0432.\r\n\r\n\u2022 Graf.Matrix.Incidence_matrix: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0438 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438.\r\n\r\n\u2022 Graf.Matrix.Adjacency_matrix: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0438 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438.\r\n\r\n\r\n## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\r\n\r\n### \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b\r\n\r\n```\r\npython\r\nfrom Graf.Algorithm.dijkstra import dijkstra\r\n\r\ngraph = {\r\n 'A': {'B': 1, 'C': 4},\r\n 'B': {'A': 1, 'C': 2, 'D': 5},\r\n 'C': {'A': 4, 'B': 2, 'D': 1},\r\n 'D': {'B': 5, 'C': 1}\r\n}\r\n\r\nstart_vertex = 'A'\r\nshortest_distances = dijkstra(graph, start_vertex)\r\n\r\nprint(shortest_distances) # \u0412\u044b\u0432\u0435\u0434\u0435\u0442 {'A': 0, 'B': 1, 'C': 3, 'D': 4}\r\n```\r\n\r\n### \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0423\u043e\u0440\u0448\u0430\u043b\u043b\u0430-\u0424\u043b\u043e\u0439\u0434\u0430\r\n\r\n\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b graph.dot \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 DOT\r\n\r\n**\u041f\u0440\u0438\u043c\u0435\u0440:** u -> v [label=\"w\"], \u0433\u0434\u0435 u - \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430, v - \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430, w - \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430\r\n```\r\n# digraph G {\r\n# 1 -> 2 [label=\"5\"];\r\n# 2 -> 3 [label=\"1\"];\r\n# 3 -> 1 [label=\"2\"];\r\n# }\r\n```\r\n\r\n```\r\npython\r\nfrom Graf.floyd_warshall import floyd_warshall\r\nfrom Graf.graph_utils import read_graph_from_dot\r\n\r\ngraph = read_graph_from_dot(\"graph.dot\")\r\nshortest_paths = floyd_warshall(graph)\r\n\r\n# \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 shortest_paths - \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439\r\nwith open(\"shortest_paths.txt\", 'w', encoding='utf-8') as f:\r\n for i in range(len(graph)):\r\n for j in range(len(graph)):\r\n if shortest_paths[i][j] == float('inf'):\r\n f.write(f\"\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 {i + 1} \u0434\u043e {j + 1}: \u221e\\n\")\r\n else:\r\n f.write(f\"\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 {i + 1} \u0434\u043e {j + 1}: {shortest_paths[i][j]}\\n\")\r\nprint(\"\u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u043f\u0443\u0442\u0438 (\u0424\u043b\u043e\u0439\u0434-\u0423\u043e\u0440\u0448\u0430\u043b\u043b) \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 shortest_paths.txt\")\r\n```\r\n\r\n### \u041d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438\u0435 \u042d\u0439\u043b\u0435\u0440\u043e\u0432\u0430 \u0446\u0438\u043a\u043b\u0430\r\n\r\n```\r\n# \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b\r\neulerian_cycle = find_eulerian_cycle(graph, start_vertex)\r\n\r\n# \u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\r\nif eulerian_cycle:\r\n print(\"\u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b:\", eulerian_cycle)\r\nelse:\r\n print(\"\u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\")\r\n\r\n\r\n```\r\n\r\n### \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0430\u0444\u0430 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0423\u043e\u0440\u0448\u0430\u043b\u043b\u0430-\u0424\u043b\u043e\u0439\u0434\u0430\r\n\r\n\u0414\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 .dot.\r\n\r\n```\r\npython\r\nfrom Graf.floyd_warshall import read_graph_from_dot, draw_graph\r\n\r\ngraph = read_graph_from_dot(\"graph.dot\")\r\ndraw_graph(graph)\r\n```\r\n\r\n### \u0412\u044b\u0432\u043e\u0434 \u043c\u0430\u0442\u0440\u0438\u0446\u0438 \u0432\u0435\u0441\u043e\u0432 \r\n\r\n```\r\npython\r\ng = Graph(4)\r\ng.add_edge(0, 1, 10)\r\ng.add_edge(0, 2, 15)\r\ng.add_edge(1, 2, 20)\r\ng.add_edge(2, 3, 30)\r\n\r\n# \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0435\u0441\u043e\u0432\r\ng.print_matrix()\r\n```\r\n\r\n### \u0412\u044b\u0432\u043e\u0434 \u043c\u0430\u0442\u0440\u0438\u0446\u0438 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438\r\n\r\n```\r\npython\r\ngraph = {\r\n 'A': ['B', 'C'],\r\n 'B': ['A', 'D', 'E'],\r\n 'C': ['A', 'F'],\r\n 'D': ['B'],\r\n 'E': ['B', 'F'],\r\n 'F': ['C', 'E']\r\n }\r\n\r\ninc_matrix = incidence_matrix(graph)\r\nprint(\"\\n\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438:\")\r\nprint(inc_matrix)\r\n```\r\n\r\n### \u0412\u044b\u0432\u043e\u0434 \u043c\u0430\u0442\u0440\u0438\u0446\u0438 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \r\n\r\n```\r\npython\r\ng = Graph(4)\r\ng.add_edge(0, 1, 10)\r\ng.add_edge(0, 2, 15)\r\ng.add_edge(1, 2, 20)\r\ng.add_edge(2, 3, 30)\r\n\r\n# \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0435\u0441\u043e\u0432\r\ng.print_matrix()\r\n```\r\n\r\n## \u0410\u0432\u0442\u043e\u0440\r\n\r\n\u2022 \u0421\u0430\u0434\u043e\u0432\u0430 \u0414\u0438\u0430\u043d\u0430\r\n\u2022 \u0416\u0443\u043a\u043e\u0432\u0430 \u0410\u0440\u0438\u043d\u0430\r\n\r\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\r\n\r\n\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 MIT License.\r\n\r\n## \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\r\n\r\n\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 [GitHub](https://github.com/DianaSadova/Graf) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u0434\u0430.\r\n",
"bugtrack_url": null,
"license": null,
"summary": "\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u043d\u0430 \u043d\u0438\u0445.",
"version": "1.0.3",
"project_urls": {
"GitHub": "https://github.com/DianaSadova/Graf",
"Homepage": "https://github.com/DianaSadova/Graf"
},
"split_keywords": [
"graf",
" mathematics"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "50a0f45d5fc2abaccd194eddb82018ef5a8d063c3c036b128053c0ab5c561ae9",
"md5": "c4e5e033adc93e9558773cb24ce2e413",
"sha256": "2e5d12560a6fc1dcf31634e8c4eb564670317a44973a1755289657e9d5df54ad"
},
"downloads": -1,
"filename": "Graf_Lab_4_Py-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c4e5e033adc93e9558773cb24ce2e413",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 10828,
"upload_time": "2024-12-24T10:25:34",
"upload_time_iso_8601": "2024-12-24T10:25:34.223800Z",
"url": "https://files.pythonhosted.org/packages/50/a0/f45d5fc2abaccd194eddb82018ef5a8d063c3c036b128053c0ab5c561ae9/Graf_Lab_4_Py-1.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9332dd896f98ce0a3fd4ad8e1d4dd136f67227b9f555c24e373bda80528b5e9f",
"md5": "5d2d7f1f8e051b879386eb3610bf9bf6",
"sha256": "21ee0fbca53c78e8400a1e2df36bf6e31ae074afc048c92b56ebe183d54a4b3f"
},
"downloads": -1,
"filename": "graf_lab_4_py-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "5d2d7f1f8e051b879386eb3610bf9bf6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 8214,
"upload_time": "2024-12-24T10:25:35",
"upload_time_iso_8601": "2024-12-24T10:25:35.374035Z",
"url": "https://files.pythonhosted.org/packages/93/32/dd896f98ce0a3fd4ad8e1d4dd136f67227b9f555c24e373bda80528b5e9f/graf_lab_4_py-1.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-24 10:25:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "DianaSadova",
"github_project": "Graf",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "graf-lab-4-py"
}