Compare commits
1 Commits
Nikiforova
...
Nikiforova
Author | SHA1 | Date | |
---|---|---|---|
25f5a7f4fa |
@ -1,124 +0,0 @@
|
|||||||
# Отчёт по лабораторной работе №1
|
|
||||||
Выполнил: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
|
||||||
|
|
||||||
## Разворачивание сервера mediawiki
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Содержимое файла docker-compose.yml:
|
|
||||||
```yam
|
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
mediawiki:
|
|
||||||
image: mediawiki # Используемый образ Mediawiki
|
|
||||||
restart: always # Всегда перезапускать контейнер при остановке
|
|
||||||
ports:
|
|
||||||
- 8080:80 # Проброс портов: внешний порт 8080 к внутреннему порту 80 контейнера
|
|
||||||
links:
|
|
||||||
- database # Связь с сервисом "database"
|
|
||||||
volumes:
|
|
||||||
- images:/var/www/html/images # Монтирование тома для хранения изображений
|
|
||||||
- ./LocalSettings.php:/var/www/html/LocalSettings.php # Монтирование файла конфигурации LocalSettings.php
|
|
||||||
database:
|
|
||||||
image: mariadb # Используемый образ MariaDB
|
|
||||||
restart: always # Всегда перезапускать контейнер при остановке
|
|
||||||
environment:
|
|
||||||
MYSQL_DATABASE: my_wiki # Имя базы данных MariaDB
|
|
||||||
MYSQL_USER: wikiuser # Имя пользователя базы данных MariaDB
|
|
||||||
MYSQL_PASSWORD: example # Пароль пользователя базы данных MariaDB
|
|
||||||
MYSQL_RANDOM_ROOT_PASSWORD: 'yes' # Генерировать случайный пароль для root пользователя MariaDB
|
|
||||||
volumes:
|
|
||||||
- db:/var/lib/mysql # Монтирование тома для хранения данных базы данных MariaDB
|
|
||||||
volumes:
|
|
||||||
images: # Определение тома "images" для хранения изображений Mediawiki
|
|
||||||
db: # Определение тома "db" для хранения данных базы данных MariaDB
|
|
||||||
```
|
|
||||||
Разворачивается командой docker-compose up.
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
## Разворачивание сервера wordpress
|
|
||||||
```yam
|
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
wordpress:
|
|
||||||
image: wordpress # Используемый образ Docker для WordPress
|
|
||||||
container_name: wordpress # Имя контейнера WordPress
|
|
||||||
ports:
|
|
||||||
- '8081:80' # Проброс портов: внешний порт 8081 к внутреннему порту 80 контейнера
|
|
||||||
environment:
|
|
||||||
WORDPRESS_DB_HOST: mysql # Имя хоста базы данных MySQL
|
|
||||||
WORDPRESS_DB_USER: wp_user # Имя пользователя базы данных WordPress
|
|
||||||
WORDPRESS_DB_PASSWORD: wp_password # Пароль пользователя базы данных WordPress
|
|
||||||
WORDPRESS_DB_NAME: wp_database # Имя базы данных WordPress
|
|
||||||
volumes:
|
|
||||||
- wordpress_data:/var/www/html # Монтирование тома для хранения данных WordPress
|
|
||||||
networks:
|
|
||||||
- wordpress-network # Использование сети "wordpress-network" для связи
|
|
||||||
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.7 # Используемый образ Docker для MySQL
|
|
||||||
container_name: mysql # Имя контейнера MySQL
|
|
||||||
environment:
|
|
||||||
MYSQL_ROOT_PASSWORD: root_password # Пароль для root пользователя MySQL
|
|
||||||
MYSQL_DATABASE: wp_database # Имя базы данных MySQL
|
|
||||||
MYSQL_USER: wp_user # Имя пользователя MySQL для WordPress
|
|
||||||
MYSQL_PASSWORD: wp_password # Пароль пользователя MySQL для WordPress
|
|
||||||
volumes:
|
|
||||||
- mysql_data:/var/lib/mysql # Монтирование тома для хранения данных MySQL
|
|
||||||
networks:
|
|
||||||
- wordpress-network # Использование сети "wordpress-network" для связи
|
|
||||||
networks:
|
|
||||||
wordpress-network: # Определение сети "wordpress-network" для связи между контейнерами
|
|
||||||
volumes:
|
|
||||||
wordpress_data: # Определение тома данных "wordpress_data" для хранения данных WordPress
|
|
||||||
mysql_data: # Определение тома данных "mysql_data" для хранения данных MySQL
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
## Разворачивание сервера redmine
|
|
||||||
Содержимое файла docker-compose.yml:
|
|
||||||
```yam
|
|
||||||
version: '2'
|
|
||||||
services:
|
|
||||||
mariadb: # Определение сервиса MariaDB
|
|
||||||
image: docker.io/bitnami/mariadb:11.0 # Используемый образ MariaDB
|
|
||||||
volumes:
|
|
||||||
- 'mariadb_data:/bitnami/mariadb' # Монтирование тома для данных MariaDB
|
|
||||||
environment:
|
|
||||||
# ALLOW_EMPTY_PASSWORD is recommended only for development.
|
|
||||||
- ALLOW_EMPTY_PASSWORD=yes # Разрешение использовать пустой пароль (рекомендуется только для разработки).
|
|
||||||
- MARIADB_USER=bn_redmine # Имя пользователя базы данных MariaDB
|
|
||||||
- MARIADB_DATABASE=bitnami_redmine # Имя базы данных MariaDB
|
|
||||||
|
|
||||||
redmine: # Определение сервиса Redmine
|
|
||||||
image: docker.io/bitnami/redmine:5 # Используемый образ Redmine
|
|
||||||
ports:
|
|
||||||
- '3000:3000' # Проброс портов: внешний порт 3000 к внутреннему порту 3000
|
|
||||||
volumes:
|
|
||||||
- 'redmine_data:/bitnami/redmine' # Монтирование тома для данных Redmine
|
|
||||||
depends_on:
|
|
||||||
- mariadb # Зависимость от сервиса MariaDB (Redmine будет запущен только после MariaDB)
|
|
||||||
environment:
|
|
||||||
# ALLOW_EMPTY_PASSWORD is recommended only for development.
|
|
||||||
- ALLOW_EMPTY_PASSWORD=yes # Разрешение использовать пустой пароль (рекомендуется только для разработки).
|
|
||||||
- REDMINE_DATABASE_HOST=mariadb # Имя хоста базы данных MariaDB
|
|
||||||
- REDMINE_DATABASE_PORT_NUMBER=3306 # Порт базы данных MariaDB
|
|
||||||
- REDMINE_DATABASE_USER=bn_redmine # Имя пользователя базы данных Redmine
|
|
||||||
- REDMINE_DATABASE_NAME=bitnami_redmine # Имя базы данных Redmine
|
|
||||||
volumes:
|
|
||||||
mariadb_data: # Определение тома mariadb_data
|
|
||||||
driver: local # Использование локального драйвера для хранения данных на хосте
|
|
||||||
redmine_data: # Определение тома redmine_data
|
|
||||||
driver: local # Использование локального драйвера для хранения данных на хосте
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 265 KiB |
Before Width: | Height: | Size: 483 KiB |
Before Width: | Height: | Size: 591 KiB |
Before Width: | Height: | Size: 429 KiB |
Before Width: | Height: | Size: 294 KiB |
Before Width: | Height: | Size: 253 KiB |
Before Width: | Height: | Size: 276 KiB |
@ -1,2 +0,0 @@
|
|||||||
*/*/bin
|
|
||||||
*/*/obj
|
|
@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.0.31903.59
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{0F8A06E1-9249-412F-886F-8C0D24057473}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,52 +0,0 @@
|
|||||||
# Отчёт по лабораторной работе №2
|
|
||||||
Выполнила: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
|
||||||
|
|
||||||
Вариант программы 1: Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt.
|
|
||||||
Вариант программы 2: Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
|
|
||||||
|
|
||||||
# Создание приложений
|
|
||||||
|
|
||||||
Создали два приложения с помощью команд:
|
|
||||||
|
|
||||||
```yam
|
|
||||||
dotnet new console -o worker-1
|
|
||||||
dotnet new console -o worker-2
|
|
||||||
```
|
|
||||||
программа 1: Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt.
|
|
||||||
|
|
||||||
[Текст программы worker-1](worker-1/Program.cs)
|
|
||||||
|
|
||||||
Программа 2: Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt
|
|
||||||
|
|
||||||
[Текст программы worker-2](worker-2/Program.cs)
|
|
||||||
|
|
||||||
Cоздан файл [.gitignore](.gitignore) с помощью команды dotnet new gitignore.
|
|
||||||
|
|
||||||
# Настройка окуржения
|
|
||||||
|
|
||||||
Для связи двух приложений воспользуемся следующей схемой:
|
|
||||||
|
|
||||||
Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-1/Dockerfile)) с подробным описанием процесса сборки.
|
|
||||||
|
|
||||||
Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
|
|
||||||
|
|
||||||
Дополнительно был создан файл [.dockerignore](.dockerignore) и дополнен [.gitignore](.gitignore), чтобы исключить для сборки и коммита всё лишнее.
|
|
||||||
|
|
||||||
# Сборка и запуск
|
|
||||||
|
|
||||||
В каталог ./data помещены 2 файла: another_data.txt и data.txt.
|
|
||||||
Для запуска приложения необходимо ввести команду `docker compose up --build`.
|
|
||||||
|
|
||||||
Результат запуска после сборки:
|
|
||||||
```
|
|
||||||
[+] Running 3/3
|
|
||||||
✔ Network lab_2_default Created
|
|
||||||
✔ Container lab_2-worker-1-1 Created
|
|
||||||
✔ Container lab_2-worker-2-1 Created
|
|
||||||
Attaching to lab_2-worker-1-1, lab_2-worker-2-1
|
|
||||||
lab_2-worker-1-1 exited with code 0
|
|
||||||
lab_2-worker-2-1 | Максимальное число во входных данных: 4
|
|
||||||
lab_2-worker-2-1 | Квадрат максимального числа: 16
|
|
||||||
lab_2-worker-2-1 exited with code 0
|
|
||||||
```
|
|
||||||
В результате в каталоге `./result` создался файл `result.txt` с содержимым `16`, что соответствует входным данным.
|
|
@ -1,4 +0,0 @@
|
|||||||
10
|
|
||||||
10
|
|
||||||
10
|
|
||||||
10
|
|
@ -1,4 +0,0 @@
|
|||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
@ -1,13 +0,0 @@
|
|||||||
version: "3.1"
|
|
||||||
services:
|
|
||||||
worker-1:
|
|
||||||
build: ./worker-1
|
|
||||||
volumes:
|
|
||||||
- ./data:/var/data
|
|
||||||
- ./result:/var/result
|
|
||||||
worker-2:
|
|
||||||
build: ./worker-2
|
|
||||||
volumes:
|
|
||||||
- ./result:/var/result
|
|
||||||
depends_on:
|
|
||||||
- worker-1
|
|
@ -1,4 +0,0 @@
|
|||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
@ -1 +0,0 @@
|
|||||||
16
|
|
@ -1,17 +0,0 @@
|
|||||||
#задаем базовый образ на .net 6.0
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
|
|
||||||
#задаем рабочую директорию
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
#в каталог копируем файлы и папки в контейнер
|
|
||||||
COPY . /app
|
|
||||||
#создаем образы и устанавливаем данные пакеты в контейнер
|
|
||||||
RUN dotnet restore
|
|
||||||
COPY . .
|
|
||||||
RUN dotnet publish -c Release -o /publish
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 as runtime
|
|
||||||
WORKDIR /publish
|
|
||||||
COPY --from=build-env /publish .
|
|
||||||
#вызываем приложение во время выполнения контейнера
|
|
||||||
ENTRYPOINT ["dotnet", "worker-1.dll"]
|
|
@ -1,33 +0,0 @@
|
|||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
|
|
||||||
string[] files = Directory.GetFiles("/var/data");
|
|
||||||
string minFilePath = "";
|
|
||||||
long minFileNameLength = long.MaxValue;
|
|
||||||
foreach (var filePath in files)
|
|
||||||
{
|
|
||||||
FileInfo fileInfo = new FileInfo(filePath);
|
|
||||||
string fileName = Path.GetFileName(filePath);
|
|
||||||
|
|
||||||
if (fileName.Length < minFileNameLength)
|
|
||||||
{
|
|
||||||
minFileNameLength = fileName.Length;
|
|
||||||
minFilePath = filePath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
using (FileStream sourceStream = File.OpenRead(minFilePath))
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[sourceStream.Length];
|
|
||||||
await sourceStream.ReadAsync(buffer, 0, buffer.Length);
|
|
||||||
string text = Encoding.Default.GetString(buffer);
|
|
||||||
|
|
||||||
using (FileStream targetStream = new FileStream("/var/result/data.txt", FileMode.OpenOrCreate))
|
|
||||||
{
|
|
||||||
targetStream.SetLength(0);
|
|
||||||
byte[] textBytes = Encoding.Default.GetBytes(text);
|
|
||||||
await targetStream.WriteAsync(textBytes, 0, textBytes.Length);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<RootNamespace>worker_1</RootNamespace>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,17 +0,0 @@
|
|||||||
#задаем базовый образ на .net 6.0
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
|
|
||||||
#задаем рабочую директорию
|
|
||||||
WORKDIR /src
|
|
||||||
|
|
||||||
#в каталог копируем файлы и папки в контейнер
|
|
||||||
COPY . ./
|
|
||||||
#создаем образы и устанавливаем данные пакеты в контейнер
|
|
||||||
RUN dotnet restore
|
|
||||||
COPY . .
|
|
||||||
RUN dotnet publish -c Release -o /publish
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 as runtime
|
|
||||||
WORKDIR /publish
|
|
||||||
COPY --from=build-env /publish .
|
|
||||||
#вызываем приложение во время выполнения контейнера
|
|
||||||
ENTRYPOINT ["dotnet", "worker-2.dll"]
|
|
@ -1,34 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
string[] numbers;
|
|
||||||
using (FileStream fstream = File.OpenRead("/var/result/data.txt"))
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[fstream.Length];
|
|
||||||
await fstream.ReadAsync(buffer, 0, buffer.Length);
|
|
||||||
string text = Encoding.Default.GetString(buffer);
|
|
||||||
text = text.Replace("\r\n", ";");
|
|
||||||
numbers = text.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
}
|
|
||||||
|
|
||||||
int maxNumber = int.MinValue;
|
|
||||||
foreach (var number in numbers)
|
|
||||||
{
|
|
||||||
int currentNumber = Convert.ToInt32(number);
|
|
||||||
if (currentNumber > maxNumber)
|
|
||||||
{
|
|
||||||
maxNumber = currentNumber;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int maxNumberSquared = maxNumber * maxNumber;
|
|
||||||
|
|
||||||
using (FileStream fstream = new FileStream("/var/result/result.txt", FileMode.OpenOrCreate))
|
|
||||||
{
|
|
||||||
byte[] buffer = Encoding.Default.GetBytes(maxNumberSquared.ToString());
|
|
||||||
await fstream.WriteAsync(buffer, 0, buffer.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine("Максимальное число во входных данных: " + maxNumber);
|
|
||||||
Console.WriteLine("Квадрат максимального числа: " + maxNumberSquared);
|
|
@ -1,11 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<RootNamespace>worker_2</RootNamespace>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
34
tasks/nikiforova-ts/Lab_6/Readme.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Отчёт по лабораторной работе №6
|
||||||
|
|
||||||
|
Выполнила: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
||||||
|
|
||||||
|
## Создание приложения
|
||||||
|
|
||||||
|
Выбрала язык Python.
|
||||||
|
|
||||||
|
Запустим алгоритм с матрицей 3x3 c различными алгоритмами.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## Бенчмарки
|
||||||
|
|
||||||
|
Протекстируем обычный и паралелльный с различными размерами матриц.
|
||||||
|
|
||||||
|
Матрица 5х5
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
Матрица 8х8
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
Вывод: Скоростные возможности параллельного алгоритма проявляются только при значительном количестве операций. В случае, если операций меньше, стандартный алгоритм может оказаться более быстрым.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
tasks/nikiforova-ts/Lab_6/picture/1.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
tasks/nikiforova-ts/Lab_6/picture/2.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
tasks/nikiforova-ts/Lab_6/picture/3.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
tasks/nikiforova-ts/Lab_6/picture/31.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
tasks/nikiforova-ts/Lab_6/picture/4.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
tasks/nikiforova-ts/Lab_6/picture/41.png
Normal file
After Width: | Height: | Size: 50 KiB |
145
tasks/nikiforova-ts/Lab_6/work/Lab6.py
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
import tkinter as tk
|
||||||
|
from tkinter import ttk
|
||||||
|
import numpy as np
|
||||||
|
from multiprocessing import cpu_count, Pool
|
||||||
|
import time
|
||||||
|
|
||||||
|
class DeterminantCalculator:
|
||||||
|
def __init__(self, root):
|
||||||
|
self.root = root
|
||||||
|
self.root.title("Determinant Calculator")
|
||||||
|
|
||||||
|
self.matrix_size_label = ttk.Label(root, text="Matrix Size:")
|
||||||
|
self.matrix_size_label.grid(row=0, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.matrix_size_entry = ttk.Entry(root)
|
||||||
|
self.matrix_size_entry.grid(row=0, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.algorithm_label = ttk.Label(root, text="Algorithm:")
|
||||||
|
self.algorithm_label.grid(row=1, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.algorithm_var = tk.StringVar()
|
||||||
|
self.algorithm_var.set("Normal")
|
||||||
|
self.algorithm_menu = ttk.Combobox(root, textvariable=self.algorithm_var, values=["Normal", "Parallel"])
|
||||||
|
self.algorithm_menu.grid(row=1, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.num_threads_label = ttk.Label(root, text="Number of Threads:")
|
||||||
|
self.num_threads_label.grid(row=2, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.num_threads_entry = ttk.Entry(root)
|
||||||
|
self.num_threads_entry.insert(0, str(cpu_count()))
|
||||||
|
self.num_threads_entry.grid(row=2, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.generate_and_calculate_button = ttk.Button(root, text="Generate Matrix and Calculate Determinant", command=self.generate_and_calculate_determinant)
|
||||||
|
self.generate_and_calculate_button.grid(row=3, column=0, columnspan=2, pady=10)
|
||||||
|
|
||||||
|
self.result_label = ttk.Label(root, text="Result:")
|
||||||
|
self.result_label.grid(row=4, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.time_label = ttk.Label(root, text="Time (s):")
|
||||||
|
self.time_label.grid(row=5, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.matrix_label = ttk.Label(root, text="")
|
||||||
|
self.matrix_label.grid(row=6, column=0, columnspan=2, pady=10)
|
||||||
|
|
||||||
|
self.det_result = None # Глобальная переменная для хранения результата
|
||||||
|
|
||||||
|
def generate_matrix(self, size):
|
||||||
|
matrix = np.random.randint(1, 10, size=(size, size))
|
||||||
|
return matrix
|
||||||
|
|
||||||
|
def show_random_matrix(self, matrix):
|
||||||
|
self.matrix_label.config(text=f"Random Matrix:\n{matrix}")
|
||||||
|
|
||||||
|
def calculate_determinant_parallel(self, matrix, num_threads):
|
||||||
|
size = len(matrix)
|
||||||
|
|
||||||
|
if size == 1:
|
||||||
|
return matrix[0, 0], 0
|
||||||
|
|
||||||
|
result = RawArray('d', [0.0]) # Разделяемый массив для хранения результата
|
||||||
|
lock_object = np.ones(1) # Использование numpy для создания объекта блокировки
|
||||||
|
|
||||||
|
def calculate_submatrix(i):
|
||||||
|
nonlocal result
|
||||||
|
sub_matrix = self.get_submatrix(matrix, i)
|
||||||
|
sub_determinant = matrix[0, i] * self.calculate_determinant(sub_matrix)
|
||||||
|
|
||||||
|
with lock_object.get_lock():
|
||||||
|
result[0] += (-1) ** i * sub_determinant
|
||||||
|
|
||||||
|
with Pool(processes=num_threads) as pool:
|
||||||
|
start_time = time.time()
|
||||||
|
pool.map(calculate_submatrix, range(size))
|
||||||
|
end_time = time.time()
|
||||||
|
|
||||||
|
return result[0], end_time - start_time
|
||||||
|
|
||||||
|
# ваш существующий код
|
||||||
|
|
||||||
|
def get_submatrix(self, matrix, column_index):
|
||||||
|
size = len(matrix)
|
||||||
|
sub_matrix = np.zeros((size - 1, size - 1))
|
||||||
|
|
||||||
|
for i in range(1, size):
|
||||||
|
for j in range(size):
|
||||||
|
if j < column_index:
|
||||||
|
sub_matrix[i - 1, j] = matrix[i, j]
|
||||||
|
elif j > column_index:
|
||||||
|
sub_matrix[i - 1, j - 1] = matrix[i, j]
|
||||||
|
|
||||||
|
return sub_matrix
|
||||||
|
|
||||||
|
def calculate_determinant_group(self, matrix, row, col):
|
||||||
|
sign = (-1) ** (row + col)
|
||||||
|
minor = np.delete(np.delete(np.array(matrix), row, axis=0), col, axis=1)
|
||||||
|
det_minor = self.calculate_determinant(minor)
|
||||||
|
return sign * matrix[row][col] * det_minor
|
||||||
|
|
||||||
|
def calculate_determinant(self, matrix=None):
|
||||||
|
if matrix is None:
|
||||||
|
matrix_size = int(self.matrix_size_entry.get())
|
||||||
|
matrix = self.generate_matrix(matrix_size)
|
||||||
|
|
||||||
|
size = len(matrix)
|
||||||
|
if size == 1:
|
||||||
|
return matrix[0][0]
|
||||||
|
elif size == 2:
|
||||||
|
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
|
||||||
|
else:
|
||||||
|
det = 0
|
||||||
|
for col in range(size):
|
||||||
|
sign = (-1) ** col
|
||||||
|
minor = np.delete(np.array(matrix), 0, axis=0)
|
||||||
|
minor = np.delete(minor, col, axis=1)
|
||||||
|
det += sign * matrix[0][col] * self.calculate_determinant(minor)
|
||||||
|
return det
|
||||||
|
|
||||||
|
def generate_and_calculate_determinant(self):
|
||||||
|
matrix_size = int(self.matrix_size_entry.get())
|
||||||
|
algorithm = self.algorithm_var.get()
|
||||||
|
num_threads = int(self.num_threads_entry.get())
|
||||||
|
|
||||||
|
random_matrix = self.generate_matrix(matrix_size)
|
||||||
|
self.show_random_matrix(random_matrix)
|
||||||
|
|
||||||
|
if algorithm == "Parallel":
|
||||||
|
det, time_taken = self.calculate_determinant_parallel(random_matrix, num_threads)
|
||||||
|
else:
|
||||||
|
start_time = time.time()
|
||||||
|
det = self.calculate_determinant(random_matrix)
|
||||||
|
time_taken = time.time() - start_time
|
||||||
|
|
||||||
|
result_str = f"Determinant: {det}"
|
||||||
|
self.result_label.config(text=result_str)
|
||||||
|
|
||||||
|
time_str = f"Time (s): {time_taken:.6f}"
|
||||||
|
self.time_label.config(text=time_str)
|
||||||
|
|
||||||
|
# Используем глобальную переменную для отображения результата в методе generate_and_calculate_determinant
|
||||||
|
self.det_result = det
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
root = tk.Tk()
|
||||||
|
app = DeterminantCalculator(root)
|
||||||
|
root.mainloop()
|