From 72f39e877a14a5a2023598791e93b591d817280b Mon Sep 17 00:00:00 2001 From: Adelkaks Date: Tue, 9 Jan 2024 18:12:35 +0300 Subject: [PATCH] commit --- tasks/nasybullov-ai/lab_6/Lab6/.gitignore | 484 ++++++++++++++++++ tasks/nasybullov-ai/lab_6/Lab6/Alg1.cs | 46 ++ tasks/nasybullov-ai/lab_6/Lab6/Alg2.cs | 90 ++++ tasks/nasybullov-ai/lab_6/Lab6/Controller.cs | 95 ++++ .../lab_6/Lab6/Form1.Designer.cs | 288 +++++++++++ tasks/nasybullov-ai/lab_6/Lab6/Form1.cs | 91 ++++ tasks/nasybullov-ai/lab_6/Lab6/Form1.resx | 63 +++ tasks/nasybullov-ai/lab_6/Lab6/Lab6.csproj | 11 + tasks/nasybullov-ai/lab_6/Lab6/Lab6.sln | 25 + tasks/nasybullov-ai/lab_6/Lab6/Program.cs | 17 + tasks/nasybullov-ai/lab_6/README.md | 43 ++ tasks/nasybullov-ai/lab_6/pic/1.png | Bin 0 -> 23300 bytes tasks/nasybullov-ai/lab_6/pic/12x12.png | Bin 0 -> 2671 bytes tasks/nasybullov-ai/lab_6/pic/5x5.png | Bin 0 -> 4261 bytes tasks/nasybullov-ai/lab_6/pic/8x8.png | Bin 0 -> 2390 bytes tasks/nasybullov-ai/lab_6/pic/tests.png | Bin 0 -> 19556 bytes 16 files changed, 1253 insertions(+) create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/.gitignore create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Alg1.cs create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Alg2.cs create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Controller.cs create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Form1.Designer.cs create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Form1.cs create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Form1.resx create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Lab6.csproj create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Lab6.sln create mode 100644 tasks/nasybullov-ai/lab_6/Lab6/Program.cs create mode 100644 tasks/nasybullov-ai/lab_6/README.md create mode 100644 tasks/nasybullov-ai/lab_6/pic/1.png create mode 100644 tasks/nasybullov-ai/lab_6/pic/12x12.png create mode 100644 tasks/nasybullov-ai/lab_6/pic/5x5.png create mode 100644 tasks/nasybullov-ai/lab_6/pic/8x8.png create mode 100644 tasks/nasybullov-ai/lab_6/pic/tests.png diff --git a/tasks/nasybullov-ai/lab_6/Lab6/.gitignore b/tasks/nasybullov-ai/lab_6/Lab6/.gitignore new file mode 100644 index 0000000..104b544 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Alg1.cs b/tasks/nasybullov-ai/lab_6/Lab6/Alg1.cs new file mode 100644 index 0000000..0b51bb2 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Alg1.cs @@ -0,0 +1,46 @@ +namespace Lab6 +{ + public class Alg1 + { + public int Begin(int[,] matrix) + { + return CalculateDeterminant(matrix); + } + + static int CalculateDeterminant(int[,] matrix) + { + int n = matrix.GetLength(0); + + if (n == 1) + { + return matrix[0, 0]; + } + + int determinant = 0; + + for (int j = 0; j < n; j++) + { + int[,] submatrix = new int[n - 1, n - 1]; + + for (int i = 1; i < n; i++) + { + for (int k = 0; k < n; k++) + { + if (k < j) + { + submatrix[i - 1, k] = matrix[i, k]; + } + else if (k > j) + { + submatrix[i - 1, k - 1] = matrix[i, k]; + } + } + } + + determinant += (int)Math.Pow(-1, j) * matrix[0, j] * CalculateDeterminant(submatrix); + } + + return determinant; + } + } +} diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Alg2.cs b/tasks/nasybullov-ai/lab_6/Lab6/Alg2.cs new file mode 100644 index 0000000..39f2c78 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Alg2.cs @@ -0,0 +1,90 @@ +using System.Diagnostics.CodeAnalysis; +using System.Drawing.Drawing2D; + +namespace Lab6 +{ + public class Alg2 + { + public double Begin(double[,] matrixA, int threadCount) + { + int size = matrixA.GetLength(0); + + if (size == 1) + { + return matrixA[0, 0]; + } + else if (size == 2) + { + return matrixA[0, 0] * matrixA[1, 1] - matrixA[0, 1] * matrixA[1, 0]; + } + else + { + double determinant = 0; + object lockObject = new object(); + + Parallel.For(0, size, new ParallelOptions { MaxDegreeOfParallelism = threadCount }, i => + { + double[,] subMatrix = GetSubMatrix(matrixA, i); + double subDeterminant = matrixA[0, i] * Determinant(subMatrix); + + lock (lockObject) + { + determinant += Math.Pow(-1, i) * subDeterminant; + } + }); + + return determinant; + } + } + + static double[,] GetSubMatrix(double[,] matrix, int columnIndex) + { + int size = matrix.GetLength(0); + double[,] subMatrix = new double[size - 1, size - 1]; + + for (int i = 1; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (j < columnIndex) + { + subMatrix[i - 1, j] = matrix[i, j]; + } + else if (j > columnIndex) + { + subMatrix[i - 1, j - 1] = matrix[i, j]; + } + } + } + + return subMatrix; + } + + static double Determinant(double[,] matrix) + { + int size = matrix.GetLength(0); + + if (size == 1) + { + return matrix[0, 0]; + } + else if (size == 2) + { + return matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0]; + } + else + { + double determinant = 0; + + for (int i = 0; i < size; i++) + { + double[,] subMatrix = GetSubMatrix(matrix, i); + + determinant += Math.Pow(-1, i) * matrix[0, i] * Determinant(subMatrix); + } + + return determinant; + } + } + } +} \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Controller.cs b/tasks/nasybullov-ai/lab_6/Lab6/Controller.cs new file mode 100644 index 0000000..ff3742c --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Controller.cs @@ -0,0 +1,95 @@ +using System.Drawing; + +namespace Lab6 +{ + public class Controller + { + public double[,] ConvertArray(int[,] intArray) + { + int rows = intArray.GetLength(0); + int cols = intArray.GetLength(1); + + double[,] doubleArray = new double[rows, cols]; + + for (int i = 0; i < rows; i++) + { + for (int j = 0; j < cols; j++) + { + doubleArray[i, j] = (double)intArray[i, j]; + } + } + + return doubleArray; + } + + public string PrintResultMatrix(int[,] result) + { + string resultString = ""; + + for (int i = 0; i < result.GetLength(0); i++) + { + for (int j = 0; j < result.GetLength(1); j++) + { + resultString += result[i, j]; + if (j != result.GetLength(1) - 1) + { + resultString += " "; + } + } + resultString += Environment.NewLine; + } + + return resultString; + } + + public int[,] GetMatrixFromTextbox(string inputText) + { + string[] lines = inputText.Split(Environment.NewLine); + + int numRows = lines.Length; + int numCol = lines[0].Split(' ').Length; + + int[,] matrix = new int[numRows, numCol]; + + for (int i = 0; i < numRows; i++) + { + string[] elements = lines[i].Split(' '); + + for (int j = 0; j < numCol; j++) + { + matrix[i, j] = int.Parse(elements[j]); + } + } + return matrix; + } + + public string GetTextFromFile(string filePath) + { + string text = ""; + + using (StreamReader sr = new StreamReader(filePath)) + { + text = sr.ReadToEnd(); + } + + return text; + } + + public int[,] GenerateNewMatrix(int count) + { + Random random = new Random(); + + int[,] matrix = new int[count, count]; + + for (int i = 0; i < count; i++) + { + for (int j = 0; j < count; j++) + { + matrix[i, j] = random.Next(1, 5); + } + } + + return matrix; + } + } +} diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Form1.Designer.cs b/tasks/nasybullov-ai/lab_6/Lab6/Form1.Designer.cs new file mode 100644 index 0000000..d351e98 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Form1.Designer.cs @@ -0,0 +1,288 @@ +namespace Lab6 +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBoxMatrix1 = new System.Windows.Forms.TextBox(); + this.textBoxResult = new System.Windows.Forms.TextBox(); + this.buttonAlg1 = new System.Windows.Forms.Button(); + this.buttonLoadMatrix1 = new System.Windows.Forms.Button(); + this.buttonAlg2 = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.label3 = new System.Windows.Forms.Label(); + this.labelResultTime = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.countStream = new System.Windows.Forms.NumericUpDown(); + this.buttonGenerateMatrix1 = new System.Windows.Forms.Button(); + this.label5 = new System.Windows.Forms.Label(); + this.genCountRowCol = new System.Windows.Forms.NumericUpDown(); + this.checkBoxIsTyping = new System.Windows.Forms.CheckBox(); + this.matrix1IsFull = new System.Windows.Forms.CheckBox(); + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.countStream)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.genCountRowCol)).BeginInit(); + this.SuspendLayout(); + // + // textBoxMatrix1 + // + this.textBoxMatrix1.Location = new System.Drawing.Point(12, 50); + this.textBoxMatrix1.Multiline = true; + this.textBoxMatrix1.Name = "textBoxMatrix1"; + this.textBoxMatrix1.Size = new System.Drawing.Size(258, 258); + this.textBoxMatrix1.TabIndex = 0; + // + // textBoxResult + // + this.textBoxResult.Location = new System.Drawing.Point(293, 50); + this.textBoxResult.Multiline = true; + this.textBoxResult.Name = "textBoxResult"; + this.textBoxResult.Size = new System.Drawing.Size(258, 40); + this.textBoxResult.TabIndex = 1; + // + // buttonAlg1 + // + this.buttonAlg1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.buttonAlg1.Location = new System.Drawing.Point(293, 188); + this.buttonAlg1.Name = "buttonAlg1"; + this.buttonAlg1.Size = new System.Drawing.Size(258, 40); + this.buttonAlg1.TabIndex = 2; + this.buttonAlg1.Text = "Обычный алгоритм"; + this.buttonAlg1.UseVisualStyleBackColor = true; + this.buttonAlg1.Click += new System.EventHandler(this.buttonAlg1_Click); + // + // buttonLoadMatrix1 + // + this.buttonLoadMatrix1.Location = new System.Drawing.Point(12, 12); + this.buttonLoadMatrix1.Name = "buttonLoadMatrix1"; + this.buttonLoadMatrix1.Size = new System.Drawing.Size(130, 32); + this.buttonLoadMatrix1.TabIndex = 6; + this.buttonLoadMatrix1.Text = "Загрузить из файла"; + this.buttonLoadMatrix1.UseVisualStyleBackColor = true; + this.buttonLoadMatrix1.Click += new System.EventHandler(this.buttonLoadMatrix1_Click); + // + // buttonAlg2 + // + this.buttonAlg2.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.buttonAlg2.Location = new System.Drawing.Point(293, 234); + this.buttonAlg2.Name = "buttonAlg2"; + this.buttonAlg2.Size = new System.Drawing.Size(258, 39); + this.buttonAlg2.TabIndex = 8; + this.buttonAlg2.Text = "Паралелльный алгоритм"; + this.buttonAlg2.UseVisualStyleBackColor = true; + this.buttonAlg2.Click += new System.EventHandler(this.buttonAlg2_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.label3.Location = new System.Drawing.Point(12, 340); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(111, 30); + this.label3.TabIndex = 9; + this.label3.Text = "Результат:"; + // + // labelResultTime + // + this.labelResultTime.AutoSize = true; + this.labelResultTime.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.labelResultTime.Location = new System.Drawing.Point(114, 340); + this.labelResultTime.Name = "labelResultTime"; + this.labelResultTime.Size = new System.Drawing.Size(0, 30); + this.labelResultTime.TabIndex = 10; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(293, 131); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(123, 15); + this.label4.TabIndex = 12; + this.label4.Text = "Количество потоков:"; + // + // countStream + // + this.countStream.Location = new System.Drawing.Point(467, 129); + this.countStream.Maximum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.countStream.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.countStream.Name = "countStream"; + this.countStream.Size = new System.Drawing.Size(66, 23); + this.countStream.TabIndex = 13; + this.countStream.Value = new decimal(new int[] { + 4, + 0, + 0, + 0}); + // + // buttonGenerateMatrix1 + // + this.buttonGenerateMatrix1.Location = new System.Drawing.Point(148, 12); + this.buttonGenerateMatrix1.Name = "buttonGenerateMatrix1"; + this.buttonGenerateMatrix1.Size = new System.Drawing.Size(122, 32); + this.buttonGenerateMatrix1.TabIndex = 14; + this.buttonGenerateMatrix1.Text = "Сгенерировать"; + this.buttonGenerateMatrix1.UseVisualStyleBackColor = true; + this.buttonGenerateMatrix1.Click += new System.EventHandler(this.buttonGenerateMatrix1_Click); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(293, 102); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(166, 15); + this.label5.TabIndex = 16; + this.label5.Text = "Размерность при генерации:"; + // + // genCountRowCol + // + this.genCountRowCol.Location = new System.Drawing.Point(467, 100); + this.genCountRowCol.Maximum = new decimal(new int[] { + 500, + 0, + 0, + 0}); + this.genCountRowCol.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.genCountRowCol.Name = "genCountRowCol"; + this.genCountRowCol.Size = new System.Drawing.Size(66, 23); + this.genCountRowCol.TabIndex = 17; + this.genCountRowCol.Value = new decimal(new int[] { + 3, + 0, + 0, + 0}); + // + // checkBoxIsTyping + // + this.checkBoxIsTyping.AutoSize = true; + this.checkBoxIsTyping.Checked = true; + this.checkBoxIsTyping.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxIsTyping.Location = new System.Drawing.Point(293, 163); + this.checkBoxIsTyping.Name = "checkBoxIsTyping"; + this.checkBoxIsTyping.Size = new System.Drawing.Size(152, 19); + this.checkBoxIsTyping.TabIndex = 18; + this.checkBoxIsTyping.Text = "Выводить все в textbox"; + this.checkBoxIsTyping.UseVisualStyleBackColor = true; + // + // matrix1IsFull + // + this.matrix1IsFull.AutoSize = true; + this.matrix1IsFull.Location = new System.Drawing.Point(12, 314); + this.matrix1IsFull.Name = "matrix1IsFull"; + this.matrix1IsFull.Size = new System.Drawing.Size(86, 19); + this.matrix1IsFull.TabIndex = 19; + this.matrix1IsFull.Text = "Заполнена"; + this.matrix1IsFull.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.button1.Location = new System.Drawing.Point(293, 297); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(258, 46); + this.button1.TabIndex = 22; + this.button1.Text = "Очистить матрицы"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.label1.Location = new System.Drawing.Point(293, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(240, 30); + this.label1.TabIndex = 23; + this.label1.Text = "Детерминант матрицы:"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(564, 421); + this.Controls.Add(this.label1); + this.Controls.Add(this.button1); + this.Controls.Add(this.matrix1IsFull); + this.Controls.Add(this.checkBoxIsTyping); + this.Controls.Add(this.genCountRowCol); + this.Controls.Add(this.label5); + this.Controls.Add(this.buttonGenerateMatrix1); + this.Controls.Add(this.countStream); + this.Controls.Add(this.label4); + this.Controls.Add(this.labelResultTime); + this.Controls.Add(this.label3); + this.Controls.Add(this.buttonAlg2); + this.Controls.Add(this.buttonLoadMatrix1); + this.Controls.Add(this.buttonAlg1); + this.Controls.Add(this.textBoxResult); + this.Controls.Add(this.textBoxMatrix1); + this.Name = "Form1"; + this.Text = "Перемножение матриц: Мытарин Е.С. ИСЭбд-41"; + ((System.ComponentModel.ISupportInitialize)(this.countStream)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.genCountRowCol)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private TextBox textBoxMatrix1; + private TextBox textBoxResult; + private Button buttonAlg1; + private Button buttonLoadMatrix1; + private Button buttonAlg2; + private OpenFileDialog openFileDialog1; + private Label label3; + private Label labelResultTime; + private Label label4; + private NumericUpDown countStream; + private Button buttonGenerateMatrix1; + private Label label5; + private NumericUpDown genCountRowCol; + private CheckBox checkBoxIsTyping; + private CheckBox matrix1IsFull; + private Button button1; + private Label label1; + } +} \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Form1.cs b/tasks/nasybullov-ai/lab_6/Lab6/Form1.cs new file mode 100644 index 0000000..95a7f86 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Form1.cs @@ -0,0 +1,91 @@ +using System.Diagnostics; + +namespace Lab6 +{ + public partial class Form1 : Form + { + public Controller service; + public Alg1 Alg1; + public Alg2 Alg2; + public Stopwatch stopwatch; + public int[,] matrixA; + + public Form1() + { + InitializeComponent(); + this.service = new Controller(); + this.Alg1 = new Alg1(); + this.Alg2 = new Alg2(); + this.stopwatch = new Stopwatch(); + } + + private void buttonAlg1_Click(object sender, EventArgs e) + { + try + { + stopwatch.Start(); + int result = Alg1.Begin(matrixA); + stopwatch.Stop(); + + labelResultTime.Text = "" + stopwatch.Elapsed; + textBoxResult.Text = Convert.ToString(result); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + stopwatch.Reset(); + } + + private void buttonAlg2_Click(object sender, EventArgs e) + { + try + { + double[,] doubleMatrix = service.ConvertArray(matrixA); + + stopwatch.Start(); + textBoxResult.Text = Convert.ToString(Alg2.Begin(doubleMatrix, (int)countStream.Value)); + stopwatch.Stop(); + + labelResultTime.Text = "" + stopwatch.Elapsed; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + stopwatch.Reset(); + } + + private void buttonLoadMatrix1_Click(object sender, EventArgs e) + { + openFileDialog1.ShowDialog(); + string filePath = openFileDialog1.FileName; + string result = service.GetTextFromFile(filePath); + if (checkBoxIsTyping.Checked) + { + textBoxMatrix1.Text = result; + } + matrixA = service.GetMatrixFromTextbox(result); + matrix1IsFull.Checked = true; + } + + private void buttonGenerateMatrix1_Click(object sender, EventArgs e) + { + matrixA = service.GenerateNewMatrix((int)genCountRowCol.Value); + matrix1IsFull.Checked = true; + if (checkBoxIsTyping.Checked) + { + textBoxMatrix1.Text = service.PrintResultMatrix(matrixA); + } + } + + private void button1_Click(object sender, EventArgs e) + { + textBoxMatrix1.Text = ""; + textBoxResult.Text = ""; + matrixA = null; + + matrix1IsFull.Checked = false; + } + } +} \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Form1.resx b/tasks/nasybullov-ai/lab_6/Lab6/Form1.resx new file mode 100644 index 0000000..85e5d7f --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Form1.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 7, 19 + + \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Lab6.csproj b/tasks/nasybullov-ai/lab_6/Lab6/Lab6.csproj new file mode 100644 index 0000000..b57c89e --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Lab6.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net6.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Lab6.sln b/tasks/nasybullov-ai/lab_6/Lab6/Lab6.sln new file mode 100644 index 0000000..5dfa3f4 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Lab6.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32811.315 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab6", "Lab6.csproj", "{5E467820-7298-4466-AD82-CEDEB780CA68}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5E467820-7298-4466-AD82-CEDEB780CA68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E467820-7298-4466-AD82-CEDEB780CA68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E467820-7298-4466-AD82-CEDEB780CA68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E467820-7298-4466-AD82-CEDEB780CA68}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7933D480-E7B1-4658-8726-83CCD3BED00D} + EndGlobalSection +EndGlobal diff --git a/tasks/nasybullov-ai/lab_6/Lab6/Program.cs b/tasks/nasybullov-ai/lab_6/Lab6/Program.cs new file mode 100644 index 0000000..59d7697 --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/Lab6/Program.cs @@ -0,0 +1,17 @@ +namespace Lab6 +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/README.md b/tasks/nasybullov-ai/lab_6/README.md new file mode 100644 index 0000000..1f9c0ce --- /dev/null +++ b/tasks/nasybullov-ai/lab_6/README.md @@ -0,0 +1,43 @@ +# Отчет по лабораторной работе №6 + +Выполнил студент гр. ИСЭбд-41 Мытарин Е.С. + +## Создание приложения + +Выбрал язык C#, Windows Forms. + +Приложение имеет поле ввода матрицы, в которое можно через пробел вносить элементы матрицы. При необходимости можно сгенерировать матрицу указав её размерность или загрузить из файла. Если размерность матрицы очень большая, то рекомендуется убрать флажок "выводить все в textbox", чтобы не нагружать приложение, и не выводить элементы матрицы в текстовое поле. При необходимости можно очистить матрицу и определитель. Количество потоков в параллельном алгоритме регулируется в соответствующем поле. + +Попробуем запустить обычный и паралелльный алгоритмы на матрицах 3х3 и зафиксировать результат выполнения по времени. + +![](pic/1.png) + +В результате обычный алгоритм выполнился за 0.0004319 секунды, в то время как паралелльный выполнился за 0.0206593 секунды. + +## Бенчмарки + +Протестируем обычный и параллельный алгоритм определение детерминанта на различной размерности матрицы. + +В ходе экспериментов было установлено, что обработка матрицы размеров больше 12х12 занимает слишком много времени в обычном алгоритме, поэтому для тестирования возьмем матрицы 5х5, 8х8 и 12х2. + +Сверху отображен результат обычного алгоритма, снизу паралелльного. + +Матрица 5х5 + +![](pic/5x5.png) + +Матрицы 8x8 + +![](pic/8x8.png) + +Матрицы 12х12 + +![](pic/12x12.png) + +Сравнение обработки матрицы 12х12 на различном количестве потоков паралельного алгоритма. + +![](pic/tests.png) + +Вывод: Параллельный алгоритм работает быстрее только при наличии большого количества операций. Если операций не так много, то обычный алгоритм справляется быстрее. + +Также была обнаружено оптимальное количество потоков для лучшей работы обработки матриц 12x12 - 7 потоков. \ No newline at end of file diff --git a/tasks/nasybullov-ai/lab_6/pic/1.png b/tasks/nasybullov-ai/lab_6/pic/1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba467c5a3d6814c428351b3b47d611af04fb33a GIT binary patch literal 23300 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 literal 0 HcmV?d00001 diff --git a/tasks/nasybullov-ai/lab_6/pic/12x12.png b/tasks/nasybullov-ai/lab_6/pic/12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..6abecd83e4c38084a8656b3916465b1873e7e182 GIT binary patch literal 2671 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 Mb&L>|FvqBW1Ed1vXaE2J literal 0 HcmV?d00001 diff --git a/tasks/nasybullov-ai/lab_6/pic/5x5.png b/tasks/nasybullov-ai/lab_6/pic/5x5.png new file mode 100644 index 0000000000000000000000000000000000000000..4367fd01fe2de348e57fc9b7e2c16c2361497f1f GIT binary patch literal 4261 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 DYpg~l literal 0 HcmV?d00001 diff --git a/tasks/nasybullov-ai/lab_6/pic/8x8.png b/tasks/nasybullov-ai/lab_6/pic/8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..3784f44f0629a154c970126ee3ea18edf84b9951 GIT binary patch literal 2390 zcma*pc{tQ-8wc>8eGq0!)a2;QBxD(~6&jAo#Ef0m7_yJ0nHuY$!C0D7mLkd;rf8uu zTqYUH8lo5}%Na69woypdc<1fBf4uMe*ZJdlp8LM8=db&^zMt#9YHw>HB>|NH06+?3 zY3>LB0`mMC0}|xl`KZ;W{6`?%(EjC=_H=dgriiH(pbic{WQ2c6^}B zbPgU;h}CRQ5z~yV!@n)AiFH?;rdEh%7=t!1cj$?7?ZUa%S5}d!Zr~vgO5IzJhbY;<=y7B&WxtdaYe46G35P z+vhhZl4w9<_Lm@40(CsI(nwO-i+NxtDzC$uZNG8kEWGGvXhyhG&I3r9=)QQ$_-6t}KiQ zy?wjp4wJn*2^_I#RlzZk{$D&m51xpQUQYHoF_d#~ZCLy4F^>%{&ykif58nxMnZc#a zf7L6@bCgSeOh2V&^HOFbBP%|39(P3l;+Vbt!5HU-ra#HBdg;3*KMY)o5sZ9NTF!}^ zo7{VloOA3Fy3x^sM5_mvs)bKGKwhLUL%GJV`sw#&1<;cO)yg(6<7wZbeejWe;z5zw zX~pg*x4p)_uAm#&7wN;k)a#j2v-$nM>lA9UpZHZJO{Gz-BLbv8Or(H=+i0~fEX$(} zh(@s71m?@lFvE^yTR$_1$;-IkoD?_+6KijXxaKUW>8HWj@35#Og2BcOFfCXs zh?_$nu^HV(Q1j2Go>{J}KF9!~FR^-v06Czo4y&lhCrs%nER-cAv$cEV64gm`#Ajt_ zbFI)t=juW9q?tq_v1ONo-saM`i)4|)tfQ_oaOQZrq8RW^vw=M*05AjrM?eO{_Ef8^rV#%HWd$RyV#j$))zo7*I=InIsNoHX>!N8Vw| zDMTSYZx;MB_Q(cwbaSZZ2kBR6So7@jalx6Dpq_Y#2RX++Thi_bZmdL;SA@6HTjKK) zKB8T&zc9?a=)v`^&$FwkW}XWd>eLjDOpKY?;rUge)qT58`%5VP+|GB`igd`*sWhJt z=x`M3L<$F6EQty8Dk*D{wZb$Z*xuA)w$HP4szcmZSbxQ`VUx`gxwiMJB`1CSX?19; zV$4V%T=wbcD7!mAcAB*rtk5pCFXY6T|IpyBT|BY(rFm--_$n$VAS{q+IPs)dm;)*Y?C+^U^3aqPOf)mb@?tUWpAt?)HZGUc*>juUy-_l zxrf&e9y(#_X3~H1(CNykcdiHj=4wm4JElQoU7_}HNEcqWhd;w>p7W@zyI)!nBzwiU zl&(@RJ6GXNnPzB5VN!#~FKn_)SUF|YusKIk*OZn6NM^G+qg3JDl=t8vtzqsXL=u4Ib~<@kccRlYTs!+pB#m=VxEt4}6l zRmlv!B@?bOYI*ia^bK~)CDT`3r*4Bqn4V;sHLT@N+cO#_I6THroZb^$Lel4X_f(jy z236UwSI@05ZFU4(Af(w>kRGxtR^M#bk+pG{Au23rh*t5D`TmjmT7l~t*& zU+SBrhlkpuwaSf>|DPKIb&_(^j5v<1fH|fn;-l*dKceYj#FhK|95?cM%KC5kotn{; zt5|4l95yR*m^FjwaGz%x#Y-f8&9VKclEW8HS@rBVb*-GBB$ciDjcEKL!U)rU2j?_+ zk2YH3WgRO+M!?q)qZbO^+EBsw&p?*z5x?Oc@>rEI5p)Z5PX65EX!Dz65Y9%ndu|=K zG^Mvxes_tg`IF!p;aT!@Xv^C#H!WX{aZ5*iuv{rOypfi*E7EdF1RI!;@-22zrUj(y z`hGvY74OVYHDFjhaI1S~)V7R+Fb*0JFoW3T@2y5~8XaCw zcQTP=e(w4&+#0cKRmz>heJ9fD)qvq?UtF7w9wkU@;-=@r^w-I7Y z6mNz literal 0 HcmV?d00001 diff --git a/tasks/nasybullov-ai/lab_6/pic/tests.png b/tasks/nasybullov-ai/lab_6/pic/tests.png new file mode 100644 index 0000000000000000000000000000000000000000..3f223705bfafa4d9b81b6adc85e504beb2c4a170 GIT binary patch literal 19556 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