From eb9f7c6c67e47c152d27d08111b37c8636f57985 Mon Sep 17 00:00:00 2001 From: Zastian Pretorius Date: Tue, 2 Aug 2022 12:42:49 +0100 Subject: [PATCH] Lets gooooo --- .gitattributes | 63 ++ .gitignore | 365 ++++++++- BusinessLogic/Algorithms/Algorithm.cs | 15 + .../Algorithms/BranchAndBoundSimplex.cs | 293 +++++++ BusinessLogic/Algorithms/CuttingPlane.cs | 203 +++++ BusinessLogic/Algorithms/DualSimplex.cs | 223 ++++++ BusinessLogic/Algorithms/PrimalSimplex.cs | 212 +++++ BusinessLogic/Algorithms/TwoPhaseSimplex.cs | 346 ++++++++ BusinessLogic/BinaryTree.cs | 69 ++ BusinessLogic/BinaryTreeNode.cs | 15 + BusinessLogic/BusinessLogic.csproj | 67 ++ BusinessLogic/ListCloner.cs | 57 ++ BusinessLogic/ModelSolver.cs | 25 + BusinessLogic/Properties/AssemblyInfo.cs | 36 + DataAccess/DataAccess.csproj | 77 ++ DataAccess/ModelReader.cs | 164 ++++ DataAccess/Properties/AssemblyInfo.cs | 36 + DataAccess/acme.txt | 5 + DataAccess/branch.txt | 4 + DataAccess/cut.txt | 4 + DataAccess/farmer.txt | 5 + DataAccess/korean.txt | 4 + DataAccess/limpopo.txt | 6 + DataAccess/santa.txt | 5 + LPR381_Project.sln | 49 ++ LPR381_Project/App.config | 6 + LPR381_Project/Program.cs | 20 + LPR381_Project/Properties/AssemblyInfo.cs | 36 + LPR381_Project/Solve.csproj | 67 ++ Models/Common.csproj | 56 ++ Models/Constraint.cs | 15 + Models/CustomException.cs | 20 + Models/DecisionVariable.cs | 13 + Models/InequalitySign.cs | 15 + Models/InfeasibleException.cs | 20 + Models/Model.cs | 29 + Models/ObjectiveFunction.cs | 13 + Models/ProblemType.cs | 14 + Models/Properties/AssemblyInfo.cs | 36 + Models/SignRestriction.cs | 17 + Presentation/MainMenu.cs | 180 +++++ Presentation/ModelWriter.cs | 121 +++ Presentation/Presentation.csproj | 70 ++ Presentation/Properties/AssemblyInfo.cs | 36 + Presentation/SolvedModelPrinter.cs | 112 +++ Presentation/packages.config | 4 + Program.cs | 16 - chess.cs | 65 -- dualSimplex.cs | 223 ------ file.cs | 81 -- input.txt | 8 - lpr381.csproj | 14 - ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 - obj/Debug/net6.0/apphost | Bin 77184 -> 0 bytes obj/Debug/net6.0/lpr381.AssemblyInfo.cs | 22 - .../net6.0/lpr381.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 10 - obj/Debug/net6.0/lpr381.GlobalUsings.g.cs | 8 - obj/Debug/net6.0/lpr381.assets.cache | Bin 2532 -> 0 bytes .../lpr381.csproj.AssemblyReference.cache | Bin 71141 -> 0 bytes obj/Debug/net6.0/lpr381.csproj.CopyComplete | 0 .../lpr381.csproj.CoreCompileInputs.cache | 1 - .../net6.0/lpr381.csproj.FileListAbsolute.txt | 17 - obj/Debug/net6.0/lpr381.dll | Bin 18944 -> 0 bytes .../net6.0/lpr381.genruntimeconfig.cache | 1 - obj/Debug/net6.0/lpr381.pdb | Bin 21480 -> 0 bytes obj/Debug/net6.0/ref/lpr381.dll | Bin 6656 -> 0 bytes ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 - obj/Release/net6.0/apphost | Bin 77184 -> 0 bytes obj/Release/net6.0/lpr381.AssemblyInfo.cs | 22 - .../net6.0/lpr381.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 10 - obj/Release/net6.0/lpr381.GlobalUsings.g.cs | 8 - obj/Release/net6.0/lpr381.assets.cache | Bin 2532 -> 0 bytes .../lpr381.csproj.AssemblyReference.cache | Bin 70896 -> 0 bytes .../lpr381.csproj.CoreCompileInputs.cache | 1 - .../net6.0/lpr381.csproj.FileListAbsolute.txt | 15 - obj/Release/net6.0/lpr381.dll | Bin 4608 -> 0 bytes .../net6.0/lpr381.genruntimeconfig.cache | 1 - obj/Release/net6.0/lpr381.pdb | Bin 10288 -> 0 bytes obj/Release/net6.0/ref/lpr381.dll | Bin 5120 -> 0 bytes obj/lpr381.csproj.nuget.dgspec.json | 72 -- obj/lpr381.csproj.nuget.g.props | 15 - obj/lpr381.csproj.nuget.g.targets | 2 - obj/project.assets.json | 741 ------------------ obj/project.nuget.cache | 20 - simplex.cs | 249 ------ twoPhaseSimplex.cs | 432 ---------- 88 files changed, 3246 insertions(+), 2066 deletions(-) create mode 100644 .gitattributes create mode 100644 BusinessLogic/Algorithms/Algorithm.cs create mode 100644 BusinessLogic/Algorithms/BranchAndBoundSimplex.cs create mode 100644 BusinessLogic/Algorithms/CuttingPlane.cs create mode 100644 BusinessLogic/Algorithms/DualSimplex.cs create mode 100644 BusinessLogic/Algorithms/PrimalSimplex.cs create mode 100644 BusinessLogic/Algorithms/TwoPhaseSimplex.cs create mode 100644 BusinessLogic/BinaryTree.cs create mode 100644 BusinessLogic/BinaryTreeNode.cs create mode 100644 BusinessLogic/BusinessLogic.csproj create mode 100644 BusinessLogic/ListCloner.cs create mode 100644 BusinessLogic/ModelSolver.cs create mode 100644 BusinessLogic/Properties/AssemblyInfo.cs create mode 100644 DataAccess/DataAccess.csproj create mode 100644 DataAccess/ModelReader.cs create mode 100644 DataAccess/Properties/AssemblyInfo.cs create mode 100644 DataAccess/acme.txt create mode 100644 DataAccess/branch.txt create mode 100644 DataAccess/cut.txt create mode 100644 DataAccess/farmer.txt create mode 100644 DataAccess/korean.txt create mode 100644 DataAccess/limpopo.txt create mode 100644 DataAccess/santa.txt create mode 100644 LPR381_Project.sln create mode 100644 LPR381_Project/App.config create mode 100644 LPR381_Project/Program.cs create mode 100644 LPR381_Project/Properties/AssemblyInfo.cs create mode 100644 LPR381_Project/Solve.csproj create mode 100644 Models/Common.csproj create mode 100644 Models/Constraint.cs create mode 100644 Models/CustomException.cs create mode 100644 Models/DecisionVariable.cs create mode 100644 Models/InequalitySign.cs create mode 100644 Models/InfeasibleException.cs create mode 100644 Models/Model.cs create mode 100644 Models/ObjectiveFunction.cs create mode 100644 Models/ProblemType.cs create mode 100644 Models/Properties/AssemblyInfo.cs create mode 100644 Models/SignRestriction.cs create mode 100644 Presentation/MainMenu.cs create mode 100644 Presentation/ModelWriter.cs create mode 100644 Presentation/Presentation.csproj create mode 100644 Presentation/Properties/AssemblyInfo.cs create mode 100644 Presentation/SolvedModelPrinter.cs create mode 100644 Presentation/packages.config delete mode 100644 Program.cs delete mode 100644 chess.cs delete mode 100644 dualSimplex.cs delete mode 100644 file.cs delete mode 100644 input.txt delete mode 100644 lpr381.csproj delete mode 100644 obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs delete mode 100755 obj/Debug/net6.0/apphost delete mode 100644 obj/Debug/net6.0/lpr381.AssemblyInfo.cs delete mode 100644 obj/Debug/net6.0/lpr381.AssemblyInfoInputs.cache delete mode 100644 obj/Debug/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 obj/Debug/net6.0/lpr381.GlobalUsings.g.cs delete mode 100644 obj/Debug/net6.0/lpr381.assets.cache delete mode 100644 obj/Debug/net6.0/lpr381.csproj.AssemblyReference.cache delete mode 100644 obj/Debug/net6.0/lpr381.csproj.CopyComplete delete mode 100644 obj/Debug/net6.0/lpr381.csproj.CoreCompileInputs.cache delete mode 100644 obj/Debug/net6.0/lpr381.csproj.FileListAbsolute.txt delete mode 100644 obj/Debug/net6.0/lpr381.dll delete mode 100644 obj/Debug/net6.0/lpr381.genruntimeconfig.cache delete mode 100644 obj/Debug/net6.0/lpr381.pdb delete mode 100644 obj/Debug/net6.0/ref/lpr381.dll delete mode 100644 obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs delete mode 100755 obj/Release/net6.0/apphost delete mode 100644 obj/Release/net6.0/lpr381.AssemblyInfo.cs delete mode 100644 obj/Release/net6.0/lpr381.AssemblyInfoInputs.cache delete mode 100644 obj/Release/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 obj/Release/net6.0/lpr381.GlobalUsings.g.cs delete mode 100644 obj/Release/net6.0/lpr381.assets.cache delete mode 100644 obj/Release/net6.0/lpr381.csproj.AssemblyReference.cache delete mode 100644 obj/Release/net6.0/lpr381.csproj.CoreCompileInputs.cache delete mode 100644 obj/Release/net6.0/lpr381.csproj.FileListAbsolute.txt delete mode 100644 obj/Release/net6.0/lpr381.dll delete mode 100644 obj/Release/net6.0/lpr381.genruntimeconfig.cache delete mode 100644 obj/Release/net6.0/lpr381.pdb delete mode 100644 obj/Release/net6.0/ref/lpr381.dll delete mode 100644 obj/lpr381.csproj.nuget.dgspec.json delete mode 100644 obj/lpr381.csproj.nuget.g.props delete mode 100644 obj/lpr381.csproj.nuget.g.targets delete mode 100644 obj/project.assets.json delete mode 100644 obj/project.nuget.cache delete mode 100644 simplex.cs delete mode 100644 twoPhaseSimplex.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 2949627..9491a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,363 @@ -/.vscode -/bin +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# 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/ +[Oo]ut/ +[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 Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# 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 +*.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 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/ + +# 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 \ No newline at end of file diff --git a/BusinessLogic/Algorithms/Algorithm.cs b/BusinessLogic/Algorithms/Algorithm.cs new file mode 100644 index 0000000..20a1452 --- /dev/null +++ b/BusinessLogic/Algorithms/Algorithm.cs @@ -0,0 +1,15 @@ +using Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public abstract class Algorithm + { + public abstract void PutModelInCanonicalForm(Model model); + public abstract void Solve(Model model); + } +} diff --git a/BusinessLogic/Algorithms/BranchAndBoundSimplex.cs b/BusinessLogic/Algorithms/BranchAndBoundSimplex.cs new file mode 100644 index 0000000..65d70e9 --- /dev/null +++ b/BusinessLogic/Algorithms/BranchAndBoundSimplex.cs @@ -0,0 +1,293 @@ +using Common; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public class BranchAndBoundSimplex : Algorithm + { + private Model model; + public BinaryTree Results { get; set; } = new BinaryTree(); + private DualSimplex dualSimplex = new DualSimplex(); + private List>> candidateSolutions = new List>>(); + + public override void PutModelInCanonicalForm(Model model) + { + dualSimplex.PutModelInCanonicalForm(model); + Results.Add(model.Result); + } + + public override void Solve(Model model) + { + this.model = model; + + int level = 1; + while (level <= Results.GetHeight(Results.Root)) + { + SolveCurrentLevel(Results.Root, level); + level++; + } + } + + private void SolveCurrentLevel(BinaryTreeNode root, int level) + { + if (root == null) + return; + + if (level == 1) + { + try + { + Solve(root); + Branch(root); + } + catch (InfeasibleException) + { + return; + } + } + else if (level > 1) + { + SolveCurrentLevel(root.LeftNode, level - 1); + SolveCurrentLevel(root.RightNode, level - 1); + } + } + + public List> GetBestCandidate() + { + double bestRHS = candidateSolutions[0][0][candidateSolutions[0][0].Count - 1]; + List> bestSolution = candidateSolutions[0]; + + for (int i = 1; i < candidateSolutions.Count; i++) + { + if (model.ProblemType == ProblemType.Maximization) + { + if (candidateSolutions[i][0][candidateSolutions[i][0].Count - 1] > bestRHS) + { + bestRHS = candidateSolutions[i][0][candidateSolutions[i][0].Count - 1]; + bestSolution = candidateSolutions[i]; + } + } + else + { + if (candidateSolutions[i][0][candidateSolutions[i][0].Count - 1] < bestRHS) + { + bestRHS = candidateSolutions[i][0][candidateSolutions[i][0].Count - 1]; + bestSolution = candidateSolutions[i]; + } + } + } + + return bestSolution; + } + + private void Solve(BinaryTreeNode root) + { + var model = new Model() { ProblemType = this.model.ProblemType, Result = root.Data }; + dualSimplex.Solve(model); + } + + private void Branch(BinaryTreeNode root) + { + if (CanBranch(root).Count == 0) + { + candidateSolutions.Add(root.Data[root.Data.Count - 1]); + } + else + { + // Get the variable we need to branch on + int branchVariableIndex = GetBranchVariable(root.Data[root.Data.Count - 1], CanBranch(root)); + // Add the new constraints to the old table and add that resulting table to the binary tree + AddSubProblems(root, branchVariableIndex); + } + } + + private void AddSubProblems(BinaryTreeNode root, int branchVariableIndex) + { + var table = root.Data[root.Data.Count - 1]; + double rhs = GetRhsOfVariable(branchVariableIndex, table); + + int constraintOneRhs; + int constraintTwoRhs; + + constraintOneRhs = (int)Math.Truncate(rhs); + constraintTwoRhs = constraintOneRhs + 1; + + var subProblemOneTable = ListCloner.CloneList(table); + var subProblemTwoTable = ListCloner.CloneList(table); + + subProblemOneTable.Add(new List()); + subProblemTwoTable.Add(new List()); + + for (int i = 0; i < subProblemOneTable[0].Count - 1; i++) + { + if (i == branchVariableIndex) + { + subProblemOneTable[subProblemOneTable.Count - 1].Add(1); + subProblemTwoTable[subProblemTwoTable.Count - 1].Add(-1); + } + else + { + subProblemOneTable[subProblemOneTable.Count - 1].Add(0); + subProblemTwoTable[subProblemTwoTable.Count - 1].Add(0); + } + } + + subProblemOneTable[subProblemOneTable.Count - 1].Add(constraintOneRhs); + subProblemTwoTable[subProblemTwoTable.Count - 1].Add(constraintTwoRhs * -1); + + for (int i = 0; i < subProblemOneTable.Count; i++) + { + var tempOne = subProblemOneTable[i][subProblemOneTable[i].Count - 1]; + var tempTwo = subProblemTwoTable[i][subProblemTwoTable[i].Count - 1]; + + if (i == subProblemOneTable.Count - 1) + { + subProblemOneTable[i][subProblemOneTable[i].Count - 1] = 1; + subProblemTwoTable[i][subProblemTwoTable[i].Count - 1] = 1; + } + else + { + subProblemOneTable[i][subProblemOneTable[i].Count - 1] = 0; + subProblemTwoTable[i][subProblemTwoTable[i].Count - 1] = 0; + } + + subProblemOneTable[i].Add(tempOne); + subProblemTwoTable[i].Add(tempTwo); + } + + int subProblemBasicRow = GetBasicRow(table, branchVariableIndex); + + for (int i = 0; i < subProblemOneTable[subProblemBasicRow].Count; i++) + { + subProblemOneTable[subProblemOneTable.Count - 1][i] -= subProblemOneTable[subProblemBasicRow][i]; + subProblemTwoTable[subProblemTwoTable.Count - 1][i] += subProblemTwoTable[subProblemBasicRow][i]; + } + + Results.Add(new List>>() { subProblemOneTable }, root.Data); + Results.Add(new List>>() { subProblemTwoTable }, root.Data); + } + + private int GetBasicRow(List> table, int branchVariableIndex) + { + int basicRow = -1; + + for (int i = 1; i < table.Count; i++) + { + if (table[i][branchVariableIndex] == 1) + { + basicRow = i; + break; + } + } + + return basicRow; + } + + private int GetBranchVariable(List> table, List intBinVarIndexes) + { + if (intBinVarIndexes.Count == 1) + return intBinVarIndexes[0]; + + int branchVariableIndex = -1; + decimal smallestFractionalPart = 1; + + foreach (var intBinVar in intBinVarIndexes) + { + var rhs = (Decimal)GetRhsOfVariable(intBinVar, table); + decimal fractionalPart = rhs - Math.Truncate(rhs); + if (Math.Abs(0.5m - fractionalPart) < smallestFractionalPart) + { + smallestFractionalPart = Math.Abs(0.5m - fractionalPart); + branchVariableIndex = intBinVar; + } + } + + return branchVariableIndex; + } + + private List CanBranch(BinaryTreeNode root) + { + var intBinVarIndexes = new List(); + var indexesToDiscard = new List(); + + for (int i = 0; i < model.SignRestrictions.Count; i++) + { + if (model.SignRestrictions[i] == SignRestriction.Integer || model.SignRestrictions[i] == SignRestriction.Binary) + { + intBinVarIndexes.Add(i); + } + } + + + var table = root.Data[root.Data.Count - 1]; + + foreach (var intBinVar in intBinVarIndexes) + { + + if (!IsVariableBasic(intBinVar, table)) + { + indexesToDiscard.Add(intBinVar); + } + + else + { + double rhs = GetRhsOfVariable(intBinVar, table); + + if (rhs - Math.Truncate(rhs) < 0.00001) + { + indexesToDiscard.Add(intBinVar); + } + } + } + + intBinVarIndexes.RemoveAll(v => indexesToDiscard.Contains(v) == true); + + return intBinVarIndexes; + } + + private double GetRhsOfVariable(int intBinVar, List> table) + { + if (!IsVariableBasic(intBinVar, table)) + return 0; + + double rhs = 0; + + for (int i = 1; i < table.Count; i++) + { + if (table[i][intBinVar] == 1) + { + rhs = table[i][table[i].Count - 1]; + break; + } + } + + return rhs; + } + + private bool IsVariableBasic(int intBinVar, List> table) + { + bool isBasic = true; + + for (int i = 0; i < table.Count; i++) + { + int numberOfOnes = 0; + + if (table[i][intBinVar] == 1) + numberOfOnes++; + + if ((table[i][intBinVar] != 0 && table[i][intBinVar] != 1) || numberOfOnes > 1) + { + isBasic = false; + break; + } + } + + return isBasic; + } + } +} diff --git a/BusinessLogic/Algorithms/CuttingPlane.cs b/BusinessLogic/Algorithms/CuttingPlane.cs new file mode 100644 index 0000000..7279097 --- /dev/null +++ b/BusinessLogic/Algorithms/CuttingPlane.cs @@ -0,0 +1,203 @@ +using Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public class CuttingPlane : Algorithm + { + + + private DualSimplex dualSimplex = new DualSimplex(); + + public override void PutModelInCanonicalForm(Model model) + { + dualSimplex.PutModelInCanonicalForm(model); + + dualSimplex.Solve(model); + } + + public override void Solve(Model model) + { + while (CanCut(model).Count > 0) + { + Cut(model); + dualSimplex.Solve(model); + } + } + + private void Cut(Model model) + { + var table = model.Result[model.Result.Count - 1]; + + + int cutVariableIndex = GetCutVariable(table, CanCut(model)); + + + int basicRow = GetBasicRow(table, cutVariableIndex); + + List cutConstraint = GetCutConstraint(table, basicRow); + + var newTable = ListCloner.CloneList(table); + + newTable.Add(cutConstraint); + + + for (int i = 0; i < newTable.Count; i++) + { + if (i == newTable.Count - 1) + { + newTable[i].Insert(newTable[i].Count - 1, 1); + } + else + { + newTable[i].Insert(newTable[i].Count - 1, 0); + } + } + + model.Result.Add(newTable); + } + + private List GetCutConstraint(List> table, int basicRow) + { + List cutConstraint = new List(); + + for (int i = 0; i < table[basicRow].Count; i++) + { + + if (table[basicRow][i] == Math.Truncate(table[basicRow][i])) + { + cutConstraint.Add(0); + } + else + { + + double fractionalPart = Math.Abs(Math.Floor(table[basicRow][i]) - table[basicRow][i]); + cutConstraint.Add(-1 * fractionalPart); + } + } + + return cutConstraint; + } + + private List CanCut(Model model) + { + List intBinVarIndexes = new List(); + List indexesToDiscard = new List(); + var lastTable = model.Result[model.Result.Count - 1]; + + for (int i = 0; i < model.SignRestrictions.Count; i++) + { + if (model.SignRestrictions[i] == SignRestriction.Integer || model.SignRestrictions[i] == SignRestriction.Binary) + { + intBinVarIndexes.Add(i); + } + } + + + foreach (var intBinVar in intBinVarIndexes) + { + + if (!IsVariableBasic(intBinVar, lastTable)) + { + indexesToDiscard.Add(intBinVar); + } + + else + { + double rhs = GetRhsOfVariable(intBinVar, lastTable); + + if (rhs - Math.Truncate(rhs) < 0.00001) + { + indexesToDiscard.Add(intBinVar); + } + } + } + + intBinVarIndexes.RemoveAll(v => indexesToDiscard.Contains(v) == true); + + return intBinVarIndexes; + } + + private double GetRhsOfVariable(int intBinVar, List> table) + { + if (!IsVariableBasic(intBinVar, table)) + return 0; + + double rhs = 0; + + for (int i = 1; i < table.Count; i++) + { + if (table[i][intBinVar] == 1) + { + rhs = table[i][table[i].Count - 1]; + break; + } + } + + return rhs; + } + + private bool IsVariableBasic(int intBinVar, List> table) + { + bool isBasic = true; + + for (int i = 0; i < table.Count; i++) + { + int numberOfOnes = 0; + + if (table[i][intBinVar] == 1) + numberOfOnes++; + + if ((table[i][intBinVar] != 0 && table[i][intBinVar] != 1) || numberOfOnes > 1) + { + isBasic = false; + break; + } + } + + return isBasic; + } + + private int GetCutVariable(List> table, List intBinVarIndexes) + { + if (intBinVarIndexes.Count == 1) + return intBinVarIndexes[0]; + + int branchVariableIndex = -1; + decimal smallestFractionalPart = 1; + + foreach (var intBinVar in intBinVarIndexes) + { + var rhs = (Decimal)GetRhsOfVariable(intBinVar, table); + decimal fractionalPart = rhs - Math.Truncate(rhs); + if (Math.Abs(0.5m - fractionalPart) < smallestFractionalPart) + { + smallestFractionalPart = Math.Abs(0.5m - fractionalPart); + branchVariableIndex = intBinVar; + } + } + + return branchVariableIndex; + } + + private int GetBasicRow(List> table, int variableIndex) + { + int basicRow = -1; + + for (int i = 1; i < table.Count; i++) + { + if (table[i][variableIndex] == 1) + { + basicRow = i; + break; + } + } + + return basicRow; + } + } +} diff --git a/BusinessLogic/Algorithms/DualSimplex.cs b/BusinessLogic/Algorithms/DualSimplex.cs new file mode 100644 index 0000000..81b5d6c --- /dev/null +++ b/BusinessLogic/Algorithms/DualSimplex.cs @@ -0,0 +1,223 @@ +using Common; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public class DualSimplex : Algorithm + { + public override void PutModelInCanonicalForm(Model model) + { + + List> tableZero = new List>(); + + tableZero.Add(new List()); + + foreach (var decVar in model.ObjectiveFunction.DecisionVariables) + { + tableZero[0].Add(decVar.Coefficient * -1); + } + + + for (int i = 0; i < model.Constraints.Count; i++) + { + tableZero[0].Add(0); + if (model.Constraints[i].InequalitySign == InequalitySign.EqualTo) + tableZero[0].Add(0); + } + + tableZero[0].Add(0); + + var equalsConstraints = model.Constraints.Where(c => c.InequalitySign == InequalitySign.EqualTo).ToList(); + if (equalsConstraints?.Count() > 0) + { + for (int i = 0; i < equalsConstraints.Count(); i++) + { + model.Constraints[model.Constraints.FindIndex(c => c == equalsConstraints[i])].InequalitySign = InequalitySign.LessThanOrEqualTo; + var newConstraint = new Constraint(); + newConstraint.InequalitySign = InequalitySign.GreaterThanOrEqualTo; + newConstraint.RightHandSide = equalsConstraints[i].RightHandSide; + + foreach (var decVar in equalsConstraints[i].DecisionVariables) + { + newConstraint.DecisionVariables.Add(new DecisionVariable() { Coefficient = decVar.Coefficient }); + } + + model.Constraints.Add(newConstraint); + } + } + + for (int i = 0; i < model.Constraints.Count; i++) + { + List constraintValues = new List(); + + + foreach (var decVar in model.Constraints[i].DecisionVariables) + { + if (model.Constraints[i].InequalitySign == InequalitySign.LessThanOrEqualTo) + { + constraintValues.Add(decVar.Coefficient); + } + else + { + constraintValues.Add(decVar.Coefficient * -1); + } + } + + for (int j = 0; j < model.Constraints.Count; j++) + { + if (j == i) + { + constraintValues.Add(1); + } + else + { + constraintValues.Add(0); + } + } + + if (model.Constraints[i].InequalitySign == InequalitySign.LessThanOrEqualTo) + { + constraintValues.Add(model.Constraints[i].RightHandSide); + } + else + { + constraintValues.Add(model.Constraints[i].RightHandSide * -1); + } + + tableZero.Add(constraintValues); + } + + model.Result.Add(tableZero); + } + + public override void Solve(Model model) + { + Iterate(model); + var primalSimplex = new PrimalSimplex(); + primalSimplex.Solve(model); + } + + private void Iterate(Model model) + { + + if (!CanPivot(model)) + return; + + + int pivotRow = GetPivotRow(model); + + int pivotColumn = GetPivotColumn(model, pivotRow); + + if (pivotColumn == -1) + throw new InfeasibleException("There is no suitable column to pivot on - the problem is infeasible"); + + Pivot(model, pivotRow, pivotColumn); + + + Iterate(model); + } + + private bool CanPivot(Model model) + { + + bool canPivot = false; + var table = model.Result[model.Result.Count - 1]; + + for (int i = 1; i < table.Count; i++) + { + + if (table[i][table[i].Count - 1] < -0.000000000001) + { + canPivot = true; + break; + } + } + + return canPivot; + } + + private int GetPivotRow(Model model) + { + int pivotRow = -1; + var table = model.Result[model.Result.Count - 1]; + double mostNegative = 0; + + for (int i = 1; i < table.Count; i++) + { + if (table[i][table[i].Count - 1] < 0 && table[i][table[i].Count - 1] < mostNegative) + { + mostNegative = table[i][table[i].Count - 1]; + pivotRow = i; + } + } + + return pivotRow; + } + + private int GetPivotColumn(Model model, int pivotRow) + { + int pivotColumn = -1; + var table = model.Result[model.Result.Count - 1]; + + double lowestRatio = double.MaxValue; + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[pivotRow][i] < 0) + { + double ratio = Math.Abs(table[0][i] / table[pivotRow][i]); + if (ratio < lowestRatio) + { + lowestRatio = ratio; + pivotColumn = i; + } + } + } + + return pivotColumn; + } + + private void Pivot(Model model, int pivotRow, int pivotColumn) + { + var previousTable = model.Result[model.Result.Count - 1]; + var newTable = new List>(); + + for (int i = 0; i < previousTable.Count; i++) + { + newTable.Add(new List()); + + for (int j = 0; j < previousTable[i].Count; j++) + { + newTable[i].Add(previousTable[i][j]); + } + } + + + double factor = 1 / newTable[pivotRow][pivotColumn]; + for (int i = 0; i < newTable[pivotRow].Count; i++) + { + newTable[pivotRow][i] *= factor; + } + + double pivotColumnValue; + for (int i = 0; i < newTable.Count; i++) + { + pivotColumnValue = newTable[i][pivotColumn]; + + if (i != pivotRow && pivotColumnValue != 0) + { + for (int j = 0; j < newTable[i].Count; j++) + { + newTable[i][j] += (-1 * pivotColumnValue * newTable[pivotRow][j]); + } + } + } + + model.Result.Add(newTable); + } + } +} diff --git a/BusinessLogic/Algorithms/PrimalSimplex.cs b/BusinessLogic/Algorithms/PrimalSimplex.cs new file mode 100644 index 0000000..aa2557a --- /dev/null +++ b/BusinessLogic/Algorithms/PrimalSimplex.cs @@ -0,0 +1,212 @@ +using Common; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public class PrimalSimplex : Algorithm + { + public override void PutModelInCanonicalForm(Model model) + { + + List> tableZero = new List>(); + + + tableZero.Add(new List()); + + foreach (var decVar in model.ObjectiveFunction.DecisionVariables) + { + tableZero[0].Add(decVar.Coefficient * -1); + } + + + for (int i = 0; i <= model.Constraints.Count; i++) + { + tableZero[0].Add(0); + } + + for (int i = 0; i < model.Constraints.Count; i++) + { + List constraintValues = new List(); + + foreach (var decVar in model.Constraints[i].DecisionVariables) + { + constraintValues.Add(decVar.Coefficient); + } + + for (int j = 0; j < model.Constraints.Count; j++) + { + if (j == i) + { + constraintValues.Add(1); + } + else + { + constraintValues.Add(0); + } + } + + constraintValues.Add(model.Constraints[i].RightHandSide); + + tableZero.Add(constraintValues); + } + + model.Result.Add(tableZero); + } + + public override void Solve(Model model) + { + Iterate(model); + } + + private bool IsOptimal(Model model) + { + bool isOptimal = true; + var table = model.Result[model.Result.Count - 1]; + + if (model.ProblemType == ProblemType.Maximization) + { + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] < 0) + { + isOptimal = false; + break; + } + } + } + else + { + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] > 0) + { + isOptimal = false; + break; + } + } + } + + return isOptimal; + } + + private void Iterate(Model model) + { + + if (IsOptimal(model)) + return; + + + int pivotColumn = GetPivotColumn(model); + // Then get the pivot row + int pivotRow = GetPivotRow(model, pivotColumn); + + if (pivotRow == -1) + throw new InfeasibleException("There is no suitable row to pivot on - the problem is infeasible"); + + Pivot(model, pivotRow, pivotColumn); + + Iterate(model); + } + + private void Pivot(Model model, int pivotRow, int pivotColumn) + { + var previousTable = model.Result[model.Result.Count - 1]; + var newTable = new List>(); + + for (int i = 0; i < previousTable.Count; i++) + { + newTable.Add(new List()); + + for (int j = 0; j < previousTable[i].Count; j++) + { + newTable[i].Add(previousTable[i][j]); + } + } + + + double factor = 1 / newTable[pivotRow][pivotColumn]; + for (int i = 0; i < newTable[pivotRow].Count; i++) + { + newTable[pivotRow][i] *= factor; + } + + double pivotColumnValue; + for (int i = 0; i < newTable.Count; i++) + { + pivotColumnValue = newTable[i][pivotColumn]; + + if (i != pivotRow && pivotColumnValue != 0) + { + for (int j = 0; j < newTable[i].Count; j++) + { + newTable[i][j] += (-1 * pivotColumnValue * newTable[pivotRow][j]); + } + } + } + + model.Result.Add(newTable); + } + + private int GetPivotColumn(Model model) + { + int colIndex = -1; + var table = model.Result[model.Result.Count - 1]; + + if (model.ProblemType == ProblemType.Maximization) + { + double mostNegative = 0; + + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] < 0 && table[0][i] < mostNegative) + { + mostNegative = table[0][i]; + colIndex = i; + } + } + } + else + { + double mostPositive = 0; + + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] > 0 && table[0][i] > mostPositive) + { + mostPositive = table[0][i]; + colIndex = i; + } + } + } + + return colIndex; + } + + private int GetPivotRow(Model model, int pivotColumn) + { + int rowIndex = -1; + var table = model.Result[model.Result.Count - 1]; + + double lowestRatio = double.MaxValue; + for (int i = 1; i < table.Count; i++) + { + if (table[i][pivotColumn] > 0) + { + double ratio = table[i][table[i].Count - 1] / table[i][pivotColumn]; + if (ratio < lowestRatio && ratio >= 0) + { + lowestRatio = ratio; + rowIndex = i; + } + } + } + + return rowIndex; + } + } +} diff --git a/BusinessLogic/Algorithms/TwoPhaseSimplex.cs b/BusinessLogic/Algorithms/TwoPhaseSimplex.cs new file mode 100644 index 0000000..5e2554a --- /dev/null +++ b/BusinessLogic/Algorithms/TwoPhaseSimplex.cs @@ -0,0 +1,346 @@ +using Common; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic.Algorithms +{ + public class TwoPhaseSimplex : Algorithm + { + private int numberOfArtificialVars = 0; + + public override void PutModelInCanonicalForm(Model model) + { + + for (int i = 0; i < model.Constraints.Count; i++) + { + if (model.Constraints[i].RightHandSide < 0) + { + for (int j = 0; j < model.Constraints[i].DecisionVariables.Count; j++) + { + model.Constraints[i].DecisionVariables[j].Coefficient *= -1; + } + + model.Constraints[i].RightHandSide *= -1; + + if (model.Constraints[i].InequalitySign == InequalitySign.LessThanOrEqualTo) + { + model.Constraints[i].InequalitySign = InequalitySign.GreaterThanOrEqualTo; + } + else if (model.Constraints[i].InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + model.Constraints[i].InequalitySign = InequalitySign.LessThanOrEqualTo; + } + } + } + + + List> tableZero = new List>(); + + + tableZero.Add(new List()); + + foreach (var decVar in model.ObjectiveFunction.DecisionVariables) + { + tableZero[0].Add(decVar.Coefficient * -1); + } + + foreach (var constraint in model.Constraints) + { + if (constraint.InequalitySign == InequalitySign.LessThanOrEqualTo || + constraint.InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + tableZero[0].Add(0); + } + + if (constraint.InequalitySign == InequalitySign.EqualTo || + constraint.InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + tableZero[0].Add(0); + } + } + + tableZero[0].Add(0); + + for (int i = 0; i < model.Constraints.Count; i++) + { + List constraintValues = new List(); + + foreach (var decVar in model.Constraints[i].DecisionVariables) + { + constraintValues.Add(decVar.Coefficient); + } + + for (int j = 0; j < model.Constraints.Count; j++) + { + if (model.Constraints[j].InequalitySign == InequalitySign.LessThanOrEqualTo) + { + if (j == i) + { + constraintValues.Add(1); + } + else + { + constraintValues.Add(0); + } + } + else if (model.Constraints[j].InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + if (j == i) + { + constraintValues.Add(-1); + } + else + { + constraintValues.Add(0); + } + } + } + + constraintValues.Add(model.Constraints[i].RightHandSide); + + for (int j = 0; j < model.Constraints.Count; j++) + { + if (model.Constraints[j].InequalitySign == InequalitySign.EqualTo || + model.Constraints[j].InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + if (j == i) + { + constraintValues.Insert(constraintValues.Count - 1, 1); + } + else + { + constraintValues.Insert(constraintValues.Count - 1, 0); + } + } + } + + tableZero.Add(constraintValues); + } + + numberOfArtificialVars = model.Constraints.Where(c => c.InequalitySign == + InequalitySign.EqualTo || c.InequalitySign == InequalitySign.GreaterThanOrEqualTo).Count(); + + List wRow = new List(); + for (int i = 0; i < tableZero[0].Count; i++) + { + wRow.Add(0); + } + + for (int i = 1; i < tableZero.Count; i++) + { + if (model.Constraints[i - 1].InequalitySign == InequalitySign.EqualTo || + model.Constraints[i - 1].InequalitySign == InequalitySign.GreaterThanOrEqualTo) + { + for (int j = 0; j < (tableZero[i].Count - numberOfArtificialVars - 1); j++) + { + wRow[j] += tableZero[i][j]; + } + + wRow[wRow.Count - 1] += tableZero[i][tableZero[i].Count - 1]; + } + } + + tableZero.Insert(0, wRow); + model.Result.Add(tableZero); + } + + public override void Solve(Model model) + { + Iterate(model); + var lastTable = model.Result[model.Result.Count - 1]; + + if (lastTable[0][lastTable[0].Count - 1] > 0) + { + throw new InfeasibleException("The problem is infeasible"); + } + + bool allArtificialsNonBasic = true; + for (int i = lastTable[0].Count - (numberOfArtificialVars + 1); i < lastTable[0].Count - 1; i++) + { + if (IsVariableBasic(i, lastTable)) + { + allArtificialsNonBasic = false; + break; + } + } + + if (allArtificialsNonBasic) + { + lastTable.RemoveAt(0); + + for (int i = 0; i < lastTable.Count; i++) + { + for (int j = 0; j < numberOfArtificialVars; j++) + { + lastTable[i].RemoveAt(lastTable[i].Count - 2); + } + } + } + else + { + for (int i = 0; i < model.ObjectiveFunction.DecisionVariables.Count; i++) + { + if (lastTable[0][i] < 0) + { + for (int j = 0; j < lastTable.Count; j++) + { + lastTable[j].RemoveAt(i); + } + } + } + + for (int i = lastTable[0].Count - (numberOfArtificialVars + 1); i < lastTable[0].Count - 1; i++) + { + if (!IsVariableBasic(i, lastTable)) + { + for (int j = 0; j < lastTable.Count; j++) + { + lastTable[j].RemoveAt(i); + } + } + } + + lastTable.RemoveAt(0); + } + + var primalSimplex = new PrimalSimplex(); + primalSimplex.Solve(model); + } + + private bool IsOptimal(Model model) + { + bool isOptimal = true; + var table = model.Result[model.Result.Count - 1]; + + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] > 0) + { + isOptimal = false; + break; + } + } + + return isOptimal; + } + + private void Iterate(Model model) + { + if (IsOptimal(model)) + return; + + int pivotColumn = GetPivotColumn(model); + int pivotRow = GetPivotRow(model, pivotColumn); + + if (pivotRow == -1) + throw new InfeasibleException("There is no suitable row to pivot on - the problem is infeasible"); + + Pivot(model, pivotRow, pivotColumn); + + Iterate(model); + } + + private void Pivot(Model model, int pivotRow, int pivotColumn) + { + var previousTable = model.Result[model.Result.Count - 1]; + var newTable = new List>(); + + for (int i = 0; i < previousTable.Count; i++) + { + newTable.Add(new List()); + + for (int j = 0; j < previousTable[i].Count; j++) + { + newTable[i].Add(previousTable[i][j]); + } + } + + double factor = 1 / newTable[pivotRow][pivotColumn]; + for (int i = 0; i < newTable[pivotRow].Count; i++) + { + newTable[pivotRow][i] *= factor; + } + + double pivotColumnValue; + for (int i = 0; i < newTable.Count; i++) + { + pivotColumnValue = newTable[i][pivotColumn]; + + if (i != pivotRow && pivotColumnValue != 0) + { + for (int j = 0; j < newTable[i].Count; j++) + { + newTable[i][j] += (-1 * pivotColumnValue * newTable[pivotRow][j]); + } + } + } + + model.Result.Add(newTable); + } + + private int GetPivotColumn(Model model) + { + int colIndex = -1; + var table = model.Result[model.Result.Count - 1]; + double mostPositive = 0; + + for (int i = 0; i < table[0].Count - 1; i++) + { + if (table[0][i] > 0 && table[0][i] > mostPositive) + { + mostPositive = table[0][i]; + colIndex = i; + } + } + + return colIndex; + } + + private int GetPivotRow(Model model, int pivotColumn) + { + int rowIndex = -1; + var table = model.Result[model.Result.Count - 1]; + + double lowestRatio = double.MaxValue; + for (int i = 1; i < table.Count; i++) + { + if (table[i][pivotColumn] > 0) + { + double ratio = table[i][table[i].Count - 1] / table[i][pivotColumn]; + if (ratio < lowestRatio && ratio >= 0) + { + lowestRatio = ratio; + rowIndex = i; + } + } + } + + return rowIndex; + } + + private bool IsVariableBasic(int index, List> table) + { + bool isBasic = true; + + for (int i = 0; i < table.Count; i++) + { + int numberOfOnes = 0; + + if (table[i][index] == 1) + numberOfOnes++; + + if ((table[i][index] != 0 && table[i][index] != 1) || numberOfOnes > 1) + { + isBasic = false; + break; + } + } + + return isBasic; + } + } +} diff --git a/BusinessLogic/BinaryTree.cs b/BusinessLogic/BinaryTree.cs new file mode 100644 index 0000000..e3f1bca --- /dev/null +++ b/BusinessLogic/BinaryTree.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic +{ + public class BinaryTree + { + public BinaryTreeNode Root { get; set; } + + public void Add(List>> subProblem, List>> parentProblem = null) + { + BinaryTreeNode newNode = new BinaryTreeNode(); + newNode.Data = subProblem; + + if (Root == null) + { + Root = newNode; + return; + } + + if (parentProblem != null) + { + BinaryTreeNode parentNode = Find(parentProblem); + if (parentNode != null && parentNode.LeftNode == null) + { + parentNode.LeftNode = newNode; + return; + } + + if (parentNode != null && parentNode.RightNode == null) + { + parentNode.RightNode = newNode; + } + } + } + + public BinaryTreeNode Find(List>> subProblem) + { + return this.Find(subProblem, this.Root); + } + + private BinaryTreeNode Find(List>> subProblem, BinaryTreeNode parent) + { + if (parent == null) + return null; + + if (parent.Data == subProblem) + { + return parent; + } + + return Find(subProblem, parent.LeftNode) == null ? Find(subProblem, parent.RightNode) : Find(subProblem, parent.LeftNode); + } + + public int GetHeight(BinaryTreeNode root) + { + if (root == null) + return 0; + + int leftHeight = GetHeight(root.LeftNode); + int rightHeight = GetHeight(root.RightNode); + + return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; + } + } +} diff --git a/BusinessLogic/BinaryTreeNode.cs b/BusinessLogic/BinaryTreeNode.cs new file mode 100644 index 0000000..13d4902 --- /dev/null +++ b/BusinessLogic/BinaryTreeNode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic +{ + public class BinaryTreeNode + { + public BinaryTreeNode LeftNode { get; set; } + public BinaryTreeNode RightNode { get; set; } + public List>> Data { get; set; } + } +} diff --git a/BusinessLogic/BusinessLogic.csproj b/BusinessLogic/BusinessLogic.csproj new file mode 100644 index 0000000..5ca3220 --- /dev/null +++ b/BusinessLogic/BusinessLogic.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF} + Library + Properties + BusinessLogic + BusinessLogic + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + {02E85643-5DA8-4A1E-AF07-10184FC132A0} + DataAccess + + + {04C11623-F02E-45C6-8C51-82244CFF4780} + Common + + + + \ No newline at end of file diff --git a/BusinessLogic/ListCloner.cs b/BusinessLogic/ListCloner.cs new file mode 100644 index 0000000..06d376b --- /dev/null +++ b/BusinessLogic/ListCloner.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic +{ + public class ListCloner + { + public static List>> CloneList(List>> oldList) + { + List>> newList = new List>>(); + + int iterationCount = oldList.Count; + int rowCount = oldList[0].Count; + int colCount = oldList[0][0].Count; + + for (int i = 0; i < iterationCount; i++) + { + var table = new List>(); + for (int j = 0; j < rowCount; j++) + { + var row = new List(); + for (int k = 0; k < colCount; k++) + { + row.Add(oldList[i][j][k]); + } + table.Add(row); + } + newList.Add(table); + } + + return newList; + } + + public static List> CloneList(List> oldList) + { + List> newList = new List>(); + + int rowCount = oldList.Count; + int colCount = oldList[0].Count; + + for (int i = 0; i < rowCount; i++) + { + var newRow = new List(); + for (int j = 0; j < colCount; j++) + { + newRow.Add(oldList[i][j]); + } + newList.Add(newRow); + } + + return newList; + } + } +} diff --git a/BusinessLogic/ModelSolver.cs b/BusinessLogic/ModelSolver.cs new file mode 100644 index 0000000..e344a41 --- /dev/null +++ b/BusinessLogic/ModelSolver.cs @@ -0,0 +1,25 @@ +using BusinessLogic.Algorithms; +using Common; +using DataAccess; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BusinessLogic +{ + public class ModelSolver + { + public static void Solve(Model model, Algorithm algorithm) + { + algorithm.PutModelInCanonicalForm(model); + + algorithm.Solve(model); + + Console.Clear(); + Console.WriteLine("Here is the solution:"); + Console.WriteLine("========================================================================================================="); + } + } +} diff --git a/BusinessLogic/Properties/AssemblyInfo.cs b/BusinessLogic/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a982168 --- /dev/null +++ b/BusinessLogic/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BusinessLogic")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BusinessLogic")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f904da9b-8ba5-4803-88c1-24a6471c7fef")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DataAccess/DataAccess.csproj b/DataAccess/DataAccess.csproj new file mode 100644 index 0000000..3b0e68d --- /dev/null +++ b/DataAccess/DataAccess.csproj @@ -0,0 +1,77 @@ + + + + + Debug + AnyCPU + {02E85643-5DA8-4A1E-AF07-10184FC132A0} + Library + Properties + DataAccess + DataAccess + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + {04C11623-F02E-45C6-8C51-82244CFF4780} + Common + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + \ No newline at end of file diff --git a/DataAccess/ModelReader.cs b/DataAccess/ModelReader.cs new file mode 100644 index 0000000..4287b16 --- /dev/null +++ b/DataAccess/ModelReader.cs @@ -0,0 +1,164 @@ +using Common; +using Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataAccess +{ + public class ModelReader + { + public static Model ReadModelFromFile(string path) + { + List lines = new List(); + + try + { + using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + using (StreamReader reader = new StreamReader(fileStream)) + { + while (!reader.EndOfStream) + { + lines.Add(reader.ReadLine()); + } + } + } + + return ConvertToModel(lines); + } + catch (FileNotFoundException) + { + throw new CustomException("Could not find the specified file"); + } + catch (DirectoryNotFoundException) + { + throw new CustomException("Could not find the specified directory"); + } + catch (ArgumentException) + { + throw new CustomException("The specified path was invalid"); + } + catch (IOException) + { + throw new CustomException("There was an error reading the specified file"); + } + } + + private static Model ConvertToModel(List lines) + { + Model model = new Model(); + + try + { + if (lines.Count < 1) + { + throw new CustomException("The specified file is empty"); + } + + string[] objectiveFunction = lines[0].Split(' '); + + if (!(objectiveFunction[0].ToLower().Equals("max") || objectiveFunction[0].ToLower().Equals("min"))) + { + throw new CustomException("The given problem does not specify whether to maximize or minimize the objective function"); + } + + model.ProblemType = objectiveFunction[0].ToLower().Equals("max") ? ProblemType.Maximization : ProblemType.Minimization; + + for (int i = 1; i < objectiveFunction.Length; i++) + { + model.ObjectiveFunction.DecisionVariables.Add(new DecisionVariable() { Coefficient = double.Parse(objectiveFunction[i]) }); + } + + if (lines.Count < 2) + { + throw new CustomException("The given problem does not contain any constraints"); + } + + for (int i = 1; i < lines.Count - 1; i++) + { + string[] constraintArr = lines[i].Split(' '); + Constraint constraint = new Constraint(); + + for (int j = 0; j < constraintArr.Length - 2; j++) + { + constraint.DecisionVariables.Add(new DecisionVariable() { Coefficient = double.Parse(constraintArr[j]) }); + } + + switch (constraintArr[constraintArr.Length - 2]) + { + case "=": + { + constraint.InequalitySign = InequalitySign.EqualTo; + } + break; + case "<=": + { + constraint.InequalitySign = InequalitySign.LessThanOrEqualTo; + } + break; + case ">=": + { + constraint.InequalitySign = InequalitySign.GreaterThanOrEqualTo; + } + break; + default: + { + throw new CustomException($"Constraint {model.Constraints.Count + 1} does not have a valid inequality symbol"); + } + } + + constraint.RightHandSide = double.Parse(constraintArr[constraintArr.Length - 1]); + model.Constraints.Add(constraint); + } + + string[] signRestrictions = lines[lines.Count - 1].Split(' '); + + foreach (var restriction in signRestrictions) + { + switch (restriction.ToLower()) + { + case "+": + { + model.SignRestrictions.Add(SignRestriction.Positive); + } + break; + case "-": + { + model.SignRestrictions.Add(SignRestriction.Negative); + } + break; + case "urs": + { + model.SignRestrictions.Add(SignRestriction.Unrestricted); + } + break; + case "int": + { + model.SignRestrictions.Add(SignRestriction.Integer); + } + break; + case "bin": + { + model.SignRestrictions.Add(SignRestriction.Binary); + } + break; + default: + { + throw new CustomException("Invalid sign restriction found"); + } + } + } + } + catch (FormatException) + { + throw new CustomException("One of the decision variables has an invalid coefficient"); + } + + return model; + } + } +} diff --git a/DataAccess/Properties/AssemblyInfo.cs b/DataAccess/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..80d6369 --- /dev/null +++ b/DataAccess/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DataAccess")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataAccess")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("02e85643-5da8-4a1e-af07-10184fc132a0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DataAccess/acme.txt b/DataAccess/acme.txt new file mode 100644 index 0000000..552fb3d --- /dev/null +++ b/DataAccess/acme.txt @@ -0,0 +1,5 @@ +min +4 +1 ++3 +1 >= 10 ++1 +1 >= 5 ++1 +0 >= 3 ++ + \ No newline at end of file diff --git a/DataAccess/branch.txt b/DataAccess/branch.txt new file mode 100644 index 0000000..1517c6c --- /dev/null +++ b/DataAccess/branch.txt @@ -0,0 +1,4 @@ +max +8 +5 ++1 +1 <= +6 ++9 +5 <= +45 +int int \ No newline at end of file diff --git a/DataAccess/cut.txt b/DataAccess/cut.txt new file mode 100644 index 0000000..c9c81d5 --- /dev/null +++ b/DataAccess/cut.txt @@ -0,0 +1,4 @@ +min +6 +8 ++3 +1 >= 4 ++1 +2 >= 4 +int int \ No newline at end of file diff --git a/DataAccess/farmer.txt b/DataAccess/farmer.txt new file mode 100644 index 0000000..aaa9688 --- /dev/null +++ b/DataAccess/farmer.txt @@ -0,0 +1,5 @@ +max +100 +30 ++1 +1 <= +7 ++10 +4 <= 40 ++0 +1 >= 3 ++ + \ No newline at end of file diff --git a/DataAccess/korean.txt b/DataAccess/korean.txt new file mode 100644 index 0000000..b10dbaa --- /dev/null +++ b/DataAccess/korean.txt @@ -0,0 +1,4 @@ +min +50 +100 ++7 +2 >= +28 ++2 +12 >= +24 ++ + \ No newline at end of file diff --git a/DataAccess/limpopo.txt b/DataAccess/limpopo.txt new file mode 100644 index 0000000..1fe38d5 --- /dev/null +++ b/DataAccess/limpopo.txt @@ -0,0 +1,6 @@ +max +60 +30 +20 ++8 +6 +1 <= +48 ++4 +2 +1,5 <= +20 ++2 +1,5 +0,5 <= +8 ++0 +1 +0 <= +5 ++ + + \ No newline at end of file diff --git a/DataAccess/santa.txt b/DataAccess/santa.txt new file mode 100644 index 0000000..e36d1b6 --- /dev/null +++ b/DataAccess/santa.txt @@ -0,0 +1,5 @@ +max +3 +2 ++2 +1 <= 100 ++1 +1 <= 80 ++1 +0 <= 40 ++ + \ No newline at end of file diff --git a/LPR381_Project.sln b/LPR381_Project.sln new file mode 100644 index 0000000..255cf66 --- /dev/null +++ b/LPR381_Project.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31624.102 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Solve", "LPR381_Project\Solve.csproj", "{00C7750A-2297-460E-AABD-2AC53FFD1F17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BusinessLogic", "BusinessLogic\BusinessLogic.csproj", "{F904DA9B-8BA5-4803-88C1-24A6471C7FEF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Presentation", "Presentation\Presentation.csproj", "{377D38FE-AA9D-4AB0-B743-9E80AA0C82C4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccess", "DataAccess\DataAccess.csproj", "{02E85643-5DA8-4A1E-AF07-10184FC132A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Models\Common.csproj", "{04C11623-F02E-45C6-8C51-82244CFF4780}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {00C7750A-2297-460E-AABD-2AC53FFD1F17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00C7750A-2297-460E-AABD-2AC53FFD1F17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00C7750A-2297-460E-AABD-2AC53FFD1F17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00C7750A-2297-460E-AABD-2AC53FFD1F17}.Release|Any CPU.Build.0 = Release|Any CPU + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF}.Release|Any CPU.Build.0 = Release|Any CPU + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4}.Release|Any CPU.Build.0 = Release|Any CPU + {02E85643-5DA8-4A1E-AF07-10184FC132A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02E85643-5DA8-4A1E-AF07-10184FC132A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02E85643-5DA8-4A1E-AF07-10184FC132A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02E85643-5DA8-4A1E-AF07-10184FC132A0}.Release|Any CPU.Build.0 = Release|Any CPU + {04C11623-F02E-45C6-8C51-82244CFF4780}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04C11623-F02E-45C6-8C51-82244CFF4780}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04C11623-F02E-45C6-8C51-82244CFF4780}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04C11623-F02E-45C6-8C51-82244CFF4780}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9EF1E2C9-7C61-4DE5-8087-F1E388B2B976} + EndGlobalSection +EndGlobal diff --git a/LPR381_Project/App.config b/LPR381_Project/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/LPR381_Project/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LPR381_Project/Program.cs b/LPR381_Project/Program.cs new file mode 100644 index 0000000..e739944 --- /dev/null +++ b/LPR381_Project/Program.cs @@ -0,0 +1,20 @@ +using DataAccess; +using Models; +using Presentation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LPR381_Project +{ + class Program + { + static void Main(string[] args) + { + MainMenu.Run(); + Console.ReadKey(); + } + } +} diff --git a/LPR381_Project/Properties/AssemblyInfo.cs b/LPR381_Project/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7708e83 --- /dev/null +++ b/LPR381_Project/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LPR381_Project")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LPR381_Project")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("00c7750a-2297-460e-aabd-2ac53ffd1f17")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LPR381_Project/Solve.csproj b/LPR381_Project/Solve.csproj new file mode 100644 index 0000000..813a2f3 --- /dev/null +++ b/LPR381_Project/Solve.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {00C7750A-2297-460E-AABD-2AC53FFD1F17} + Exe + LPR381_Project + LPR381_Project + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + {02E85643-5DA8-4A1E-AF07-10184FC132A0} + DataAccess + + + {04C11623-F02E-45C6-8C51-82244CFF4780} + Common + + + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4} + Presentation + + + + \ No newline at end of file diff --git a/Models/Common.csproj b/Models/Common.csproj new file mode 100644 index 0000000..1625f14 --- /dev/null +++ b/Models/Common.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {04C11623-F02E-45C6-8C51-82244CFF4780} + Library + Properties + Models + Models + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Models/Constraint.cs b/Models/Constraint.cs new file mode 100644 index 0000000..9069212 --- /dev/null +++ b/Models/Constraint.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class Constraint + { + public List DecisionVariables { get; set; } = new List(); + public InequalitySign InequalitySign { get; set; } + public double RightHandSide { get; set; } + } +} diff --git a/Models/CustomException.cs b/Models/CustomException.cs new file mode 100644 index 0000000..10d957b --- /dev/null +++ b/Models/CustomException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models +{ + + [Serializable] + public class CustomException : Exception + { + public CustomException() { } + public CustomException(string message) : base(message) { } + public CustomException(string message, Exception inner) : base(message, inner) { } + protected CustomException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} diff --git a/Models/DecisionVariable.cs b/Models/DecisionVariable.cs new file mode 100644 index 0000000..9eab4b1 --- /dev/null +++ b/Models/DecisionVariable.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class DecisionVariable + { + public double Coefficient { get; set; } + } +} diff --git a/Models/InequalitySign.cs b/Models/InequalitySign.cs new file mode 100644 index 0000000..edca5b4 --- /dev/null +++ b/Models/InequalitySign.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public enum InequalitySign + { + EqualTo, + LessThanOrEqualTo, + GreaterThanOrEqualTo + } +} diff --git a/Models/InfeasibleException.cs b/Models/InfeasibleException.cs new file mode 100644 index 0000000..acbe412 --- /dev/null +++ b/Models/InfeasibleException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models +{ + + [Serializable] + public class InfeasibleException : Exception + { + public InfeasibleException() { } + public InfeasibleException(string message) : base(message) { } + public InfeasibleException(string message, Exception inner) : base(message, inner) { } + protected InfeasibleException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} diff --git a/Models/Model.cs b/Models/Model.cs new file mode 100644 index 0000000..bf07c2a --- /dev/null +++ b/Models/Model.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class Model + { + public Model() { } + + // A copy constructor so that we can clone Model objects without reference + public Model(Model model) + { + this.ProblemType = model.ProblemType; + this.ObjectiveFunction = model.ObjectiveFunction; + this.Constraints = model.Constraints; + this.SignRestrictions = model.SignRestrictions; + this.Result = model.Result; + } + + public ProblemType ProblemType { get; set; } + public ObjectiveFunction ObjectiveFunction { get; set; } = new ObjectiveFunction(); + public List Constraints { get; set; } = new List(); + public List SignRestrictions { get; set; } = new List(); + public List>> Result { get; set; } = new List>>(); + } +} diff --git a/Models/ObjectiveFunction.cs b/Models/ObjectiveFunction.cs new file mode 100644 index 0000000..277643e --- /dev/null +++ b/Models/ObjectiveFunction.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class ObjectiveFunction + { + public List DecisionVariables { get; set; } = new List(); + } +} diff --git a/Models/ProblemType.cs b/Models/ProblemType.cs new file mode 100644 index 0000000..4735c11 --- /dev/null +++ b/Models/ProblemType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public enum ProblemType + { + Maximization, + Minimization + } +} diff --git a/Models/Properties/AssemblyInfo.cs b/Models/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dc228d9 --- /dev/null +++ b/Models/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Models")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Models")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("04c11623-f02e-45c6-8c51-82244cff4780")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Models/SignRestriction.cs b/Models/SignRestriction.cs new file mode 100644 index 0000000..d032a59 --- /dev/null +++ b/Models/SignRestriction.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public enum SignRestriction + { + Positive, + Negative, + Unrestricted, + Integer, + Binary + } +} diff --git a/Presentation/MainMenu.cs b/Presentation/MainMenu.cs new file mode 100644 index 0000000..51f2e63 --- /dev/null +++ b/Presentation/MainMenu.cs @@ -0,0 +1,180 @@ +using BusinessLogic; +using BusinessLogic.Algorithms; +using Common; +using DataAccess; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Presentation +{ + public class MainMenu + { + public static void Run() + { + Model model = new Model(); + + try + { + Console.Clear(); + Console.WriteLine("Welcome to the solver"); + Console.WriteLine("========================================================================================================="); + Console.WriteLine("To get started, choose a premade text file that contains the model you would like to solve:"); + Console.WriteLine("\nlimpopo.txt\nsanta.txt\nkorean.txt\nfarmer.txt\nbranch.txt\ncut.txt\nacme.txt\n"); + string modelPath = Console.ReadLine(); + Console.WriteLine("========================================================================================================="); + model = ModelReader.ReadModelFromFile(modelPath); + SolveModelUsingAlgorithm(model); + } + catch (CustomException ex) + { + Console.WriteLine($"There was an error. Details: {ex.Message}."); + Console.WriteLine("\nHere are the tables that were calculated before we ran into that error:"); + SolvedModelPrinter.Print(model); + Console.WriteLine("\n\nPress any key to continue. . ."); + Console.ReadKey(); + Run(); + } + catch (InfeasibleException ex) + { + Console.WriteLine($"There was an error. Details: {ex.Message}."); + Console.WriteLine("\nHere are the tables that were calculated before we ran into that error:"); + SolvedModelPrinter.Print(model); + Console.WriteLine("\n\nPress any key to continue. . ."); + Console.ReadKey(); + Run(); + } + catch (Exception ex) + { + Console.WriteLine($"There was an error. Details: {ex.Message}."); + Console.WriteLine("\nHere are the tables that were calculated before we ran into that error:"); + SolvedModelPrinter.Print(model); + Console.WriteLine("\n\nPress any key to continue. . ."); + Console.ReadKey(); + Run(); + } + } + + private static void SolveModelUsingAlgorithm(Model model) + { + Console.Clear(); + Console.WriteLine("Great! Now that we have your model, the next step is to choose an algorithm to solve it with."); + Console.WriteLine("Based on factors in your model, these are the available algorithms you can use:"); + Console.WriteLine("========================================================================================================="); + + string userInput; + Algorithm algorithm; + + if (model.SignRestrictions.Contains(SignRestriction.Binary) || model.SignRestrictions.Contains(SignRestriction.Integer)) + { + Console.WriteLine("BNB - Branch and Bound Simplex Algorithm"); + Console.WriteLine("CP - Cutting Plane Algorithm"); + userInput = Console.ReadLine(); + + switch (userInput.ToUpper()) + { + case "BNB": + { + algorithm = new BranchAndBoundSimplex(); + } + break; + case "CP": + { + algorithm = new CuttingPlane(); + } + break; + default: + { + throw new CustomException("Invalid selection made"); + } + } + } + else if (model.ProblemType == ProblemType.Minimization) + { + Console.WriteLine("DS - Dual Simplex Algorithm"); + Console.WriteLine("TPS - Two Phase Simplex Algorithm"); + userInput = Console.ReadLine(); + + switch (userInput.ToUpper()) + { + case "DS": + { + algorithm = new DualSimplex(); + } + break; + case "TPS": + { + algorithm = new TwoPhaseSimplex(); + } + break; + default: + { + throw new CustomException("Invalid selection made"); + } + } + } + else + { + if (!(model.Constraints.Any(c => c.InequalitySign == InequalitySign.EqualTo) || + model.Constraints.Any(c => c.InequalitySign == InequalitySign.GreaterThanOrEqualTo))) + { + Console.WriteLine("PS - Primal Simplex"); + userInput = Console.ReadLine(); + + switch (userInput.ToUpper()) + { + case "PS": + { + algorithm = new PrimalSimplex(); + } + break; + default: + { + throw new CustomException("Invalid selection made"); + } + } + } + else + { + Console.WriteLine("DS - Dual Simplex Algorithm"); + Console.WriteLine("TPS - Two Phase Simplex Algorithm"); + userInput = Console.ReadLine(); + + switch (userInput.ToUpper()) + { + case "DS": + { + algorithm = new DualSimplex(); + } + break; + case "TPS": + { + algorithm = new TwoPhaseSimplex(); + } + break; + default: + { + throw new CustomException("Invalid selection made"); + } + } + } + } + + ModelSolver.Solve(model, algorithm); + + if (algorithm.GetType() == typeof(BranchAndBoundSimplex)) + { + SolvedModelPrinter.Print((BranchAndBoundSimplex)algorithm); + ModelWriter.WriteResultsToFile((BranchAndBoundSimplex)algorithm); + } + else + { + SolvedModelPrinter.Print(model); + ModelWriter.WriteResultsToFile(model); + } + } + } +} diff --git a/Presentation/ModelWriter.cs b/Presentation/ModelWriter.cs new file mode 100644 index 0000000..6eeb640 --- /dev/null +++ b/Presentation/ModelWriter.cs @@ -0,0 +1,121 @@ +using BusinessLogic.Algorithms; +using Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Presentation +{ + public class ModelWriter + { + public static void WriteResultsToFile(Model model) + { + var fileName = Guid.NewGuid().ToString() + ".txt"; + + using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + using (StreamWriter writer = new StreamWriter(stream)) + { + int iteration = 0; + + foreach (var table in model.Result) + { + writer.WriteLine($"\n\nTable {iteration}:"); + + for (int i = 0; i < table.Count; i++) + { + for (int j = 0; j < table[0].Count; j++) + { + writer.Write($"\t{table[i][j]:0.###}"); + } + writer.WriteLine(); + } + + iteration++; + } + } + } + + Console.WriteLine($"\n\nThe results have been written to the file: {fileName}"); + } + + public static void WriteResultsToFile(BranchAndBoundSimplex branchAndBoundSimplex) + { + var fileName = Guid.NewGuid().ToString() + ".txt"; + + using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + using (StreamWriter writer = new StreamWriter(stream)) + { + var tree = branchAndBoundSimplex.Results; + WriteBranchResults(tree.Root, writer); + List> bestCandidate = branchAndBoundSimplex.GetBestCandidate(); + + writer.WriteLine("\n\nThis is the best solution of all the candidates:\n"); + for (int i = 0; i < bestCandidate.Count; i++) + { + for (int j = 0; j < bestCandidate[i].Count; j++) + { + writer.Write($"\t{bestCandidate[i][j]:0.###}"); + } + writer.WriteLine(); + } + } + } + + Console.WriteLine($"\n\nThe results have been written to the file: {fileName}"); + } + + private static void WriteBranchResults(BusinessLogic.BinaryTreeNode root, StreamWriter writer, string previousProblem = "0") + { + if (root == null) + return; + + if (previousProblem.Equals("0")) + { + writer.WriteLine("\n\n"); + writer.WriteLine("Sub-Problem 0"); + + for (int i = 0; i < root.Data.Count; i++) + { + for (int j = 0; j < root.Data[i].Count; j++) + { + for (int k = 0; k < root.Data[i][j].Count; k++) + { + writer.Write($"\t{root.Data[i][j][k]:0.###}"); + } + writer.WriteLine(); + } + writer.WriteLine("\n\n"); + } + + WriteBranchResults(root.LeftNode, writer, "1"); + WriteBranchResults(root.RightNode, writer, "2"); + } + else + { + writer.WriteLine("\n\n"); + writer.WriteLine($"Sub-Problem {previousProblem}"); + + for (int i = 0; i < root.Data.Count; i++) + { + for (int j = 0; j < root.Data[i].Count; j++) + { + for (int k = 0; k < root.Data[i][j].Count; k++) + { + writer.Write($"\t{root.Data[i][j][k]:0.###}"); + } + writer.WriteLine(); + } + writer.WriteLine("\n\n"); + } + + WriteBranchResults(root.LeftNode, writer, previousProblem + ".1"); + WriteBranchResults(root.RightNode, writer, previousProblem + ".2"); + } + } + } +} diff --git a/Presentation/Presentation.csproj b/Presentation/Presentation.csproj new file mode 100644 index 0000000..a368af3 --- /dev/null +++ b/Presentation/Presentation.csproj @@ -0,0 +1,70 @@ + + + + + Debug + AnyCPU + {377D38FE-AA9D-4AB0-B743-9E80AA0C82C4} + Library + Properties + Presentation + Presentation + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\ConsoleTables.2.4.2\lib\net40\ConsoleTables.dll + + + + + + + + + + + + + + + + + + + {F904DA9B-8BA5-4803-88C1-24A6471C7FEF} + BusinessLogic + + + {02E85643-5DA8-4A1E-AF07-10184FC132A0} + DataAccess + + + {04C11623-F02E-45C6-8C51-82244CFF4780} + Common + + + + + + + \ No newline at end of file diff --git a/Presentation/Properties/AssemblyInfo.cs b/Presentation/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ee703a9 --- /dev/null +++ b/Presentation/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Presentation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Presentation")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("377d38fe-aa9d-4ab0-b743-9e80aa0c82c4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Presentation/SolvedModelPrinter.cs b/Presentation/SolvedModelPrinter.cs new file mode 100644 index 0000000..73ccf07 --- /dev/null +++ b/Presentation/SolvedModelPrinter.cs @@ -0,0 +1,112 @@ +using BusinessLogic; +using BusinessLogic.Algorithms; +using Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ConsoleTables; + +namespace Presentation +{ + public class SolvedModelPrinter + { + public static void Print(Model model) + { + int iteration = 0; + + foreach (var table in model.Result) + { + Console.WriteLine($"\n\nTable {iteration}:"); + string[] headers = new string[table[0].Count]; + string temp = ""; + for (int j = 0; j < table[0].Count; j++) + { + temp = table[0][j].ToString(); + headers[j] = temp; + } + table.RemoveAt(0); + var conTable = new ConsoleTable(headers); + foreach (List row in table) + { + object[] rowArray = new object[row.Count]; + for (int i = 0; i < row.Count; i++) + { + rowArray[i] = row[i]; + } + conTable.AddRow(rowArray); + } + Console.WriteLine(); + iteration++; + conTable.Write(Format.Alternative); + } + } + + public static void Print(BranchAndBoundSimplex branchAndBoundSimplex) + { + var tree = branchAndBoundSimplex.Results; + PrintBranchResults(tree.Root); + List> bestCandidate = branchAndBoundSimplex.GetBestCandidate(); + + Console.WriteLine("\n\nThis is the best solution of all the candidates:\n"); + for (int i = 0; i < bestCandidate.Count; i++) + { + for (int j = 0; j < bestCandidate[i].Count; j++) + { + Console.Write($"\t{bestCandidate[i][j]:0.###}"); + } + Console.WriteLine(); + } + } + + private static void PrintBranchResults(BinaryTreeNode root, string previousProblem = "0") + { + if (root == null) + return; + + if (previousProblem.Equals("0")) + { + Console.WriteLine("\n\n"); + Console.WriteLine("Sub-Problem 0"); + + for (int i = 0; i < root.Data.Count; i++) + { + for (int j = 0; j < root.Data[i].Count; j++) + { + for (int k = 0; k < root.Data[i][j].Count; k++) + { + Console.Write($"\t{root.Data[i][j][k]:0.###}"); + } + Console.WriteLine(); + } + Console.WriteLine("\n\n"); + } + + PrintBranchResults(root.LeftNode, "1"); + PrintBranchResults(root.RightNode, "2"); + } + else + { + Console.WriteLine("\n\n"); + Console.WriteLine($"Sub-Problem {previousProblem}"); + + for (int i = 0; i < root.Data.Count; i++) + { + for (int j = 0; j < root.Data[i].Count; j++) + { + for (int k = 0; k < root.Data[i][j].Count; k++) + { + Console.Write($"\t{root.Data[i][j][k]:0.###}"); + } + Console.WriteLine(); + } + Console.WriteLine("\n\n"); + } + + PrintBranchResults(root.LeftNode, previousProblem + ".1"); + PrintBranchResults(root.RightNode, previousProblem + ".2"); + } + } + } +} diff --git a/Presentation/packages.config b/Presentation/packages.config new file mode 100644 index 0000000..f00be04 --- /dev/null +++ b/Presentation/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Program.cs b/Program.cs deleted file mode 100644 index 7b24a41..0000000 --- a/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ - -class lpr381 -{ - static void Main() - { - //simplex simplex = new simplex(); - //simplex.simplexAlgo(); - //twoPhaseSimplex twoPhaseSimplex = new twoPhaseSimplex(); - //twoPhaseSimplex.twoPhaseSimplexAlgo(); - //chesssolver chesssolver = new chesssolver(); - //chesssolver.chessAlgo(); - dualSimplex dualSimplex = new dualSimplex(); - dualSimplex.dualSimplexAlgo(); - } -} - diff --git a/chess.cs b/chess.cs deleted file mode 100644 index 2f25a44..0000000 --- a/chess.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - - class chesssolver - { - static int N; - static void printBoard(int[,] board) - { - for (int i = 0; i < N; i++) - { - for (int j = 0; j < N; j++) - { - Console.Write(board[i, j] + " "); - } - Console.Write("\n"); - } - } - static Boolean toPlaceOrNotToPlace(int[,] board, int row, int col) - { - int i, j; - for (i = 0; i < col; i++) - { - if (board[row, i] == 1) return false; - } - for (i = row, j = col; i >= 0 && j >= 0; i--, j--) - { - if (board[i, j] == 1) return false; - } - for (i = row, j = col; j >= 0 && i < N; i++, j--) - { - if (board[i, j] == 1) return false; - } - return true; - } - static Boolean theBoardSolver(int[,] board, int col) - { - if (col >= N) return true; - for (int i = 0; i < N; i++) - { - if (toPlaceOrNotToPlace(board, i, col)) - { - board[i, col] = 1; - if (theBoardSolver(board, col + 1)) return true; - - board[i, col] = 0; - } - } - return false; - } - public void chessAlgo() - { - Console.WriteLine("state size of chess table example: 4"); - N = Convert.ToInt32(Console.ReadLine()); - int[,] board = new int[N, N]; - if (!theBoardSolver(board, 0)) - { - Console.WriteLine("Solution not found."); - } - printBoard(board); - Console.ReadLine(); - } - } diff --git a/dualSimplex.cs b/dualSimplex.cs deleted file mode 100644 index 6423669..0000000 --- a/dualSimplex.cs +++ /dev/null @@ -1,223 +0,0 @@ -using ConsoleTables; - -class dualSimplex -{ - public void dualSimplexAlgo() - { - file file = new file(); - Tuple, List> content = file.readFile(); - List zConstraintsList = content.Item1; - List constraintsList = content.Item2; - - // print constraintsList - foreach (zConstraints constraints in zConstraintsList) - { - Console.WriteLine(constraints.minMax + " " + string.Join(" ", constraints.values)); - } - foreach (Constraints constraints in constraintsList) - { - Console.WriteLine(constraints.sign + " " + string.Join(" ", constraints.values)); - } - List> table = new List>(); - table.Add(zConstraintsList[0].values); - // add all constraints in constraintsList to table - foreach (Constraints constraints in constraintsList) - { - table.Add(constraints.values); - } - List> newTable = new List>(); - - // add all rows in table to newTable - foreach (List row in table) - { - // add all columns in row to newTable without reference to table - List newRow = new List(); - for (int i = 0; i < row.Count; i++) - { - newRow.Add(row[i]); - - } - newTable.Add(newRow); - } - int varCount = newTable[0].Count; - table = prepareTable(newTable, constraintsList); - // print every row in table - printTable(table, varCount); - - } - - - List> prepareTable(List> table, List constraints) - { - List> newTable = new List>(); - foreach (List row in table) - { - List newRow = new List(); - foreach (float value in row) - { - newRow.Add(value); - } - newTable.Add(newRow); - } - List signs = new List(); - foreach (Constraints constraint in constraints) - { - signs.Add(constraint.sign); - } - for (int i = 0; i < signs.Count ; i++) - { - table[0].Add(0); - table[0].Add(0); - - // if sign[i] == "=" copy table[i] to table[i+1] without overwriting table[i+1] - if (signs[i] == "=") - { - List tempRow = new List(); - foreach (float value in table[i+1]) - { - tempRow.Add(value); - } - table.Add(tempRow); - // move last row of table to table[i+2] - for (int j = table.Count - 1; j > i+2; j--) - { - List row = table[j]; - table[j] = table[j-1]; - table[j-1] = row; - } - signs.Add("2="); - for (int j = signs.Count - 1; j > i + 1; j--) - { - string sign = signs[j]; - signs[j] = signs[j-1]; - signs[j-1] = sign; - } - newTable.Insert(i+1, newTable[i+1]); - } - - if (signs[i] == ">=") - { - // multiply table[i+1] by -1 - for (int j = 0; j < table[i+1].Count; j++) - { - table[i+1][j] = table[i+1][j] * -1; - } - } - - // add 3 0s to each row for every column in table - for (int j = 0; j < signs.Count ; j++) - { - if (signs[i] == ">=") - { - // make s = 1 - if (i == j) - { - table[i+1].Add(0); - table[i+1].Add(1); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - } - } - else if (signs[i] == "<=") - { - //make e = 1 - if (i == j) - { - table[i+1].Add(-1); - table[i+1].Add(0); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - } - } - else if (signs[i] == "=") - { - // make a = 1 - if (i == j) - { - table[i+1].Add(-1); - table[i+1].Add(0); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - } - } - else if (signs[i] == "2=") - { - // make a = 1 - if (i == j) - { - table[i+1].Add(0); - table[i+1].Add(1); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - } - } - } - } - table[0].Add(0); - - // remove intex newTable.Count-1 from table and place it in the back of table - for (int i = 1; i < table.Count; i++) - { - table[i].RemoveAt(newTable[i].Count-1); - if (signs[i-1] == ">=" || signs[i-1] == "2=") - { - table[i].Add(newTable[i][newTable[i].Count-1] * -1); - } - else - { - table[i].Add(newTable[i][newTable[i].Count-1]); - } - - } - // remove the value of newTable.Count-1 from table[1] and place it in the back of table[1] - return table; - } - - void printTable(List> table, int varCount) - { - int count = 1; - string[] headers = new string[table[0].Count]; - for (int i = 0; i < table[0].Count; i++) - { - if (i < varCount) - { - headers[i] = "x" + (i + 1); - } - else if (i < table[0].Count - 1) - { - headers[i] = "e" + (count); - headers[i+1] = "s" + (count); - i = i + 1; - count++; - } - else - { - headers[i] = "rhs"; - } - } - var conTable = new ConsoleTable(headers); - foreach (List row in table) - { - // convert row to object array - object[] rowArray = new object[row.Count]; - for (int i = 0; i < row.Count; i++) - { - rowArray[i] = row[i]; - } - conTable.AddRow(rowArray); - } - conTable.Write(Format.Alternative); - } -} \ No newline at end of file diff --git a/file.cs b/file.cs deleted file mode 100644 index fc52588..0000000 --- a/file.cs +++ /dev/null @@ -1,81 +0,0 @@ -class file -{ - public Tuple,List> readFile() - { - List zConstraintsList = new List(); - List constraintsList = new List(); - //read file "input.txt" line by line - string line; - StreamReader file = new StreamReader("input.txt"); - while ((line = file.ReadLine()) != null) - { - // if line contains "min" or "max" - if (line.Contains("min") || line.Contains("max")) - { - zConstraints constraints = new zConstraints(); - if (line.Contains("min")) - { - constraints.minMax = "min"; - } - else - { - constraints.minMax = "max"; - } - // remove "min" or "max" from line - line = line.Remove(0, line.IndexOf(constraints.minMax) + constraints.minMax.Length); - // split line by " " - string[] lineArray = line.Split(' '); - //remove empty elements from array - lineArray = lineArray.Where(x => !string.IsNullOrEmpty(x)).ToArray(); - - // add variables to constraints.variables after parsing them to float - List variables = new List(); - foreach (string variable in lineArray) - { - variables.Add(float.Parse(variable)); - - } - constraints.values = variables; - // add constraints to list - zConstraintsList.Add(constraints); - } - else - { - // split line by " " - string[] lineArray = line.Split(' '); - //remove empty elements from array - lineArray = lineArray.Where(x => !string.IsNullOrEmpty(x)).ToArray(); - // for each element in array - Constraints constraints = new Constraints(); - List variables = new List(); - foreach (string variable in lineArray) - { - if (variable.Contains("=") || variable.Contains(">") || variable.Contains("<")) - { - constraints.sign = variable; - } - else - { - variables.Add(float.Parse(variable)); - } - } - constraints.values = variables; - constraintsList.Add(constraints); - } - } - file.Close(); - return new Tuple, List>(zConstraintsList, constraintsList); - } -} -class zConstraints -{ - public string minMax; - public List values; -} - -class Constraints -{ - public List values; - - public string sign; -} \ No newline at end of file diff --git a/input.txt b/input.txt deleted file mode 100644 index 26dcc6e..0000000 --- a/input.txt +++ /dev/null @@ -1,8 +0,0 @@ -max +1 +1 -+8 +4 = 160 -+4 +4 <= 100 -+1 +0 <= 17 -+1 +0 >= 5 -+0 +1 >= 2 -+1 -1 >= 0 -+1 -4 <= 0 \ No newline at end of file diff --git a/lpr381.csproj b/lpr381.csproj deleted file mode 100644 index 3e87d60..0000000 --- a/lpr381.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net6.0 - enable - enable - - - - - - - diff --git a/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs deleted file mode 100644 index 36203c7..0000000 --- a/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/obj/Debug/net6.0/apphost b/obj/Debug/net6.0/apphost deleted file mode 100755 index 7f19e3f8136b782b25a602434e345674c443eaea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77184 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 diff --git a/obj/Debug/net6.0/lpr381.AssemblyInfo.cs b/obj/Debug/net6.0/lpr381.AssemblyInfo.cs deleted file mode 100644 index 3a56d86..0000000 --- a/obj/Debug/net6.0/lpr381.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("lpr381")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("lpr381")] -[assembly: System.Reflection.AssemblyTitleAttribute("lpr381")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/obj/Debug/net6.0/lpr381.AssemblyInfoInputs.cache b/obj/Debug/net6.0/lpr381.AssemblyInfoInputs.cache deleted file mode 100644 index 7a1b048..0000000 --- a/obj/Debug/net6.0/lpr381.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -19ef02a5be1a65bf6b975f4a44f162accba6b382 diff --git a/obj/Debug/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index d611449..0000000 --- a/obj/Debug/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -is_global = true -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = lpr381 -build_property.ProjectDir = /home/mrfluffy/Documents/c#/lpr381/ diff --git a/obj/Debug/net6.0/lpr381.GlobalUsings.g.cs b/obj/Debug/net6.0/lpr381.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/obj/Debug/net6.0/lpr381.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/obj/Debug/net6.0/lpr381.assets.cache b/obj/Debug/net6.0/lpr381.assets.cache deleted file mode 100644 index 0c3df25a6a908397753554a77ee5c0d0a409a515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmWIWc6a1rU|?8&-;jBsO}Kq(*v3oe>n3V2uAb%9xZL>G+q=D$vN~FM%2pSDc@dT9TNQlUl5A zq-UaMq@R;dC23f{@%6QdyAd3fGD3K3+8U z@i8zk#F65>(!7$)+*Divg>Vc+9kSK@XjTg_Ffe41V0B4qMTuT&UUGg)W?nij2N=U* zDg>n36{;H98G>le5Mp3p$RouW8AYjyASdXRBo=4mj247L;Oav_>XDryjOG*(Xl_QP zK8T}PSx$JC z2B{T<@(}3RRJNZ3wWd+ww3WVw=%!I6gTMJS+rR3z`P3^`QrVy?V2<8rR3_}rR zC!)f`j6$>=rHaQGNS*`5JJvj>jiD7$W}z3JIP#`09wSh5F~}91j>W~PB_J=c7eU;{ z>6~9s>64$Fn8Q+1RGKQ}l3HAnnU@G^76g|jfl`bhO3?>0#T=S+NKN}H(BcIt;z3S9 GttJ79s|C{l diff --git a/obj/Debug/net6.0/lpr381.csproj.AssemblyReference.cache b/obj/Debug/net6.0/lpr381.csproj.AssemblyReference.cache deleted file mode 100644 index 24f85a77bca2682d0e1936c0e2cdd1169ba705b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71141 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 CY8X5K diff --git a/obj/Debug/net6.0/lpr381.csproj.CopyComplete b/obj/Debug/net6.0/lpr381.csproj.CopyComplete deleted file mode 100644 index e69de29..0000000 diff --git a/obj/Debug/net6.0/lpr381.csproj.CoreCompileInputs.cache b/obj/Debug/net6.0/lpr381.csproj.CoreCompileInputs.cache deleted file mode 100644 index dfdc1a2..0000000 --- a/obj/Debug/net6.0/lpr381.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -8c13023fa8aa1aee00b6cf6a6819800d58bb1521 diff --git a/obj/Debug/net6.0/lpr381.csproj.FileListAbsolute.txt b/obj/Debug/net6.0/lpr381.csproj.FileListAbsolute.txt deleted file mode 100644 index 40c2278..0000000 --- a/obj/Debug/net6.0/lpr381.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,17 +0,0 @@ -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.csproj.AssemblyReference.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.AssemblyInfoInputs.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.AssemblyInfo.cs -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.csproj.CoreCompileInputs.cache -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/lpr381 -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/lpr381.deps.json -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/lpr381.runtimeconfig.json -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/ref/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/lpr381.pdb -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/ref/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.pdb -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.genruntimeconfig.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Debug/net6.0/lpr381.csproj.CopyComplete -/home/mrfluffy/Documents/c#/lpr381/bin/Debug/net6.0/ConsoleTables.dll diff --git a/obj/Debug/net6.0/lpr381.dll b/obj/Debug/net6.0/lpr381.dll deleted file mode 100644 index 804d884cf49910263d57d5ebc7f981553abe5563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 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 UGv$jhf{tsHkTn8R`k+&V0Nc;x6aWAK diff --git a/obj/Debug/net6.0/ref/lpr381.dll b/obj/Debug/net6.0/ref/lpr381.dll deleted file mode 100644 index 5fbb2f808ae7da9eadd1bda54395dae3025bee72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~PF1_lO@qZB}V2L=WZ%>;2bNCf155Y4av>KO(G24;qY zRt5$EFai?-U=<({2!nxv;e;mxgFlFuz`$U@3Syw)28c7(crq}^ph@B7IxsMBASvK* zU|{e-;_Ky>Wu`EIT?O|GI1-T5I503c>6N5blrS(bD1gENkJch=a-|CI(i95C;Z^2u=nDMu;%UB$r4PgHy1V6C>0F zP;pgeqGzCIY+!6?2{MkAAqP}MvoJ6y*D){@urM$*Ff%YH2bUCO=A{>dRD58Eloo7m!03Ou#+?hZ&;)LnQ+%vn2zJcZuO36Nm@$r2xZvMi7q)TvZ4#%wb|+ zaAja-099N94B5;O9y_>RNo9cWK)x4XaDd8jgXJ8-JXUZ8D*&!yT^ZQHVI{y&4whqQ z-~+3ShVld$m=y&WY{6!-GYB!LF??rIVNhd`V$xt>V+di^W?*CZz@!H!y_vKb%oq$9 zOc}%&7#S=X#25q_EExhoH5fyi#0n-h21X>FBMQ$Ag@+`^kc6fW$rOeLJaRD%J}71) z>BDdfPC14Ncx=eQEeExMlVJrDBZD9V$nTO2E10+#G{I~`h80W#43=Qh5lni5$v`j} z2__T4WF}aBBf|VA*CcyBW-0 z%m}ibr2&!~!O0&?fSNg=rVE(Ez`!8QkOgLyFa+XNuwYPXPGSX^Rg92_xgek@KczIe1R(+QoO6C2sBw#s2ue*$ zElSNxPK9YjNWnxvmL}#^A|#+u0TwUGOv=p3EJ2cW%SlX!#V%B(9@L+idFjyPqL-4B z169OOoSB{nW$Oi{ra_YfLvluHaj|1gdOkx*d451fVsUD4W^O@FY6Vyn87zQxhTIlKdnU1IX@-UF)uNvvN#iNG*Z%LfCnBV@f0&u zIp^mUmlP#t=9LsP_$OthCYLbeX6E@OR-k*A0m-WjP;Y{>Cj&-1l0|`$k%L)*fss{# zkx@_(#N`7sZ80)Wa482XQUH@G9E{N3l^m#=3}F%rFG?)%%g=MINKP#PrRR{0qWtn=Mh->> zc5wC10wPTr86@=lTtl4mi&7m63Ur`J!M4my&w!C3gii#Xkz6v13vv=G{StFi8Mql4 z*q{Xq0~aF$D>%b4Fz_%kup8H|#L5e`b2_PDQA?h=5sJCHeV3?4=z_13~28QTb!vtyzhcN^*#5063 zxH1GW1T%Ot_%rx1#4~s@_%XOaMr#=Mvb_HXX*V)Gj3Ad8Fu)q zhE#?khGHat7&7QF7{Dlgz+yA1RT&-@V_)z9KhAp$yXCvQ;wFGf+}U%}dTt$;?Z)RSFGp)3s1iC@x9N zOG(Vh&r7vcs!T0bvbW>nvPpzC@DwU?bMlI9l}d~9tcsH}QgaiFb#q~LyKZuRu2o`j zu3nj;l0t4`US?WqaS5yz1KVcDrJw*e%QGc4uOzdi62(EF3QI{LFEKaOR>`;0v7jI) zGa1}=(@QKUP|^n*P*PM{Tmotx66qQvC6G1+1)Jj3!@Y0EWup&^7&~yD9Cm~QWGq<5YS{T~ J)I&ss0077dZI1u| diff --git a/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs deleted file mode 100644 index 36203c7..0000000 --- a/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/obj/Release/net6.0/apphost b/obj/Release/net6.0/apphost deleted file mode 100755 index 7f19e3f8136b782b25a602434e345674c443eaea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77184 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 diff --git a/obj/Release/net6.0/lpr381.AssemblyInfo.cs b/obj/Release/net6.0/lpr381.AssemblyInfo.cs deleted file mode 100644 index bf0c04a..0000000 --- a/obj/Release/net6.0/lpr381.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("lpr381")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("lpr381")] -[assembly: System.Reflection.AssemblyTitleAttribute("lpr381")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/obj/Release/net6.0/lpr381.AssemblyInfoInputs.cache b/obj/Release/net6.0/lpr381.AssemblyInfoInputs.cache deleted file mode 100644 index 2efcca9..0000000 --- a/obj/Release/net6.0/lpr381.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -b9e0021e723c322ac0b279cab44aef39129eb7a8 diff --git a/obj/Release/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig b/obj/Release/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index d611449..0000000 --- a/obj/Release/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -is_global = true -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = lpr381 -build_property.ProjectDir = /home/mrfluffy/Documents/c#/lpr381/ diff --git a/obj/Release/net6.0/lpr381.GlobalUsings.g.cs b/obj/Release/net6.0/lpr381.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/obj/Release/net6.0/lpr381.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/obj/Release/net6.0/lpr381.assets.cache b/obj/Release/net6.0/lpr381.assets.cache deleted file mode 100644 index 25c323ca864331ddae33418d91262f7e79c59423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmWIWc6a1rU|?9jaP#W7Z(nD%HQua<>R!tGM9M5rBR6xylJsS2OPyElWoBo90}ciT zhG_ka{M=Oi+@iFc(zLWneZAzwlY9lH~lN)Wm`UV?9HCXNam0uqwTjoE&DTO^gf-3``6R3?M!W0|Nsq z0|P?{G4>W$7MG;v>SgBZo9G$q8R!?Krh)7%E=kNwNi0e+)HBr&hA8p$N4Ag+Y9Yw4 zAPYerO(DU;qSUmU)Z~)P{5*md2f>vhJAf0-0ic+vBFh1K1x1;;nI)NJsl~Y5VgL&S zB)0^>bs;;88_iif3=9lSjO4kiq_QA2wW1_7uQ)S552xGU5rpKnkjjEoSGZ1O_wk~+ zkB@7m>X5DGN3&Xhfq@~51glF@D@ycI^OEyZGV{`LIlvee zQz0PLu29v;&JaX%h7bb-Lmny4$S6up1UW&kB(XRfXS5(30#_dbQjhEuVKk?RKyx!P z1xnYvDES^FEA5+^T$Ep&pH`yh=NjUiUzDmBkds)FmS2=x43d|`ln+TPN>42T%W}fA zG)S!=l!r(^AW<0%Q9VS82Psg%RDhc7K#KTaiXh1WBqRbALWv-dgcwW$HNZeppyExL zh&TeN1z}K8NXuduRQiGJ0l5og7jm&H%D})N#=yWJ&cMJR!N9;E$-uxMMeR}mS~XxP zrV+8IhZ-HAga>msdMO~yz`%gb-7+9gB4Jqu1_nOlipw(vHEjwbONONufl4k`aBapL zkXVx8nFp=#l%XELSGOTjDJ!^cQXo_}VJ2h^+***rDJ3TdZ)!KjFoke^KrnZhV;G7k zI}sHgW)!03C{;YhK=K?Y-m&I6Z49l5G7G)%#F003@fd-ci$Sj7bSy4TEdhCny$Iqq zPUrlBN}v4X#2l8AqS90$m(=2t%)CTUvmm%M36x?4QHnm0Ddy0mLu%Srffg@F5f5?- HYBdP}UDF69 diff --git a/obj/Release/net6.0/lpr381.csproj.AssemblyReference.cache b/obj/Release/net6.0/lpr381.csproj.AssemblyReference.cache deleted file mode 100644 index 2f99fd86d9a246e14f2ad0ebb91bb5e92e36c1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70896 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 diff --git a/obj/Release/net6.0/lpr381.csproj.CoreCompileInputs.cache b/obj/Release/net6.0/lpr381.csproj.CoreCompileInputs.cache deleted file mode 100644 index 3d1e6ae..0000000 --- a/obj/Release/net6.0/lpr381.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -1451b566708a8403bb7092754722413801261e62 diff --git a/obj/Release/net6.0/lpr381.csproj.FileListAbsolute.txt b/obj/Release/net6.0/lpr381.csproj.FileListAbsolute.txt deleted file mode 100644 index e85edad..0000000 --- a/obj/Release/net6.0/lpr381.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,15 +0,0 @@ -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/lpr381 -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/lpr381.deps.json -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/lpr381.runtimeconfig.json -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/ref/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/bin/Release/net6.0/lpr381.pdb -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.csproj.AssemblyReference.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.GeneratedMSBuildEditorConfig.editorconfig -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.AssemblyInfoInputs.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.AssemblyInfo.cs -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.csproj.CoreCompileInputs.cache -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/ref/lpr381.dll -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.pdb -/home/mrfluffy/Documents/c#/lpr381/obj/Release/net6.0/lpr381.genruntimeconfig.cache diff --git a/obj/Release/net6.0/lpr381.dll b/obj/Release/net6.0/lpr381.dll deleted file mode 100644 index 4120cd983eb554422de1a5525a77a0a4afce5a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~P(5nC zA%+JGN(|hL1`G@w3=qt~z|g10z`&ruz`y`@m;;2(1aUV=AISY6ngQe}CNPVEnIWN- zfk6O_z=Qxq97=&XHfjtE{vehE1A_r8h=GO^7#MgM7#K2C85ly)r0{YT;7$iC<4|B= z@Bp(QgkDK%MF|4~!xT2Czd(M4x*MVb?8OAVqT-@t2B_OWeg~=Nf~kPe4h#$qdPS)@ z`NC?SIo`8 zz@?@o$E3l-z`zBkor1lb7{R7O+*oF!XP{?nU~Fg!GL)4ehk=1%10w^2avcMM3=;zb z4-*4}a&SpeW?p(RNQDLqB(9Z1gBf&Kz_H1o>>ldr!oa{_!@|IDgn@xU*(oPK38Wa} zeMWZ?1`bXT{}-b%gBaL947>~s;Pehk^PqSI1trw4;2>jQC}ITh85r0YUNCH7WMi;m z1d&b*3mN$tt}ueca~UES*%%ZVI~my+PBMVVHZZvuOmcw5!@z7NrdmcW1`Y-ZkSiGY z!6YOU1i)co$N=MgV`N|e@t7F`Krz5Dk)efAm4T5V0?ccZn9az>z{rq*!sBF^&B(|g z$N-X)WSGs!#h}SBn^Azl5KLNvNk=g02_^%pU_Fz7K@GpuCLV{m5J#-PXG4Hge(n7|;)z|sH-S+M88 z1StHF6OIgnF<2Z`>@i3gSezlJpvc(5kijRjxFo@l!NxZ~r8Fnijv=_RxFj`K&pAIQ zCpEbwGe56b&pkCSwJ0+gCKXhgSCW~V%HWckRGOZin3R+1SW;4ynN(Vm%HUXBoSK`I zQyG$3f-D@8Sd^Yx;#QQHn_8YBQE+NeS!Qx-F*HUp^U{6uQ&Qo|k)o0zIX|zsq$n{nucVm4 zKPf9U8B`pC(?g70U+|xdHGXS5?=!D8?rLISQD9``U{+vYWL02f6chw;`Pf8-Oc{lE zI5ybF*9%_dvSManVB}x~R~ZZpa-eJ#!Xy@6lvv=GpXXYUoLT^ivyhCU{PJRuI#BV* zz+lSAAfe~y8seN^l>#JF!~07?2cq$VA!L|z_5oM zDhVlX8H5=a7}OaU7(~?=7(_vJ0zw*8lOgdK7=nUbf@|6(i}{#lxi@rY*?aD`yba1! z`WgATsrtD^X*s27X_fje`N^fZsd**E`pL@r5O?e6CuQkFovojjT4JVW0F}`zNJ(M{ z_HZ;ZHDiF9-3~Jw2 zki(G5;K`83kj9V?R-^)M1&1&cF(fkNF%&c8FeEaRFk~|1GvtBg85lOOfZ8RD48aT~ z3`Go?40#OcSWJ4s2y&SL0}PrlBrzB;Ffiyburn|+I5Xrk~^ zpTkhVP{d%&V8LJr=9_`l!(8gZkjhZZkPNoB0L5MC`V1I27#QL13S&rRC}Jo^@`oXV z9)kfKGccGja5FH1L!tz%Hjg2ZAqUB2$mZ)Yq%h=wTWbsq8VpPfj0`>usSN309Uz|- zFjRtFn9h*F04mTyMS>mJe1E7oDAYja!~6xZ4H5#l?16+^07DT&K0^vaDMKqu7#39aY)1bSx;y$xH^f zMD!913Y7H029y+)7MFn9Iz+n0NC~7(LBXatHMz7Xv!oKjRZy@gN-Zo+EiOq-2`I`e z%gjklPc0_WOk=2-3JS=^xK^Ylmx8KtpVYF{9EBVZX{(f2?3q`VpPgEyq)?jan4Fwi zTx_e9mY7qV3h@xw41FwafwEm<>O#jrxdi G2mk;Lx}Mem diff --git a/obj/Release/net6.0/lpr381.genruntimeconfig.cache b/obj/Release/net6.0/lpr381.genruntimeconfig.cache deleted file mode 100644 index 64c2c6e..0000000 --- a/obj/Release/net6.0/lpr381.genruntimeconfig.cache +++ /dev/null @@ -1 +0,0 @@ -670f060e3646ff2f7e8cdecd2b3e98bee644fdfb diff --git a/obj/Release/net6.0/lpr381.pdb b/obj/Release/net6.0/lpr381.pdb deleted file mode 100644 index 2bbf5cca649aae66e8310baf7b2524fbf97795a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10288 zcmZ3@r?d3=N z8Cw`~1r+6{7bWKEB^Pt(GcdC8OUfuKs7}cX*jRLbzOcf}An)8Tt!>A4EU;ZMVd1ry z{}z(&Ezg+qld{-@Qgc!hi&NS1QcKMA3?v}N>AC0RCne^D7K5TwFI_LWm>X(pL`+Jy z!rI#+_C3x!b>7K_}cL|%;VG3^K%Vx&M!)JEGWC0H1Hj6=>2s6qvFD)O{kVZZQ{lc*Gt@C~uCw{qV5RtlhW46lt z-A(Uiim@lZZhv%4f~!fo4B{*XBZlPs+=9%U)FNG&kcpmwo}sRxo{^EEg`u92wuyzg zk%e(ma*9QYnVFfTv4N#wnvsQpK}vF(VX{SHsq{lM_oa^Ya+;3raF` zGpit+B1pV26yzk9q~#aoGC1Z{Iv12O6qV+cWag&A9SaIoGi~$aL zAp%uyh+D!C%?zjxBV0O+;&JLQ!fuo?E~AW5jAB^S?VFiglwX{mR-)$|oRL^mpqG-9 z!@$5e|NfO$h6VR zg90Oi5tGbhRkme5y@v0dTBgogiCrVavXD~OYaq)QGnm6U^-X>DY_B=IWxqX=+rl&R zjE(dHiZXLEOESw+i=meNVhY>@(pc{MeNCWZt<#peWqal&a=0TbgJ=v&P0uVYDXN5O zTb`%e%dmif;arF5?gLFzT_(+|QT=8lubo?*oL`ianFLj~=%v7SkXHise>~&FUFW~@ zYg71#+tZHarIr+zB<7_g7NtN{K9jCLz;J+(!RFdCn=eVz-RJW*EshM}lnSmaE=kSR zb1W!u&d)1Jttf%1-yb>^()}6Q&Y(WRqULflarbZ%2maB&iQ%CrA0-lc`%E9d-=Wu`84b?H&acB zl;>={h}ypWn>4ZLg+#@2kFzTo7#JCz&d>VZdOpy%<4mL%D|7TwEE+s>b4yD=c?jw$ zhqUe83=WJ8Htz1`jW-uM@2)V-uU#$fiAAelex7@3UTRThGF0!EcTsad?%eu7xkD{l z#&@>8`US56)xZr^Wuo?gNlMDwK7;cnYxDnmR>$7PN^Wl#?4tufdcS$Ts z#55yMN%j#ak{GuJ^?21*dM&CJ+hEJ$_E&nrtUDoHJZ#+<3RUlS##yYAaK%NbP?fBEc+P@Ue$mqZD{i3c*wyv)c!#wm zEGR(nrstfWo132p)!=`}U>ZXM6T?QWFz?;BTAWswh3#F@D+5b(U=1K5IJLyJq9ipB zRJX&@jH9p6Qji}kt(IJ5cfIb{WTwN}`AN+X>MW2ps4ZMUejh;2YGF+AIQ#vU>jKv2 zsf*o;5!G5Ngwi;pQ5jlm^}$=M-AiOH}8aOzOBOcD$DUY+t^V;{j>|40Ko;}^h4yws5zbH4cq*%|fIL{EOW9gm#8z2w!Rw#TpAmZ*d zoA<{}@wg}>s18Vb9@@6lb56`j1=ZBBIEvr9YzN4?jlTDs#e*um=3ZsmIc52Z>sU2I z!meo@PYX!P@tZo{?eXh8Hk*hYOUjv2ja3UqLGg9MrZphl|FWN?F7sUOy=AtyXY(r2 zM5u00e^8lJP?TB>DqZxPit{tLXW zzACHPk_Xk|>92=m0K`src7AYG`{+#Ov~ZUx4$C*@a)~INIfhk>OHpQ7DpFzAoLW8~ z`}ht^FM?>-_+dvqDtSyf`Zf(P+-Bb2Y+Vs1dwCXjg_W#tz__R z_?mga=+Yu5gwBA>g4AL?Y|-*Z>Fs5Z-V@h!UKyS3^jw$W$p73sQ4U=%Bt~?cSGR!N z`0sK+u;md|wk3FLO3cYgg{4Xn;geHA7RhhkxGOW6*LmIa zEh{r@p2Gqi?4-cb)S^nHCbP_;Pm@4;>L(rRmo<6fyeFMsbkD)+-%x8H9*275_9fj0 zh6fA`9Fq&DJ}i^-S)#Ccdg9LGccE(iQeka=Uy0MNL1E+dtKg)E%L}L38d?hdyqN+> z3O!0nU>!YMpXc*Hot)=MTsOnhReU@1%e#}CHU^-p_9}+An`|_1w}UMB^z*-G?tKx@ z?Xh3N=N#^@MAL#+sm6C!9tTDE8|UAL{|L_a-r6{=#4_Is)+zzH-#0N67Mk_!3ZFqC zb7#)x{3T8A{kx95nRmkfBC>D&5_407Qj7C*N1DYE4c)BI`A{M*ycFO1sxI~hrD0HT&$ za&rC?P$-zr=s$LO&Q$NY4#rpFCLU=;R*l|YjpNGQ3bMgwXVm#mv-y1%ozYbORCr$> zNl#E}VQFeHya{-23-2jVtefh6@L&6n&A;vWwFmEn?^_}12u@8dEy^r`b#AZBIWz}U z)l2FAu(A>r^`w_z13D4c^+i^?*SQv>od;T^>jhv)qV`Nn<~(`QB2(sqQr@MK5NM z{=rUai$c$#Y7QvMuYd)_r4tLl%@_f<_l0Kv4?6Z)$;KVN+i8rdBN*x{6qg#l(f}8O z>h6j?x@>pdcPy1@nZ84#2D?^BfwtnA3n>3&PvQkb67Tu^@( zR=~(j{{(iN{D&vyuYJQ@r!ZF>Dx6a$jIKH?HMt}oJ`}+7+jBoC{glhqO?S;P^qbgh zP`2^aiqlYC{z+M>$b)oR3Grm?^Kahx zepx1~{$Wh@uDO}8;;QPk{!~y3Z}zyg+P+BCd7o|ZCl$7*6*x3``hZ6cko%J#XNdg; zg}mWaF1LD)N6!0|O;tCk6i&inf=_08MoD=ph=iuC72Xs3LGD%v>5q%8zUVq7Olf<} z3ypLv2B7x?yRBz}`+=K9iWW{^&hE9!zDdeY+&BhPt8Z#aVoG93BGk^U{@?F0C@?XY z{)kE_yMEVikJ*wx2Co;vMoW-l2BSrx9c*?E7v`hJ=9!IGv$RnfT!S5s)eTJWFRd9=_zfd7IhoT*Di%jwx!V z=4WQ-Q-%h11{F&l#~nvrx~!a3@+4+f;(9bIF`{Pbv-*1=OYTmTFW8rT+i~lw4NZUl zXcwXB^GM7~$$<}oI@e7D7bR=;3z(lZ2D@*wXb#Wp>VXxjFqe7em82Hs7r?^^l4U*D z=dA-ZbY4EwjQy^k?>{p&d)n#;MnBMOMAr;86tfO>ElU88gYDgX{`r3Esjl<)K)G<_@2HP~`xP zlE&KY^FW~`9>T1D%l)BypD<6jJO9=@XnOomOWxI@lb3;V&&50ZZ5iKZxJ_2r*=3Ww z0oLGwxiC1j2t3M&T+l3O+y4h-VcW(z3{4YEo#%2#eX{dgw;#321__Afr;xF(*C0D6=F3Zpx}q);pk9i_6Oc z&zQHYcbakL&Lp{4H}2sz#Th=<^1hV$KFASz|BNoSr?`1{l+2!U@^&^ZiatBYF=0r3g)M5n>bRM6`Q60oyKnIZ0!9KV zTKM$<$RR&&y}p~)(&ah%`&tP(53YH5O^Glyuyjr>D#=U(%>=@WF!92wUQmkIm~(V~ zt@>{NcHaFaSK_03V()f3qoIbW?o8uIV=hOv9MkZ^6{s{^%wjl zZ5^7|?b}>^?A0E0{a^>ALRJVsizt59j{7ZvbgFpKX*EU#0D{^yI4Z+YA#jv1*1y zhVQYH;3{idI4rxo`t`Kedaz6%l2MeJ z2+p9+8Hss$sqo=op0kYLE>*+lmdoig8hvJe%(rEq4`as4QY`~ZqI$9?O?{H`f`&wl%`S)%OZZ48|u ziN)E)dZ4+9w4D5MsBX6hQ^CDnKJ}Qrwx_M#RwosGE&4na)~7&t52735*aP?Lz}38+ zAHR)rz$@Q|X63-3IXe#Fuo5HQcUT49207VFQ)B90iFM8mi_|TbF7oWdp&xCi<=W$E z(?Pn8IYkfq&vx`#7t}29++{@;rfzT;Lp_>s!}u2{&BV^+N($3E;k1K=5!EthfV z3dn~KIIjN8yA@=gerLJnZuuaujaQRuqsGfcs+?O}@O>Bf(YNOqt$?I4yVui<+Nvh2@_ z5Dp{dZ~n8S{mWS7Il7-tPUit@ zoWK6j)%XbFgWNHrRL-(L;S=5ia;g?1_mJ{MUY^2LKPY14c8F(7IRYd zvBpWy!W?z{J47=q|#*zzO32Vl-wD zgSej;TnB*V8Mql3z!>B&5N2S=W`xje496H&FtRZiGlED3hN+DF3?~>t1?YdUxHm%} zBO8MhV=W^a!*T`?nF1yo!Q?YAX#yr6GnRpkgp~V`5D)-|gDC@ycb$=e0mNfs2mqDl z3~dtqjBE^yXgp4aenv(HK?abVBtt(V7lS64ZOG8iD8OI|CLO_~CzuQblaXLD5lrea za5Km;=rIU0s59s>NHe%G=rJfW_%rA+XfuQ`=rI^GbTQ~LSTjsx&|`3BSj?cu;LWgs zL60FAEFR6!#lX@42}Mw#LNLg4$W@OhgCIl#MCKF}8Cw`K*!bqBl;)(`F$7l@m!#(E z1(oKNWag$axTGePrl%(+<)k{6loVwqm6oJ3I2ISD<|gG-hGdo?3x^~YrKgs-6(#1T zmgg5`W2$${%t;MPEh^5;&%>1T%uCBJ%1tcE%+E{A!KunQKQApay|f6d4q=FMer`c# z4p=ZKH7BtG%qm96!(1Ftl%G_3XF_`f*>v*#|HcOdcmt)Rve7b#*iE+AA~T8g%>3j_~qxh zRwSnufE*l>QIua^%*eqA%FLkV7AUQmGBQZ$`MHKT=NF|q78K|}!@#!8OwWLkA%sr^ zo<>|UiwklREBz94QyI7!8Q35}#K6GA$iN>KT9_0|OT$1FIo~3Gxmc zLz{?jz6Z2?1PLU8*x+0X;-O+#ISLVtcg`67+VJKoq zWXNMEX2@YkWGG?CWXNa81IvSIMjlXQ!w}3+!cfGJ$&km8j>V)Gj3B!W7+}zZA&J3& zfq_Afft`Vo!I>eSA(x>5Y)2)7A44KTE<-BV{2Yb?h9U-I1`7s5Fy9QU9_CUPhE#@P zhGek41t{)9*Jr@M!N3T2R~SPoLlHwUl0OU?^cW1_n1R8Jft!I591LE+`d zP|Q%wkjjwDki?L~P|2XcfLjkJ{1_N~k{KB8Ly{fHT88(#_uJT4%yo0(jcU!0#-qMMwbYn51>t5;^Iq>!7KmzkDYTmmZ=!M53PDJa0r z@=Qt1E6FUWL~#(P&{I;#OUzBRRr0NLEGWpyOa|9;dWi)EO8Q^}N{UL0OF%U#k*+aP z0%=oFuqjSWE-lI|sf2J96l{u83rkarOHxw;iZaVGb5he&i-|PT7;2`10;5Pup=BGV*w?m!_H@;9wH(H04~05@c;k- diff --git a/obj/lpr381.csproj.nuget.dgspec.json b/obj/lpr381.csproj.nuget.dgspec.json deleted file mode 100644 index 97d3620..0000000 --- a/obj/lpr381.csproj.nuget.dgspec.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "format": 1, - "restore": { - "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj": {} - }, - "projects": { - "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj", - "projectName": "lpr381", - "projectPath": "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj", - "packagesPath": "/home/mrfluffy/.cache/NuGetPackages", - "outputPath": "/home/mrfluffy/Documents/c#/lpr381/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/home/mrfluffy/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "ConsoleTables": { - "target": "Package", - "version": "[2.4.2, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[6.0.6, 6.0.6]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.106/RuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/obj/lpr381.csproj.nuget.g.props b/obj/lpr381.csproj.nuget.g.props deleted file mode 100644 index 063c70c..0000000 --- a/obj/lpr381.csproj.nuget.g.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - /home/mrfluffy/.cache/NuGetPackages - /home/mrfluffy/.cache/NuGetPackages - PackageReference - 6.0.2 - - - - - \ No newline at end of file diff --git a/obj/lpr381.csproj.nuget.g.targets b/obj/lpr381.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/obj/lpr381.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json deleted file mode 100644 index 1d2eef3..0000000 --- a/obj/project.assets.json +++ /dev/null @@ -1,741 +0,0 @@ -{ - "version": 3, - "targets": { - "net6.0": { - "ConsoleTables/2.4.2": { - "type": "package", - "dependencies": { - "System.Reflection.TypeExtensions": "4.3.0" - }, - "compile": { - "lib/netcoreapp3.1/ConsoleTables.dll": {} - }, - "runtime": { - "lib/netcoreapp3.1/ConsoleTables.dll": {} - } - }, - "Microsoft.NETCore.Platforms/1.1.0": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.NETCore.Targets/1.1.0": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "System.IO/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - }, - "compile": { - "ref/netstandard1.5/System.IO.dll": {} - } - }, - "System.Reflection/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - }, - "compile": { - "ref/netstandard1.5/System.Reflection.dll": {} - } - }, - "System.Reflection.Primitives/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - }, - "compile": { - "ref/netstandard1.0/System.Reflection.Primitives.dll": {} - } - }, - "System.Reflection.TypeExtensions/4.3.0": { - "type": "package", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - }, - "compile": { - "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": {} - }, - "runtime": { - "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} - } - }, - "System.Runtime/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - }, - "compile": { - "ref/netstandard1.5/System.Runtime.dll": {} - } - }, - "System.Text.Encoding/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - }, - "compile": { - "ref/netstandard1.3/System.Text.Encoding.dll": {} - } - }, - "System.Threading.Tasks/4.3.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - }, - "compile": { - "ref/netstandard1.3/System.Threading.Tasks.dll": {} - } - } - } - }, - "libraries": { - "ConsoleTables/2.4.2": { - "sha512": "0SRFOWYCgFQ0RfAMof2DsGEJHI2YKquCA4X26kKyuG+MG+/2R3NRgRVEqXDMU7eVP69MGDzb1eg4i3/APlIfQg==", - "type": "package", - "path": "consoletables/2.4.2", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "consoletables.2.4.2.nupkg.sha512", - "consoletables.nuspec", - "lib/net40/ConsoleTables.dll", - "lib/net40/ConsoleTables.pdb", - "lib/netcoreapp3.1/ConsoleTables.dll", - "lib/netcoreapp3.1/ConsoleTables.pdb", - "lib/netstandard1.3/ConsoleTables.dll", - "lib/netstandard1.3/ConsoleTables.pdb" - ] - }, - "Microsoft.NETCore.Platforms/1.1.0": { - "sha512": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", - "type": "package", - "path": "microsoft.netcore.platforms/1.1.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "microsoft.netcore.platforms.1.1.0.nupkg.sha512", - "microsoft.netcore.platforms.nuspec", - "runtime.json" - ] - }, - "Microsoft.NETCore.Targets/1.1.0": { - "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", - "type": "package", - "path": "microsoft.netcore.targets/1.1.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "microsoft.netcore.targets.1.1.0.nupkg.sha512", - "microsoft.netcore.targets.nuspec", - "runtime.json" - ] - }, - "System.IO/4.3.0": { - "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "type": "package", - "path": "system.io/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.IO.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.IO.dll", - "ref/netcore50/System.IO.dll", - "ref/netcore50/System.IO.xml", - "ref/netcore50/de/System.IO.xml", - "ref/netcore50/es/System.IO.xml", - "ref/netcore50/fr/System.IO.xml", - "ref/netcore50/it/System.IO.xml", - "ref/netcore50/ja/System.IO.xml", - "ref/netcore50/ko/System.IO.xml", - "ref/netcore50/ru/System.IO.xml", - "ref/netcore50/zh-hans/System.IO.xml", - "ref/netcore50/zh-hant/System.IO.xml", - "ref/netstandard1.0/System.IO.dll", - "ref/netstandard1.0/System.IO.xml", - "ref/netstandard1.0/de/System.IO.xml", - "ref/netstandard1.0/es/System.IO.xml", - "ref/netstandard1.0/fr/System.IO.xml", - "ref/netstandard1.0/it/System.IO.xml", - "ref/netstandard1.0/ja/System.IO.xml", - "ref/netstandard1.0/ko/System.IO.xml", - "ref/netstandard1.0/ru/System.IO.xml", - "ref/netstandard1.0/zh-hans/System.IO.xml", - "ref/netstandard1.0/zh-hant/System.IO.xml", - "ref/netstandard1.3/System.IO.dll", - "ref/netstandard1.3/System.IO.xml", - "ref/netstandard1.3/de/System.IO.xml", - "ref/netstandard1.3/es/System.IO.xml", - "ref/netstandard1.3/fr/System.IO.xml", - "ref/netstandard1.3/it/System.IO.xml", - "ref/netstandard1.3/ja/System.IO.xml", - "ref/netstandard1.3/ko/System.IO.xml", - "ref/netstandard1.3/ru/System.IO.xml", - "ref/netstandard1.3/zh-hans/System.IO.xml", - "ref/netstandard1.3/zh-hant/System.IO.xml", - "ref/netstandard1.5/System.IO.dll", - "ref/netstandard1.5/System.IO.xml", - "ref/netstandard1.5/de/System.IO.xml", - "ref/netstandard1.5/es/System.IO.xml", - "ref/netstandard1.5/fr/System.IO.xml", - "ref/netstandard1.5/it/System.IO.xml", - "ref/netstandard1.5/ja/System.IO.xml", - "ref/netstandard1.5/ko/System.IO.xml", - "ref/netstandard1.5/ru/System.IO.xml", - "ref/netstandard1.5/zh-hans/System.IO.xml", - "ref/netstandard1.5/zh-hant/System.IO.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.io.4.3.0.nupkg.sha512", - "system.io.nuspec" - ] - }, - "System.Reflection/4.3.0": { - "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "type": "package", - "path": "system.reflection/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Reflection.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Reflection.dll", - "ref/netcore50/System.Reflection.dll", - "ref/netcore50/System.Reflection.xml", - "ref/netcore50/de/System.Reflection.xml", - "ref/netcore50/es/System.Reflection.xml", - "ref/netcore50/fr/System.Reflection.xml", - "ref/netcore50/it/System.Reflection.xml", - "ref/netcore50/ja/System.Reflection.xml", - "ref/netcore50/ko/System.Reflection.xml", - "ref/netcore50/ru/System.Reflection.xml", - "ref/netcore50/zh-hans/System.Reflection.xml", - "ref/netcore50/zh-hant/System.Reflection.xml", - "ref/netstandard1.0/System.Reflection.dll", - "ref/netstandard1.0/System.Reflection.xml", - "ref/netstandard1.0/de/System.Reflection.xml", - "ref/netstandard1.0/es/System.Reflection.xml", - "ref/netstandard1.0/fr/System.Reflection.xml", - "ref/netstandard1.0/it/System.Reflection.xml", - "ref/netstandard1.0/ja/System.Reflection.xml", - "ref/netstandard1.0/ko/System.Reflection.xml", - "ref/netstandard1.0/ru/System.Reflection.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.xml", - "ref/netstandard1.3/System.Reflection.dll", - "ref/netstandard1.3/System.Reflection.xml", - "ref/netstandard1.3/de/System.Reflection.xml", - "ref/netstandard1.3/es/System.Reflection.xml", - "ref/netstandard1.3/fr/System.Reflection.xml", - "ref/netstandard1.3/it/System.Reflection.xml", - "ref/netstandard1.3/ja/System.Reflection.xml", - "ref/netstandard1.3/ko/System.Reflection.xml", - "ref/netstandard1.3/ru/System.Reflection.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.xml", - "ref/netstandard1.5/System.Reflection.dll", - "ref/netstandard1.5/System.Reflection.xml", - "ref/netstandard1.5/de/System.Reflection.xml", - "ref/netstandard1.5/es/System.Reflection.xml", - "ref/netstandard1.5/fr/System.Reflection.xml", - "ref/netstandard1.5/it/System.Reflection.xml", - "ref/netstandard1.5/ja/System.Reflection.xml", - "ref/netstandard1.5/ko/System.Reflection.xml", - "ref/netstandard1.5/ru/System.Reflection.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.reflection.4.3.0.nupkg.sha512", - "system.reflection.nuspec" - ] - }, - "System.Reflection.Primitives/4.3.0": { - "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "type": "package", - "path": "system.reflection.primitives/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Reflection.Primitives.dll", - "ref/netcore50/System.Reflection.Primitives.xml", - "ref/netcore50/de/System.Reflection.Primitives.xml", - "ref/netcore50/es/System.Reflection.Primitives.xml", - "ref/netcore50/fr/System.Reflection.Primitives.xml", - "ref/netcore50/it/System.Reflection.Primitives.xml", - "ref/netcore50/ja/System.Reflection.Primitives.xml", - "ref/netcore50/ko/System.Reflection.Primitives.xml", - "ref/netcore50/ru/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", - "ref/netstandard1.0/System.Reflection.Primitives.dll", - "ref/netstandard1.0/System.Reflection.Primitives.xml", - "ref/netstandard1.0/de/System.Reflection.Primitives.xml", - "ref/netstandard1.0/es/System.Reflection.Primitives.xml", - "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", - "ref/netstandard1.0/it/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.reflection.primitives.4.3.0.nupkg.sha512", - "system.reflection.primitives.nuspec" - ] - }, - "System.Reflection.TypeExtensions/4.3.0": { - "sha512": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "type": "package", - "path": "system.reflection.typeextensions/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Reflection.TypeExtensions.dll", - "lib/net462/System.Reflection.TypeExtensions.dll", - "lib/netcore50/System.Reflection.TypeExtensions.dll", - "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Reflection.TypeExtensions.dll", - "ref/net462/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", - "system.reflection.typeextensions.4.3.0.nupkg.sha512", - "system.reflection.typeextensions.nuspec" - ] - }, - "System.Runtime/4.3.0": { - "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "type": "package", - "path": "system.runtime/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.dll", - "lib/portable-net45+win8+wp80+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.dll", - "ref/netcore50/System.Runtime.dll", - "ref/netcore50/System.Runtime.xml", - "ref/netcore50/de/System.Runtime.xml", - "ref/netcore50/es/System.Runtime.xml", - "ref/netcore50/fr/System.Runtime.xml", - "ref/netcore50/it/System.Runtime.xml", - "ref/netcore50/ja/System.Runtime.xml", - "ref/netcore50/ko/System.Runtime.xml", - "ref/netcore50/ru/System.Runtime.xml", - "ref/netcore50/zh-hans/System.Runtime.xml", - "ref/netcore50/zh-hant/System.Runtime.xml", - "ref/netstandard1.0/System.Runtime.dll", - "ref/netstandard1.0/System.Runtime.xml", - "ref/netstandard1.0/de/System.Runtime.xml", - "ref/netstandard1.0/es/System.Runtime.xml", - "ref/netstandard1.0/fr/System.Runtime.xml", - "ref/netstandard1.0/it/System.Runtime.xml", - "ref/netstandard1.0/ja/System.Runtime.xml", - "ref/netstandard1.0/ko/System.Runtime.xml", - "ref/netstandard1.0/ru/System.Runtime.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.xml", - "ref/netstandard1.2/System.Runtime.dll", - "ref/netstandard1.2/System.Runtime.xml", - "ref/netstandard1.2/de/System.Runtime.xml", - "ref/netstandard1.2/es/System.Runtime.xml", - "ref/netstandard1.2/fr/System.Runtime.xml", - "ref/netstandard1.2/it/System.Runtime.xml", - "ref/netstandard1.2/ja/System.Runtime.xml", - "ref/netstandard1.2/ko/System.Runtime.xml", - "ref/netstandard1.2/ru/System.Runtime.xml", - "ref/netstandard1.2/zh-hans/System.Runtime.xml", - "ref/netstandard1.2/zh-hant/System.Runtime.xml", - "ref/netstandard1.3/System.Runtime.dll", - "ref/netstandard1.3/System.Runtime.xml", - "ref/netstandard1.3/de/System.Runtime.xml", - "ref/netstandard1.3/es/System.Runtime.xml", - "ref/netstandard1.3/fr/System.Runtime.xml", - "ref/netstandard1.3/it/System.Runtime.xml", - "ref/netstandard1.3/ja/System.Runtime.xml", - "ref/netstandard1.3/ko/System.Runtime.xml", - "ref/netstandard1.3/ru/System.Runtime.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.xml", - "ref/netstandard1.5/System.Runtime.dll", - "ref/netstandard1.5/System.Runtime.xml", - "ref/netstandard1.5/de/System.Runtime.xml", - "ref/netstandard1.5/es/System.Runtime.xml", - "ref/netstandard1.5/fr/System.Runtime.xml", - "ref/netstandard1.5/it/System.Runtime.xml", - "ref/netstandard1.5/ja/System.Runtime.xml", - "ref/netstandard1.5/ko/System.Runtime.xml", - "ref/netstandard1.5/ru/System.Runtime.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.xml", - "ref/portable-net45+win8+wp80+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.runtime.4.3.0.nupkg.sha512", - "system.runtime.nuspec" - ] - }, - "System.Text.Encoding/4.3.0": { - "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "type": "package", - "path": "system.text.encoding/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Text.Encoding.dll", - "ref/netcore50/System.Text.Encoding.xml", - "ref/netcore50/de/System.Text.Encoding.xml", - "ref/netcore50/es/System.Text.Encoding.xml", - "ref/netcore50/fr/System.Text.Encoding.xml", - "ref/netcore50/it/System.Text.Encoding.xml", - "ref/netcore50/ja/System.Text.Encoding.xml", - "ref/netcore50/ko/System.Text.Encoding.xml", - "ref/netcore50/ru/System.Text.Encoding.xml", - "ref/netcore50/zh-hans/System.Text.Encoding.xml", - "ref/netcore50/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.0/System.Text.Encoding.dll", - "ref/netstandard1.0/System.Text.Encoding.xml", - "ref/netstandard1.0/de/System.Text.Encoding.xml", - "ref/netstandard1.0/es/System.Text.Encoding.xml", - "ref/netstandard1.0/fr/System.Text.Encoding.xml", - "ref/netstandard1.0/it/System.Text.Encoding.xml", - "ref/netstandard1.0/ja/System.Text.Encoding.xml", - "ref/netstandard1.0/ko/System.Text.Encoding.xml", - "ref/netstandard1.0/ru/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.3/System.Text.Encoding.dll", - "ref/netstandard1.3/System.Text.Encoding.xml", - "ref/netstandard1.3/de/System.Text.Encoding.xml", - "ref/netstandard1.3/es/System.Text.Encoding.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.xml", - "ref/netstandard1.3/it/System.Text.Encoding.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.text.encoding.4.3.0.nupkg.sha512", - "system.text.encoding.nuspec" - ] - }, - "System.Threading.Tasks/4.3.0": { - "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "type": "package", - "path": "system.threading.tasks/4.3.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.Tasks.dll", - "ref/netcore50/System.Threading.Tasks.xml", - "ref/netcore50/de/System.Threading.Tasks.xml", - "ref/netcore50/es/System.Threading.Tasks.xml", - "ref/netcore50/fr/System.Threading.Tasks.xml", - "ref/netcore50/it/System.Threading.Tasks.xml", - "ref/netcore50/ja/System.Threading.Tasks.xml", - "ref/netcore50/ko/System.Threading.Tasks.xml", - "ref/netcore50/ru/System.Threading.Tasks.xml", - "ref/netcore50/zh-hans/System.Threading.Tasks.xml", - "ref/netcore50/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.0/System.Threading.Tasks.dll", - "ref/netstandard1.0/System.Threading.Tasks.xml", - "ref/netstandard1.0/de/System.Threading.Tasks.xml", - "ref/netstandard1.0/es/System.Threading.Tasks.xml", - "ref/netstandard1.0/fr/System.Threading.Tasks.xml", - "ref/netstandard1.0/it/System.Threading.Tasks.xml", - "ref/netstandard1.0/ja/System.Threading.Tasks.xml", - "ref/netstandard1.0/ko/System.Threading.Tasks.xml", - "ref/netstandard1.0/ru/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.3/System.Threading.Tasks.dll", - "ref/netstandard1.3/System.Threading.Tasks.xml", - "ref/netstandard1.3/de/System.Threading.Tasks.xml", - "ref/netstandard1.3/es/System.Threading.Tasks.xml", - "ref/netstandard1.3/fr/System.Threading.Tasks.xml", - "ref/netstandard1.3/it/System.Threading.Tasks.xml", - "ref/netstandard1.3/ja/System.Threading.Tasks.xml", - "ref/netstandard1.3/ko/System.Threading.Tasks.xml", - "ref/netstandard1.3/ru/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "system.threading.tasks.4.3.0.nupkg.sha512", - "system.threading.tasks.nuspec" - ] - } - }, - "projectFileDependencyGroups": { - "net6.0": [ - "ConsoleTables >= 2.4.2" - ] - }, - "packageFolders": { - "/home/mrfluffy/.cache/NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj", - "projectName": "lpr381", - "projectPath": "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj", - "packagesPath": "/home/mrfluffy/.cache/NuGetPackages", - "outputPath": "/home/mrfluffy/Documents/c#/lpr381/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/home/mrfluffy/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "ConsoleTables": { - "target": "Package", - "version": "[2.4.2, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[6.0.6, 6.0.6]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.106/RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache deleted file mode 100644 index 2a874ae..0000000 --- a/obj/project.nuget.cache +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "UsG+n8no52tNULnArv36wfnSHuyNsJtVw+cLkcJKa4zAucFyRBa7qGlEyQpU5Roj2w954zGpsMoMYS9LaYexCw==", - "success": true, - "projectFilePath": "/home/mrfluffy/Documents/c#/lpr381/lpr381.csproj", - "expectedPackageFiles": [ - "/home/mrfluffy/.cache/NuGetPackages/consoletables/2.4.2/consoletables.2.4.2.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/microsoft.netcore.platforms/1.1.0/microsoft.netcore.platforms.1.1.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/microsoft.netcore.targets/1.1.0/microsoft.netcore.targets.1.1.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.io/4.3.0/system.io.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.reflection/4.3.0/system.reflection.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.reflection.primitives/4.3.0/system.reflection.primitives.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.reflection.typeextensions/4.3.0/system.reflection.typeextensions.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.runtime/4.3.0/system.runtime.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.text.encoding/4.3.0/system.text.encoding.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/system.threading.tasks/4.3.0/system.threading.tasks.4.3.0.nupkg.sha512", - "/home/mrfluffy/.cache/NuGetPackages/microsoft.aspnetcore.app.ref/6.0.6/microsoft.aspnetcore.app.ref.6.0.6.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file diff --git a/simplex.cs b/simplex.cs deleted file mode 100644 index c102b21..0000000 --- a/simplex.cs +++ /dev/null @@ -1,249 +0,0 @@ -using ConsoleTables; -class simplex -{ - public void simplexAlgo() - { - file file = new file(); - Tuple, List> content = file.readFile(); - List zConstraintsList = content.Item1; - List constraintsList = content.Item2; - - // print constraintsList - foreach (zConstraints constraints in zConstraintsList) - { - Console.WriteLine(constraints.minMax + " " + string.Join(" ", constraints.values)); - } - foreach (Constraints constraints in constraintsList) - { - Console.WriteLine(constraints.sign + " " + string.Join(" ", constraints.values)); - } - List> table = new List>(); - table.Add(zConstraintsList[0].values); - // add all constraints in constraintsList to table - foreach (Constraints constraints in constraintsList) - { - table.Add(constraints.values); - } - List> newTable = new List>(); - // add all rows in table to newTable - foreach (List row in table) - { - // add all columns in row to newTable without reference to table - List newRow = new List(); - for (int i = 0; i < row.Count; i++) - { - newRow.Add(row[i]); - - } - newTable.Add(newRow); - } - - // add s variable to table - for (int i = 0; i < table.Count; i++) - { - if (i == 0) - { - for (int j = 0; j < table[i].Count + 1; j++) - { - newTable[i].Add(0); - } - } - else - { - for (int j = 0; j < table[i].Count-1; j++) - { - //save the last value in newTable in to lastVal and remove it from newTanle - float lastVal = newTable[i][newTable[i].Count - 1]; - newTable[i].RemoveAt(newTable[i].Count - 1); - if (i == j+1) - { - newTable[i].Add(1); - } - else - { - newTable[i].Add(0); - } - newTable[i].Add(lastVal); - } - } - } - // print table - printTable(newTable); - bool optimal = false; - newTable = flipZ(newTable); - while (!optimal) - { - int pivotCol = findPivotCol(newTable); - List ratio = ratioTest(newTable, pivotCol); - int pivotRow = findPivotRow(ratio); - printTable(newTable); - newTable = pivotTable(newTable, pivotRow, pivotCol); - Console.WriteLine(""); - if (checkOptimal(newTable)) - { - printTable(newTable); - optimal = true; - } - } - - } - - - static void printTable(List> newTable) - { - string[] headers = new string[newTable[0].Count]; - double half = newTable[0].Count / 2; - int halfInt = (int)Math.Floor(half); - for (int i = 0; i < newTable[0].Count; i++) - { - if (i != newTable[0].Count - 1 && i < halfInt) - { - headers[i] = "x" + (i + 1); - } - else if (i != newTable[0].Count - 1 && i >= halfInt) - { - // add "s" to headers starting at 1 - headers[i] = "s" + ((i - newTable[0].Count / 2)+1); - //headers[i] = "s" + (i + 1); - } - else - { - headers[i] = "rhs"; - } - } - var conTable = new ConsoleTable(headers); - // for each row in table add row to conTable - foreach (List row in newTable) - { - // convert row to object array - object[] rowArray = new object[row.Count]; - for (int i = 0; i < row.Count; i++) - { - rowArray[i] = row[i]; - } - conTable.AddRow(rowArray); - } - conTable.Write(Format.Alternative); - } - - - - static bool checkOptimal(List> table) - { - int zIndex = 0; - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] < 0) - { - zIndex = i; - } - } - if (zIndex == 0) - { - return true; - } - else - { - return false; - } - } - - - static List> flipZ(List> table) - { - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] > 0) - { - table[0][i] = -table[0][i]; - } - } - return table; - } - - static int findPivotCol(List> table) - { - float largest = 0; - int largestIndex = 0; - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] < largest) - { - largest = table[0][i]; - largestIndex = i; - } - } - return largestIndex; - } - - static List ratioTest(List> table, int testCol) - { - List ratios = new List(); - for (int i = 1; i < table.Count; i++) - { - if (table[i][testCol] != 0) - { - ratios.Add(table[i][table[i].Count - 1] / table[i][testCol]); - } - else - { - ratios.Add(float.MaxValue); - } - } - return ratios; - } - - - static int findPivotRow(List ratios) - { - float smallest = float.MaxValue; - int smallestIndex = 0; - for (int i = 0; i < ratios.Count; i++) - { - if (ratios[i] < smallest && ratios[i] > 0.0) - { - smallest = ratios[i]; - smallestIndex = i; - } - } - return smallestIndex; - } - - - static List> pivotTable(List> table, int pivotRow, int pivotCol) - { - //clone table in to newTable - List> newTable = new List>(); - foreach (List row in table) - { - List newRow = new List(); - for (int i = 0; i < row.Count; i++) - { - newRow.Add(row[i]); - } - newTable.Add(newRow); - } - var pivotPoint = newTable[pivotRow + 1][pivotCol]; - // divide pivot row by pivot point - for (int i = 0; i < newTable[pivotRow + 1].Count; i++) - { - newTable[pivotRow + 1][i] = newTable[pivotRow + 1][i] / pivotPoint; - } - // current possition-(pivot_row*new_table pivot_point) - for (int i = 0; i < newTable.Count; i++) - { - if (i != pivotRow + 1) - { - var currentPossition = newTable[i][pivotCol]; - for (int j = 0; j < newTable[i].Count; j++) - { - newTable[i][j] = newTable[i][j] - (currentPossition * newTable[pivotRow + 1][j]); - } - } - } - return newTable; - - } - -} - diff --git a/twoPhaseSimplex.cs b/twoPhaseSimplex.cs deleted file mode 100644 index 8f2bd01..0000000 --- a/twoPhaseSimplex.cs +++ /dev/null @@ -1,432 +0,0 @@ -using ConsoleTables; -class twoPhaseSimplex -{ - public void twoPhaseSimplexAlgo() - { - file file = new file(); - Tuple, List> content = file.readFile(); - List zConstraintsList = content.Item1; - List constraintsList = content.Item2; - - // print constraintsList - foreach (zConstraints constraints in zConstraintsList) - { - Console.WriteLine(constraints.minMax + " " + string.Join(" ", constraints.values)); - } - foreach (Constraints constraints in constraintsList) - { - Console.WriteLine(constraints.sign + " " + string.Join(" ", constraints.values)); - } - List> table = new List>(); - table.Add(zConstraintsList[0].values); - // add all constraints in constraintsList to table - foreach (Constraints constraints in constraintsList) - { - table.Add(constraints.values); - } - List> newTable = new List>(); - // add all rows in table to newTable - foreach (List row in table) - { - // add all columns in row to newTable without reference to table - List newRow = new List(); - for (int i = 0; i < row.Count; i++) - { - newRow.Add(row[i]); - - } - newTable.Add(newRow); - } - int varCount = newTable[0].Count; - table = prepareTable(newTable, constraintsList); - - // print table - printTablePhaseOne(table, varCount); - - flipZ(table); - printTablePhaseOne(table, varCount); - bool isOptimal = isOptimalPhaseOne(table); - while (!isOptimal) - { - int pivotCol = findPivotCol(table); - List ratio = ratioTest(table, pivotCol); - int pivotRow = findPivotRow(ratio); - table = pivotTable(table, pivotRow, pivotCol); - printTablePhaseOne(table, varCount); - isOptimal = isOptimalPhaseOne(table); - } - - table = dropCol(table, varCount); - isOptimal = isOptimalPhaseTwo(table); - printTablePhaseTwo(table, varCount); - while (!isOptimal) - { - int pivotCol = findPivotCol(table); - List ratio = ratioTest(table, pivotCol); - int pivotRow = findPivotRow(ratio); - table = pivotTable(table, pivotRow, pivotCol); - printTablePhaseTwo(table, varCount); - isOptimal = isOptimalPhaseTwo(table); - } - - - - - } - - void printTablePhaseOne(List> table, int varCount) - { - int count = 1; - string[] headers = new string[table[0].Count]; - for (int i = 0; i < table[0].Count; i++) - { - if (i < varCount) - { - headers[i] = "x" + (i + 1); - } - else if (i < table[0].Count - 1) - { - headers[i] = "e" + (count); - headers[i+1] = "a" + (count); - headers[i+2] = "s" + (count); - i = i + 2; - count++; - } - else - { - headers[i] = "rhs"; - } - } - var conTable = new ConsoleTable(headers); - foreach (List row in table) - { - // convert row to object array - object[] rowArray = new object[row.Count]; - for (int i = 0; i < row.Count; i++) - { - rowArray[i] = row[i]; - } - conTable.AddRow(rowArray); - } - conTable.Write(Format.Alternative); - - } - - void printTablePhaseTwo(List> table, int varCount) - { - int count = 1; - string[] headers = new string[table[0].Count]; - for (int i = 0; i < table[0].Count; i++) - { - if (i < varCount) - { - headers[i] = "x" + (i + 1); - } - else if (i < table[0].Count - 1) - { - headers[i] = "e" + (count); - headers[i+1] = "s" + (count); - i = i + 1; - count++; - } - else - { - headers[i] = "rhs"; - } - } - var conTable = new ConsoleTable(headers); - foreach (List row in table) - { - // convert row to object array - object[] rowArray = new object[row.Count]; - for (int i = 0; i < row.Count; i++) - { - rowArray[i] = row[i]; - } - conTable.AddRow(rowArray); - } - conTable.Write(Format.Alternative); - - } - - List> prepareTable(List> table, List constraints) - { - // save all values in table in to newTable - List> newTable = new List>(); - foreach (List row in table) - { - List newRow = new List(); - foreach (float value in row) - { - newRow.Add(value); - } - newTable.Add(newRow); - } - List rowsWithW = new List(); - List signs = new List(); - foreach (Constraints constraint in constraints) - { - signs.Add(constraint.sign); - } - // ammount of values in newTable startring from newTable[1]) - int varCount = 0; - for (int i = 1; i < newTable.Count; i++) - { - varCount = varCount + newTable[i].Count; - } - for (int i = 0; i < signs.Count ; i++) - { - table[0].Add(0); - table[0].Add(0); - table[0].Add(0); - int temp = (newTable[i+1].Count-1) * signs.Count; - - - // add 3 0s to each row for every column in table - for (int j = 0; j < signs.Count ; j++) - { - if (signs[i] == ">=") - { - // make s = 1 - if (i == j) - { - table[i+1].Add(0); - table[i+1].Add(0); - table[i+1].Add(1); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - table[i+1].Add(0); - } - } - else if (signs[i] == "<=") - { - //make e and a = 1 - if (i == j) - { - table[i+1].Add(-1); - table[i+1].Add(1); - table[i+1].Add(0); - rowsWithW.Add(i+1); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - table[i+1].Add(0); - } - } - else if (signs[i] == "=") - { - // make a = 1 - if (i == j) - { - table[i+1].Add(0); - table[i+1].Add(1); - table[i+1].Add(0); - rowsWithW.Add(i+1); - } - else - { - table[i+1].Add(0); - table[i+1].Add(0); - table[i+1].Add(0); - } - } - } - } - table[0].Add(0); - // create list of floats called wRow size table[0].Count - 1 - List wRow = new List(); - for (int i = 0; i < table[0].Count; i++) - { - wRow.Add(0); - } - for (int i = 0; i < table[0].Count; i++) - { - // if i is in rowsWithW - if (rowsWithW.Contains(i)) - { - for (int j = 0; j < wRow.Count; j++) - { - wRow[j] = wRow[j] + (-table[i][j]); - } - } - } - //add wRow to the start of table - table.Insert(1, wRow); - - // remove intex newTable.Count-1 from table and place it in the back of table - for (int i = 2; i < table.Count; i++) - { - table[i].RemoveAt(newTable.Count-1); - table[i].Add(newTable[i-1][newTable[i-1].Count-1]); - - } - // remove the value of newTable.Count-1 from table[1] and place it in the back of table[1] - float lastValue = table[1][newTable.Count-1]; - table[1].RemoveAt(newTable.Count-1); - table[1].Add(lastValue); - - - - return table; - } - static List> flipZ(List> table) - { - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] > 0) - { - table[0][i] = -table[0][i]; - } - } - return table; - } - - static int findPivotCol(List> table) - { - float largest = 0; - int largestIndex = 0; - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] < largest) - { - largest = table[0][i]; - largestIndex = i; - } - } - return largestIndex; - } - - static List ratioTest(List> table, int testCol) - { - List ratios = new List(); - for (int i = 1; i < table.Count; i++) - { - if (table[i][testCol] != 0) - { - ratios.Add(table[i][table[i].Count - 1] / table[i][testCol]); - } - else - { - ratios.Add(float.MaxValue); - } - } - return ratios; - } - static int findPivotRow(List ratios) - { - float smallest = float.MaxValue; - int smallestIndex = 0; - for (int i = 0; i < ratios.Count; i++) - { - if (ratios[i] < smallest && ratios[i] > 0.0) - { - smallest = ratios[i]; - smallestIndex = i; - } - } - return smallestIndex; - } - - static List> pivotTable(List> table, int pivotRow, int pivotCol) - { - //clone table in to newTable - List> newTable = new List>(); - foreach (List row in table) - { - List newRow = new List(); - for (int i = 0; i < row.Count; i++) - { - newRow.Add(row[i]); - } - newTable.Add(newRow); - } - var pivotPoint = newTable[pivotRow + 1][pivotCol]; - // divide pivot row by pivot point - for (int i = 0; i < newTable[pivotRow + 1].Count; i++) - { - newTable[pivotRow + 1][i] = newTable[pivotRow + 1][i] / pivotPoint; - } - // current possition-(pivot_row*new_table pivot_point) - for (int i = 0; i < newTable.Count; i++) - { - if (i != pivotRow + 1) - { - var currentPossition = newTable[i][pivotCol]; - for (int j = 0; j < newTable[i].Count; j++) - { - newTable[i][j] = newTable[i][j] - (currentPossition * newTable[pivotRow + 1][j]); - } - } - } - return newTable; - } - - //check if the table is optimal first phase - // table is optimal if all values in table[1] are positive - - - static bool isOptimalPhaseOne(List> table) - { - int wIndex = 0; - for (int i = 0; i < table[1].Count; i++) - { - if (table[1][i] < 0) - { - wIndex = i; - } - } - if (wIndex == 0) - { - return true; - } - else - { - return false; - } - } - - - static bool isOptimalPhaseTwo(List> table) - { - int wIndex = 0; - for (int i = 0; i < table[0].Count; i++) - { - if (table[0][i] < 0) - { - wIndex = i; - } - } - if (wIndex == 0) - { - return true; - } - else - { - return false; - } - } - - - //drop all a coloumn from the table and drop w row from the table - static List> dropCol(List> table, int varCount) - { - table.RemoveAt(1); - - - // for each row in table drop the varCount-1th element - for (int i = 0; i < table.Count; i++) - { - for (int j = varCount + 1; j < table[i].Count - 1; j+=3) - { - table[i].RemoveAt(j); - j = j - 1; - } - } - return table; - } -} \ No newline at end of file