From 6ae89e9207563d7125a1f93c3d85d77ff56a86c3 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:42:41 +0200 Subject: [PATCH 01/21] Create release-and-versionize.yml --- .github/workflows/release-and-versionize.yml | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/release-and-versionize.yml diff --git a/.github/workflows/release-and-versionize.yml b/.github/workflows/release-and-versionize.yml new file mode 100644 index 0000000..b761bb2 --- /dev/null +++ b/.github/workflows/release-and-versionize.yml @@ -0,0 +1,23 @@ +name: Build package as nuget, and publish it to nuget repository +on: + push: + branches: + - master +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Setup .NET 8.x + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '8.x' + - name: Install dependencies + run: dotnet restore + - name: Build + run: dotnet build + - name: Install Versionize + run: dotnet tool install --global Versionize + - name: Versionize package + id: versionize + run: versionize --changelog-all --skip-dirty + continue-on-error: true From 3020f05a107a9451f6eed3dcbb086b4108122aff Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:45:20 +0200 Subject: [PATCH 02/21] Update release-and-versionize.yml --- .github/workflows/release-and-versionize.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-and-versionize.yml b/.github/workflows/release-and-versionize.yml index b761bb2..be4bd36 100644 --- a/.github/workflows/release-and-versionize.yml +++ b/.github/workflows/release-and-versionize.yml @@ -7,6 +7,7 @@ jobs: build: runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 - name: Setup .NET 8.x uses: actions/setup-dotnet@v3 with: From 70f6bb25d3deb2d4033af613b857930796a8d515 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:48:47 +0200 Subject: [PATCH 03/21] Update and rename release-and-versionize.yml to tests.yml --- .github/workflows/release-and-versionize.yml | 24 -------------------- .github/workflows/tests.yml | 22 ++++++++++++++++++ 2 files changed, 22 insertions(+), 24 deletions(-) delete mode 100644 .github/workflows/release-and-versionize.yml create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/release-and-versionize.yml b/.github/workflows/release-and-versionize.yml deleted file mode 100644 index be4bd36..0000000 --- a/.github/workflows/release-and-versionize.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Build package as nuget, and publish it to nuget repository -on: - push: - branches: - - master -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup .NET 8.x - uses: actions/setup-dotnet@v3 - with: - dotnet-version: '8.x' - - name: Install dependencies - run: dotnet restore - - name: Build - run: dotnet build - - name: Install Versionize - run: dotnet tool install --global Versionize - - name: Versionize package - id: versionize - run: versionize --changelog-all --skip-dirty - continue-on-error: true diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..0582772 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,22 @@ +name: Test CI +on: [push, pull_request] +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + net-version: ['6.x','7.x','8.x'] + steps: + - uses: actions/checkout@v4 + - name: Setup .NET 8.x + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ matrix..net-version }} + - name: Install dependencies + run: dotnet restore + - name: Build + run: dotnet build + - name: Test + run: dotnet test --logger trx --results-directory "TestResults-${{ matrix..net-version }}" From 587b75c12b8b1f4b4b2bd23ed64fb8ad07219a93 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:49:28 +0200 Subject: [PATCH 04/21] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0582772..d41c192 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,4 +19,4 @@ jobs: - name: Build run: dotnet build - name: Test - run: dotnet test --logger trx --results-directory "TestResults-${{ matrix..net-version }}" + run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" From d9a48e92ea479a6a566ba6837c37ceb117541bb0 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:49:51 +0200 Subject: [PATCH 05/21] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d41c192..ea67565 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: - name: Setup .NET 8.x uses: actions/setup-dotnet@v3 with: - dotnet-version: ${{ matrix..net-version }} + dotnet-version: ${{ matrix.net-version }} - name: Install dependencies run: dotnet restore - name: Build From 507a500a57fd35154259efdfb3c76b4e1a4206df Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:52:12 +0200 Subject: [PATCH 06/21] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea67565..bd5270f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,7 +6,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macOS-latest] + os: [ubuntu-latest] net-version: ['6.x','7.x','8.x'] steps: - uses: actions/checkout@v4 From 884e64cdffe8fe40b587081c24970d2da0575a75 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:20:59 +0200 Subject: [PATCH 07/21] Update and rename tests.yml to release-and-publish.yml --- .../{tests.yml => release-and-publish.yml} | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) rename .github/workflows/{tests.yml => release-and-publish.yml} (68%) diff --git a/.github/workflows/tests.yml b/.github/workflows/release-and-publish.yml similarity index 68% rename from .github/workflows/tests.yml rename to .github/workflows/release-and-publish.yml index bd5270f..50d5d57 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/release-and-publish.yml @@ -1,4 +1,4 @@ -name: Test CI +name: Worflow CI on: [push, pull_request] jobs: build: @@ -7,7 +7,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - net-version: ['6.x','7.x','8.x'] + net-version: ['8.x'] steps: - uses: actions/checkout@v4 - name: Setup .NET 8.x @@ -18,5 +18,15 @@ jobs: run: dotnet restore - name: Build run: dotnet build + test: + needs: [build] + runs-on: ${{matrix.os}} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + net-version: ['8.x'] + steps: + - uses: actions/checkout@v4 - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" From b5913cf3b3916bfd7fc20fd7fc6e5ef7aba163cb Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:40:28 +0200 Subject: [PATCH 08/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index 50d5d57..6e0eae2 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -1,13 +1,20 @@ name: Worflow CI -on: [push, pull_request] +on: + pull_request: + branches: [ "master" ] + push: + branches: [ "master"] jobs: - build: - runs-on: ${{ matrix.os }} + setup: + runs-on: ${{matrix.os}} strategy: - fail-fast: false matrix: os: [ubuntu-latest] net-version: ['8.x'] + fail-fast: false + build: + needs: setup + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Setup .NET 8.x @@ -19,14 +26,13 @@ jobs: - name: Build run: dotnet build test: - needs: [build] + needs: [build,setup] runs-on: ${{matrix.os}} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - net-version: ['8.x'] steps: - uses: actions/checkout@v4 - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" + + versionize: + needs : [setup,build,test] + runs-on: ${{matrix.os}} From 9e45460c39ea8fc69c0d3bdac32927937152ea2c Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:41:01 +0200 Subject: [PATCH 09/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index 6e0eae2..951d809 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -32,7 +32,3 @@ jobs: - uses: actions/checkout@v4 - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" - - versionize: - needs : [setup,build,test] - runs-on: ${{matrix.os}} From aed9b07722f1ce5cb76c711e58cb12810f206a89 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:43:49 +0200 Subject: [PATCH 10/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 31 +++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index 951d809..274d3ce 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -1,34 +1,43 @@ -name: Worflow CI +name: Workflow CI + on: pull_request: branches: [ "master" ] push: - branches: [ "master"] + branches: [ "master" ] + jobs: - setup: - runs-on: ${{matrix.os}} + build: + runs-on: ubuntu-latest strategy: matrix: os: [ubuntu-latest] net-version: ['8.x'] fail-fast: false - build: - needs: setup - runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - - name: Setup .NET 8.x + - name: Setup .NET ${{ matrix.net-version}} uses: actions/setup-dotnet@v3 with: - dotnet-version: ${{ matrix.net-version }} + dotnet-version: ${{ matrix.net-version}} - name: Install dependencies run: dotnet restore - name: Build run: dotnet build + test: - needs: [build,setup] - runs-on: ${{matrix.os}} + needs: build + runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-latest] + net-version: ['8.x'] + fail-fast: false steps: - uses: actions/checkout@v4 + - name: Setup .NET ${{ matrix['net-version'] }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ matrix['net-version'] }} - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" From 98f43196b32e116f97a15131f06e7ed0702978d1 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:38:49 +0200 Subject: [PATCH 11/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index 274d3ce..605a318 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] @@ -24,20 +24,20 @@ jobs: run: dotnet restore - name: Build run: dotnet build - test: - needs: build - runs-on: ubuntu-latest + needs : build + runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] net-version: ['8.x'] fail-fast: false steps: - - uses: actions/checkout@v4 - - name: Setup .NET ${{ matrix['net-version'] }} - uses: actions/setup-dotnet@v3 - with: - dotnet-version: ${{ matrix['net-version'] }} - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" + - name: Upload dotnet test results + uses: actions/upload-artifact@v4 + with: + name: dotnet-results-${{ matrix.dotnet-version }} + path: TestResults-${{ matrix.dotnet-version }} + if: ${{ always() }} From 6b7175323447720c71c737a0f1f7b978b57b9f6b Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:58:25 +0200 Subject: [PATCH 12/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index 605a318..f256682 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -40,4 +40,4 @@ jobs: with: name: dotnet-results-${{ matrix.dotnet-version }} path: TestResults-${{ matrix.dotnet-version }} - if: ${{ always() }} + if: always() From 7cfd3eac2afcd59b4c7f2e808eddf9aa926386a5 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Sat, 1 Jun 2024 13:51:33 +0200 Subject: [PATCH 13/21] feat: add generic methods --- .../Helpers/DoubleHelpers.cs | 21 +++++++ McdaMethods.sln | 6 ++ McdaMethods/Helpers/DataNormalization.cs | 36 ----------- McdaMethods/Helpers/IDataNormalization.cs | 8 --- McdaMethods/MCDA/IMethod.cs | 8 --- McdaMethods/MCDA/TopsisMethod.cs | 63 ------------------- McdaMethods/Mcda/IMethod.cs | 10 +++ McdaMethods/Mcda/TopsisMethod.cs | 63 +++++++++++++++++++ .../Normalization/DataNormalization.cs | 30 +++++++++ .../Normalization/IDataNormalization.cs | 10 +++ .../Abstraction/INormalizationMethod.cs | 10 +++ .../MinMaxNormalization.cs | 27 ++++++++ .../INormalizationMethod.cs | 9 --- .../MinMaxNormalization.cs | 25 -------- 14 files changed, 177 insertions(+), 149 deletions(-) create mode 100644 McdaMethods.UnitTests/Helpers/DoubleHelpers.cs delete mode 100644 McdaMethods/Helpers/DataNormalization.cs delete mode 100644 McdaMethods/Helpers/IDataNormalization.cs delete mode 100644 McdaMethods/MCDA/IMethod.cs delete mode 100644 McdaMethods/MCDA/TopsisMethod.cs create mode 100644 McdaMethods/Mcda/IMethod.cs create mode 100644 McdaMethods/Mcda/TopsisMethod.cs create mode 100644 McdaMethods/Normalization/DataNormalization.cs create mode 100644 McdaMethods/Normalization/IDataNormalization.cs create mode 100644 McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs create mode 100644 McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs delete mode 100644 McdaMethods/NormalizationMethods/INormalizationMethod.cs delete mode 100644 McdaMethods/NormalizationMethods/MinMaxNormalization.cs diff --git a/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs b/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs new file mode 100644 index 0000000..cdb37ab --- /dev/null +++ b/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs @@ -0,0 +1,21 @@ +using MathNet.Numerics; +using MathNet.Numerics.LinearAlgebra; + +namespace McdaMethods.UnitTests.Helpers; + +public abstract class TestHelpers +{ + public static bool IsResultTheSame(Vector vector,double[] expected) + { + var result = vector.Enumerate().Zip(expected, (r,e) => new {result = r, expected = e}); + + foreach (var item in result) + { + if (Math.Abs(item.expected - item.result.Round(3)) < Double.Epsilon) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/McdaMethods.sln b/McdaMethods.sln index 6b20113..37bcf39 100644 --- a/McdaMethods.sln +++ b/McdaMethods.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.8.34525.116 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaMethods", "McdaMethods\McdaMethods.csproj", "{EC147B8B-336E-4744-8F54-43D1BB0E4FC3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaMethods.UnitTests", "McdaMethods.UnitTests\McdaMethods.UnitTests.csproj", "{675DE565-59A0-4865-A306-B12FCC64EF1F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {EC147B8B-336E-4744-8F54-43D1BB0E4FC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {EC147B8B-336E-4744-8F54-43D1BB0E4FC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC147B8B-336E-4744-8F54-43D1BB0E4FC3}.Release|Any CPU.Build.0 = Release|Any CPU + {675DE565-59A0-4865-A306-B12FCC64EF1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {675DE565-59A0-4865-A306-B12FCC64EF1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/McdaMethods/Helpers/DataNormalization.cs b/McdaMethods/Helpers/DataNormalization.cs deleted file mode 100644 index f9a5854..0000000 --- a/McdaMethods/Helpers/DataNormalization.cs +++ /dev/null @@ -1,36 +0,0 @@ -using MathNet.Numerics.LinearAlgebra; -using McdaMethods.NormalizationMethods; - -namespace McdaMethods.Helpers; - -public class DataNormalization : IDataNormalization -{ - private readonly INormalizationMethod _method; - - public DataNormalization( - INormalizationMethod method) - { - _method = method; - } - - public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) - { - var normalizedMatrix = Matrix.Build.Dense(matrix.RowCount, matrix.ColumnCount); - matrix.CopyTo(normalizedMatrix); - - for (int i = 0; i < matrix.ColumnCount; i++) - { - var rowVector = matrix.Column(i); - - if (criteriaTypes[i] == 1) - { - normalizedMatrix.SetColumn(i, _method.Normalize(rowVector, false)); - } - else - { - normalizedMatrix.SetColumn(i, _method.Normalize(rowVector, true)); - } - } - return normalizedMatrix; - } -} \ No newline at end of file diff --git a/McdaMethods/Helpers/IDataNormalization.cs b/McdaMethods/Helpers/IDataNormalization.cs deleted file mode 100644 index 94217a7..0000000 --- a/McdaMethods/Helpers/IDataNormalization.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.Helpers; - -public interface IDataNormalization -{ - Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); -} \ No newline at end of file diff --git a/McdaMethods/MCDA/IMethod.cs b/McdaMethods/MCDA/IMethod.cs deleted file mode 100644 index ddb9f38..0000000 --- a/McdaMethods/MCDA/IMethod.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.MCDA; - -public interface IMethod -{ - Vector Calculate(Matrix matrix, double[] weights, int[] criteriaDirections); -} \ No newline at end of file diff --git a/McdaMethods/MCDA/TopsisMethod.cs b/McdaMethods/MCDA/TopsisMethod.cs deleted file mode 100644 index b114a71..0000000 --- a/McdaMethods/MCDA/TopsisMethod.cs +++ /dev/null @@ -1,63 +0,0 @@ -using MathNet.Numerics.LinearAlgebra; -using McdaMethods.Helpers; - -namespace McdaMethods.MCDA; - -public class TopsisMethod : IMethod -{ - private readonly IDataNormalization _dataNormalization; - - public TopsisMethod(IDataNormalization dataNormalization) - { - _dataNormalization = dataNormalization; - } - - public Vector Calculate(Matrix matrix, double[] weights, int[] criteriaDirections) - { - Matrix? normalizedMatrix = _dataNormalization.NormalizeMatrix(matrix, criteriaDirections); - Matrix? weightedMatrix = WeightedMatrix(normalizedMatrix, weights); - - Vector idealBest = IdealValues(weightedMatrix, true); - Vector idealWorst = IdealValues(weightedMatrix, false); - - Vector distanceToBest = CalculateEuclideanDistance(weightedMatrix, idealBest); - Vector distanceToWorst = CalculateEuclideanDistance(weightedMatrix, idealWorst); - Vector topsisScores = CalculateTopsisScores(distanceToBest, distanceToWorst); - - return topsisScores; - } - static Matrix WeightedMatrix(Matrix matrix, double[] weights) - { - for (int i = 0; i < matrix.RowCount; i++) - { - for (int j = 0; j < matrix.ColumnCount; j++) - { - matrix[i, j] *= weights[j]; - } - } - - return matrix; - } - - static Vector IdealValues(Matrix matrix, bool pis) - { - return Vector.Build.Dense(matrix.ColumnCount, i => - { - var columnValues = matrix.Column(i).ToArray(); - return pis ? columnValues.Max() : columnValues.Min(); - }); - } - - static Vector CalculateEuclideanDistance(Matrix matrix, Vector ideal) - { - return Vector.Build.DenseOfArray( - matrix.EnumerateRows().Select(row => - Math.Sqrt(row.Subtract(ideal).PointwisePower(2).Sum())) - .ToArray()); - } - - static Vector CalculateTopsisScores(Vector distanceToBest, Vector distanceToWorst) - { - return distanceToWorst.PointwiseDivide(distanceToBest.Add(distanceToWorst)); - } -} \ No newline at end of file diff --git a/McdaMethods/Mcda/IMethod.cs b/McdaMethods/Mcda/IMethod.cs new file mode 100644 index 0000000..f8abdaf --- /dev/null +++ b/McdaMethods/Mcda/IMethod.cs @@ -0,0 +1,10 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; + +namespace McdaMethods.Mcda; + +public interface IMethod + where TValue : struct, INumber +{ + MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, TValue[] weights, int[] criteriaDirections); +} \ No newline at end of file diff --git a/McdaMethods/Mcda/TopsisMethod.cs b/McdaMethods/Mcda/TopsisMethod.cs new file mode 100644 index 0000000..0251544 --- /dev/null +++ b/McdaMethods/Mcda/TopsisMethod.cs @@ -0,0 +1,63 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; +using McdaMethods.Normalization; +using McdaMethods.Normalization.NormalizationMethods.Abstraction; + +namespace McdaMethods.Mcda; + +public class TopsisMethod(INormalizationMethod normalizationMethod) : IMethod +where TValue : struct, INumber +{ + private readonly IDataNormalization _dataNormalization = new DataNormalization(normalizationMethod); + public MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, TValue[] weights, int[] criteriaDirections) + { + var normalizedMatrix = _dataNormalization.NormalizeMatrix(matrix, criteriaDirections); + var weightedMatrix = WeightedMatrix(normalizedMatrix, weights); + + var idealBest = IdealValues(weightedMatrix, true); + var idealWorst = IdealValues(weightedMatrix, false); + + var distanceToBest = CalculateEuclideanDistance(weightedMatrix, idealBest); + var distanceToWorst = CalculateEuclideanDistance(weightedMatrix, idealWorst); + var topsisScores = CalculateTopsisScores(distanceToBest, distanceToWorst); + + return topsisScores; + } + private Matrix WeightedMatrix(Matrix matrix, TValue[] weights) + { + for (int i = 0; i < matrix.RowCount; i++) + { + for (int j = 0; j < matrix.ColumnCount; j++) + { + matrix[i, j] *= weights[j]; + } + } + + return matrix; + } + private MathNet.Numerics.LinearAlgebra.Vector IdealValues(Matrix matrix, bool pis) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build + .Dense(matrix.ColumnCount, i => + { + var columnValues = matrix.Column(i).ToArray(); + return pis ? columnValues.Max() : columnValues.Min(); + }); + } + private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance(Matrix matrix, MathNet.Numerics.LinearAlgebra.Vector ideal) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build + .DenseOfArray(matrix + .EnumerateRows() + .Select(row => row.Subtract(ideal) + .PointwisePower((TValue)Convert.ChangeType(2,typeof(TValue))) + .PointwiseSqrt() + .Sum()) + .ToArray()); + } + private MathNet.Numerics.LinearAlgebra.Vector CalculateTopsisScores(MathNet.Numerics.LinearAlgebra.Vector distanceToBest, MathNet.Numerics.LinearAlgebra.Vector distanceToWorst) + { + return distanceToWorst + .PointwiseDivide(distanceToBest.Add(distanceToWorst)); + } +} \ No newline at end of file diff --git a/McdaMethods/Normalization/DataNormalization.cs b/McdaMethods/Normalization/DataNormalization.cs new file mode 100644 index 0000000..5f86bdb --- /dev/null +++ b/McdaMethods/Normalization/DataNormalization.cs @@ -0,0 +1,30 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; +using McdaMethods.Normalization.NormalizationMethods.Abstraction; + +namespace McdaMethods.Normalization; + +public class DataNormalization(INormalizationMethod method) : IDataNormalization +where TValue : struct, INumber +{ + public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) + { + var normalizedMatrix = Matrix.Build.Dense(matrix.RowCount, matrix.ColumnCount); + matrix.CopyTo(normalizedMatrix); + + for (var i = 0; i < matrix.ColumnCount; i++) + { + var rowVector = matrix.Column(i); + + if (criteriaTypes[i] == 1) + { + normalizedMatrix.SetColumn(i, method.Normalize(rowVector, false)); + } + else + { + normalizedMatrix.SetColumn(i, method.Normalize(rowVector, true)); + } + } + return normalizedMatrix; + } +} \ No newline at end of file diff --git a/McdaMethods/Normalization/IDataNormalization.cs b/McdaMethods/Normalization/IDataNormalization.cs new file mode 100644 index 0000000..a4ee19c --- /dev/null +++ b/McdaMethods/Normalization/IDataNormalization.cs @@ -0,0 +1,10 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; + +namespace McdaMethods.Normalization; + +public interface IDataNormalization +where TValue : struct, INumber +{ + Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); +} \ No newline at end of file diff --git a/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs b/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs new file mode 100644 index 0000000..863c228 --- /dev/null +++ b/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs @@ -0,0 +1,10 @@ + +using System.Numerics; + +namespace McdaMethods.Normalization.NormalizationMethods.Abstraction; + +public interface INormalizationMethod +where TValue : struct, INumber +{ + MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost); +} \ No newline at end of file diff --git a/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs b/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs new file mode 100644 index 0000000..ba3d7fa --- /dev/null +++ b/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs @@ -0,0 +1,27 @@ +using System.Numerics; +using MathNet.Numerics; +using McdaMethods.Normalization.NormalizationMethods.Abstraction; +using static System.Double; + + +namespace McdaMethods.Normalization.NormalizationMethods; + +public class MinMaxNormalization : INormalizationMethod +where TValue : struct, INumber +{ + public MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) + { + if (data.Maximum() == data.Minimum()) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build.Dense(data.Count, (i) => (TValue)Convert.ChangeType(1,typeof(TValue))); + } + + TValue difference = data.Maximum() - data.Minimum(); + + if (cost) + { + return (data.Maximum() - data) / difference; + } + return (data - data.Minimum()) / difference; + } +} \ No newline at end of file diff --git a/McdaMethods/NormalizationMethods/INormalizationMethod.cs b/McdaMethods/NormalizationMethods/INormalizationMethod.cs deleted file mode 100644 index 1630748..0000000 --- a/McdaMethods/NormalizationMethods/INormalizationMethod.cs +++ /dev/null @@ -1,9 +0,0 @@ - -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.NormalizationMethods; - -public interface INormalizationMethod -{ - Vector Normalize(Vector data, bool cost); -} \ No newline at end of file diff --git a/McdaMethods/NormalizationMethods/MinMaxNormalization.cs b/McdaMethods/NormalizationMethods/MinMaxNormalization.cs deleted file mode 100644 index 655eff8..0000000 --- a/McdaMethods/NormalizationMethods/MinMaxNormalization.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MathNet.Numerics.LinearAlgebra; -using static System.Double; - - -namespace McdaMethods.NormalizationMethods; - -public class MinMaxNormalization : INormalizationMethod -{ - public Vector Normalize(Vector data, bool cost = false) - { - double difference = data.Maximum() - data.Minimum(); - - if (Math.Abs(difference) < Epsilon) - { - return Vector.Build.Dense(data.Count, (i) => 1); - } - - if (cost) - { - return (data.Maximum() - data) / difference; - } - - return (data - data.Minimum()) / difference; - } -} \ No newline at end of file From 8db0fc30cd345134a7210b069fb519b193f27bc8 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Sat, 1 Jun 2024 13:58:24 +0200 Subject: [PATCH 14/21] feat: add versioning --- McdaMethods/McdaMethods.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/McdaMethods/McdaMethods.csproj b/McdaMethods/McdaMethods.csproj index ebe229a..27ff54c 100644 --- a/McdaMethods/McdaMethods.csproj +++ b/McdaMethods/McdaMethods.csproj @@ -4,8 +4,7 @@ net8.0 enable enable - 0.0.1.0 - 0.0.1.0 + 1.0.0 From 4c76513a9100a629accd43f28bd41d33d6e211ea Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Mon, 3 Jun 2024 00:02:20 +0200 Subject: [PATCH 15/21] feat: add enumeration iteration with index refactor: delete old unused code refactor: change generic TValue to double type fix: update functionality to check double IsResultTheSame with custom epsilon tests: add some testing --- .../Helpers/DoubleHelpers.cs | 21 ----- McdaMethods.sln | 4 +- McdaMethods/Mcda/IMethod.cs | 10 --- McdaMethods/Mcda/TopsisMethod.cs | 63 --------------- McdaMethods/Models/IAlternative.cs | 6 -- McdaMethods/Models/ICriteria.cs | 7 -- .../Normalization/DataNormalization.cs | 30 ------- .../Normalization/IDataNormalization.cs | 10 --- .../Abstraction/INormalizationMethod.cs | 10 --- .../MinMaxNormalization.cs | 27 ------- .../Helpers/DoubleHelpers.cs | 25 ++++++ .../McdaMethods/TopsisTests.cs | 38 +++++++++ .../McdaToolkit.UnitTests.csproj | 28 +++++++ McdaToolkit/Enums/NormalizationMethod.cs | 6 ++ .../Extensions/EnumerableExtentions.cs | 15 ++++ McdaToolkit/Mcda/Abstraction/IMethod.cs | 6 ++ McdaToolkit/Mcda/Abstraction/McdaMethod.cs | 17 ++++ McdaToolkit/Mcda/TopsisMethod.cs | 78 +++++++++++++++++++ .../McdaToolkit.csproj | 0 .../Abstraction/IDataNormalization.cs | 9 +++ .../Normalization/DataNormalization.cs | 27 +++++++ McdaToolkit/NormalizationFactory.cs | 18 +++++ .../Abstraction/INormalizationMethod.cs | 9 +++ .../MinMaxNormalization.cs | 23 ++++++ McdaToolkit/Options/McdaMethodOptions.cs | 8 ++ 25 files changed, 309 insertions(+), 186 deletions(-) delete mode 100644 McdaMethods.UnitTests/Helpers/DoubleHelpers.cs delete mode 100644 McdaMethods/Mcda/IMethod.cs delete mode 100644 McdaMethods/Mcda/TopsisMethod.cs delete mode 100644 McdaMethods/Models/IAlternative.cs delete mode 100644 McdaMethods/Models/ICriteria.cs delete mode 100644 McdaMethods/Normalization/DataNormalization.cs delete mode 100644 McdaMethods/Normalization/IDataNormalization.cs delete mode 100644 McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs delete mode 100644 McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs create mode 100644 McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs create mode 100644 McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs create mode 100644 McdaToolkit.UnitTests/McdaToolkit.UnitTests.csproj create mode 100644 McdaToolkit/Enums/NormalizationMethod.cs create mode 100644 McdaToolkit/Extensions/EnumerableExtentions.cs create mode 100644 McdaToolkit/Mcda/Abstraction/IMethod.cs create mode 100644 McdaToolkit/Mcda/Abstraction/McdaMethod.cs create mode 100644 McdaToolkit/Mcda/TopsisMethod.cs rename McdaMethods/McdaMethods.csproj => McdaToolkit/McdaToolkit.csproj (100%) create mode 100644 McdaToolkit/Normalization/Abstraction/IDataNormalization.cs create mode 100644 McdaToolkit/Normalization/DataNormalization.cs create mode 100644 McdaToolkit/NormalizationFactory.cs create mode 100644 McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs create mode 100644 McdaToolkit/NormalizationMethods/MinMaxNormalization.cs create mode 100644 McdaToolkit/Options/McdaMethodOptions.cs diff --git a/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs b/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs deleted file mode 100644 index cdb37ab..0000000 --- a/McdaMethods.UnitTests/Helpers/DoubleHelpers.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MathNet.Numerics; -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.UnitTests.Helpers; - -public abstract class TestHelpers -{ - public static bool IsResultTheSame(Vector vector,double[] expected) - { - var result = vector.Enumerate().Zip(expected, (r,e) => new {result = r, expected = e}); - - foreach (var item in result) - { - if (Math.Abs(item.expected - item.result.Round(3)) < Double.Epsilon) - { - return true; - } - } - return false; - } -} \ No newline at end of file diff --git a/McdaMethods.sln b/McdaMethods.sln index 37bcf39..7f4097e 100644 --- a/McdaMethods.sln +++ b/McdaMethods.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.8.34525.116 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaMethods", "McdaMethods\McdaMethods.csproj", "{EC147B8B-336E-4744-8F54-43D1BB0E4FC3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit", "McdaToolkit\McdaToolkit.csproj", "{EC147B8B-336E-4744-8F54-43D1BB0E4FC3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaMethods.UnitTests", "McdaMethods.UnitTests\McdaMethods.UnitTests.csproj", "{675DE565-59A0-4865-A306-B12FCC64EF1F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit.UnitTests", "McdaToolkit.UnitTests\McdaToolkit.UnitTests.csproj", "{675DE565-59A0-4865-A306-B12FCC64EF1F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/McdaMethods/Mcda/IMethod.cs b/McdaMethods/Mcda/IMethod.cs deleted file mode 100644 index f8abdaf..0000000 --- a/McdaMethods/Mcda/IMethod.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.Mcda; - -public interface IMethod - where TValue : struct, INumber -{ - MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, TValue[] weights, int[] criteriaDirections); -} \ No newline at end of file diff --git a/McdaMethods/Mcda/TopsisMethod.cs b/McdaMethods/Mcda/TopsisMethod.cs deleted file mode 100644 index 0251544..0000000 --- a/McdaMethods/Mcda/TopsisMethod.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; -using McdaMethods.Normalization; -using McdaMethods.Normalization.NormalizationMethods.Abstraction; - -namespace McdaMethods.Mcda; - -public class TopsisMethod(INormalizationMethod normalizationMethod) : IMethod -where TValue : struct, INumber -{ - private readonly IDataNormalization _dataNormalization = new DataNormalization(normalizationMethod); - public MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, TValue[] weights, int[] criteriaDirections) - { - var normalizedMatrix = _dataNormalization.NormalizeMatrix(matrix, criteriaDirections); - var weightedMatrix = WeightedMatrix(normalizedMatrix, weights); - - var idealBest = IdealValues(weightedMatrix, true); - var idealWorst = IdealValues(weightedMatrix, false); - - var distanceToBest = CalculateEuclideanDistance(weightedMatrix, idealBest); - var distanceToWorst = CalculateEuclideanDistance(weightedMatrix, idealWorst); - var topsisScores = CalculateTopsisScores(distanceToBest, distanceToWorst); - - return topsisScores; - } - private Matrix WeightedMatrix(Matrix matrix, TValue[] weights) - { - for (int i = 0; i < matrix.RowCount; i++) - { - for (int j = 0; j < matrix.ColumnCount; j++) - { - matrix[i, j] *= weights[j]; - } - } - - return matrix; - } - private MathNet.Numerics.LinearAlgebra.Vector IdealValues(Matrix matrix, bool pis) - { - return MathNet.Numerics.LinearAlgebra.Vector.Build - .Dense(matrix.ColumnCount, i => - { - var columnValues = matrix.Column(i).ToArray(); - return pis ? columnValues.Max() : columnValues.Min(); - }); - } - private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance(Matrix matrix, MathNet.Numerics.LinearAlgebra.Vector ideal) - { - return MathNet.Numerics.LinearAlgebra.Vector.Build - .DenseOfArray(matrix - .EnumerateRows() - .Select(row => row.Subtract(ideal) - .PointwisePower((TValue)Convert.ChangeType(2,typeof(TValue))) - .PointwiseSqrt() - .Sum()) - .ToArray()); - } - private MathNet.Numerics.LinearAlgebra.Vector CalculateTopsisScores(MathNet.Numerics.LinearAlgebra.Vector distanceToBest, MathNet.Numerics.LinearAlgebra.Vector distanceToWorst) - { - return distanceToWorst - .PointwiseDivide(distanceToBest.Add(distanceToWorst)); - } -} \ No newline at end of file diff --git a/McdaMethods/Models/IAlternative.cs b/McdaMethods/Models/IAlternative.cs deleted file mode 100644 index 4ce341d..0000000 --- a/McdaMethods/Models/IAlternative.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace McdaMethods.Models; - -public interface IAlternative -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/McdaMethods/Models/ICriteria.cs b/McdaMethods/Models/ICriteria.cs deleted file mode 100644 index 8c1dd00..0000000 --- a/McdaMethods/Models/ICriteria.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace McdaMethods.Models; - -public interface ICriteria -{ - public string Name { get; set; } - public double Value { get; set; } -} \ No newline at end of file diff --git a/McdaMethods/Normalization/DataNormalization.cs b/McdaMethods/Normalization/DataNormalization.cs deleted file mode 100644 index 5f86bdb..0000000 --- a/McdaMethods/Normalization/DataNormalization.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; -using McdaMethods.Normalization.NormalizationMethods.Abstraction; - -namespace McdaMethods.Normalization; - -public class DataNormalization(INormalizationMethod method) : IDataNormalization -where TValue : struct, INumber -{ - public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) - { - var normalizedMatrix = Matrix.Build.Dense(matrix.RowCount, matrix.ColumnCount); - matrix.CopyTo(normalizedMatrix); - - for (var i = 0; i < matrix.ColumnCount; i++) - { - var rowVector = matrix.Column(i); - - if (criteriaTypes[i] == 1) - { - normalizedMatrix.SetColumn(i, method.Normalize(rowVector, false)); - } - else - { - normalizedMatrix.SetColumn(i, method.Normalize(rowVector, true)); - } - } - return normalizedMatrix; - } -} \ No newline at end of file diff --git a/McdaMethods/Normalization/IDataNormalization.cs b/McdaMethods/Normalization/IDataNormalization.cs deleted file mode 100644 index a4ee19c..0000000 --- a/McdaMethods/Normalization/IDataNormalization.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; - -namespace McdaMethods.Normalization; - -public interface IDataNormalization -where TValue : struct, INumber -{ - Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); -} \ No newline at end of file diff --git a/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs b/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs deleted file mode 100644 index 863c228..0000000 --- a/McdaMethods/Normalization/NormalizationMethods/Abstraction/INormalizationMethod.cs +++ /dev/null @@ -1,10 +0,0 @@ - -using System.Numerics; - -namespace McdaMethods.Normalization.NormalizationMethods.Abstraction; - -public interface INormalizationMethod -where TValue : struct, INumber -{ - MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost); -} \ No newline at end of file diff --git a/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs b/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs deleted file mode 100644 index ba3d7fa..0000000 --- a/McdaMethods/Normalization/NormalizationMethods/MinMaxNormalization.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Numerics; -using MathNet.Numerics; -using McdaMethods.Normalization.NormalizationMethods.Abstraction; -using static System.Double; - - -namespace McdaMethods.Normalization.NormalizationMethods; - -public class MinMaxNormalization : INormalizationMethod -where TValue : struct, INumber -{ - public MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) - { - if (data.Maximum() == data.Minimum()) - { - return MathNet.Numerics.LinearAlgebra.Vector.Build.Dense(data.Count, (i) => (TValue)Convert.ChangeType(1,typeof(TValue))); - } - - TValue difference = data.Maximum() - data.Minimum(); - - if (cost) - { - return (data.Maximum() - data) / difference; - } - return (data - data.Minimum()) / difference; - } -} \ No newline at end of file diff --git a/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs b/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs new file mode 100644 index 0000000..e4a62e7 --- /dev/null +++ b/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs @@ -0,0 +1,25 @@ +using MathNet.Numerics; +using MathNet.Numerics.LinearAlgebra; + +namespace McdaToolkit.UnitTests.Helpers; + +public abstract class TestHelpers +{ + public static bool IsResultTheSame(Vector vector,double[] expected) + { + var epsilon = 1.11e-16; + var result = vector + .Enumerate() + .Zip(expected, (r,e) => + new {result = r, expected = e}); + + foreach (var item in result) + { + if (Math.Abs(item.expected - item.result) > epsilon) + { + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs b/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs new file mode 100644 index 0000000..0a8132b --- /dev/null +++ b/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs @@ -0,0 +1,38 @@ +using FluentAssertions; +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.Mcda; +using McdaToolkit.Options; +using McdaToolkit.UnitTests.Helpers; + +namespace McdaToolkit.UnitTests.McdaMethods; + +public class TopsisTests +{ + [Fact] + public void CalculateMatrixOfDouble_ShouldReturn_CorrectExpectedMatrix() + { + var matrix = new double[,] + { + { 1, 3000 }, + { 2, 3750 }, + { 5, 4500 } + }; + double[] weights = new double[] + { + 0.5,0.5 + }; + int[] types = new int[] + { + -1, + 1 + }; + double[] expectedTopsisScore = new double[] + { + 0.5, 0.625, 0.5 + }; + + var topsis = new TopsisMethod(); + var result = topsis.Calculate(matrix,weights,types); + TestHelpers.IsResultTheSame(result,expectedTopsisScore).Should().BeTrue(); + } +} \ No newline at end of file diff --git a/McdaToolkit.UnitTests/McdaToolkit.UnitTests.csproj b/McdaToolkit.UnitTests/McdaToolkit.UnitTests.csproj new file mode 100644 index 0000000..b428fc1 --- /dev/null +++ b/McdaToolkit.UnitTests/McdaToolkit.UnitTests.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/McdaToolkit/Enums/NormalizationMethod.cs b/McdaToolkit/Enums/NormalizationMethod.cs new file mode 100644 index 0000000..5eda8d9 --- /dev/null +++ b/McdaToolkit/Enums/NormalizationMethod.cs @@ -0,0 +1,6 @@ +namespace McdaToolkit.Enums; + +public enum NormalizationMethod +{ + MinMax +} \ No newline at end of file diff --git a/McdaToolkit/Extensions/EnumerableExtentions.cs b/McdaToolkit/Extensions/EnumerableExtentions.cs new file mode 100644 index 0000000..cb0ae6f --- /dev/null +++ b/McdaToolkit/Extensions/EnumerableExtentions.cs @@ -0,0 +1,15 @@ +namespace McdaToolkit.Extensions; + +internal static class EnumerableExtentions +{ + public static IEnumerable<(T item, int index)> Indexed(this IEnumerable source) + { + ArgumentNullException.ThrowIfNull(source); + var i = 0; + foreach (var item in source) + { + yield return (item, i); + ++i; + } + } +} \ No newline at end of file diff --git a/McdaToolkit/Mcda/Abstraction/IMethod.cs b/McdaToolkit/Mcda/Abstraction/IMethod.cs new file mode 100644 index 0000000..4e72ea4 --- /dev/null +++ b/McdaToolkit/Mcda/Abstraction/IMethod.cs @@ -0,0 +1,6 @@ +namespace McdaToolkit.Mcda.Abstraction; + +public interface IMethod +{ + MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, int[] criteriaDirections); +} \ No newline at end of file diff --git a/McdaToolkit/Mcda/Abstraction/McdaMethod.cs b/McdaToolkit/Mcda/Abstraction/McdaMethod.cs new file mode 100644 index 0000000..c6da69d --- /dev/null +++ b/McdaToolkit/Mcda/Abstraction/McdaMethod.cs @@ -0,0 +1,17 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.Enums; +using McdaToolkit.Normalization; +using McdaToolkit.Normalization.Abstraction; + +namespace McdaToolkit.Mcda.Abstraction; + +public abstract class McdaMethod : IMethod +{ + protected IDataNormalization DataNormalization = new DataNormalization(NormalizationMethod.MinMax); + + public abstract MathNet.Numerics.LinearAlgebra.Vector Calculate( + double[,] matrix, + double[] weights, + int[] criteriaDirections); +} \ No newline at end of file diff --git a/McdaToolkit/Mcda/TopsisMethod.cs b/McdaToolkit/Mcda/TopsisMethod.cs new file mode 100644 index 0000000..6f0b01e --- /dev/null +++ b/McdaToolkit/Mcda/TopsisMethod.cs @@ -0,0 +1,78 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.Mcda.Abstraction; +using McdaToolkit.Normalization; +using McdaToolkit.Options; + +namespace McdaToolkit.Mcda; + +public class TopsisMethod : McdaMethod +{ + public TopsisMethod() + { + + } + + public TopsisMethod(McdaMethodOptions options) + { + DataNormalization = new DataNormalization(options.NormalizationMethod); + } + + public override MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, + int[] criteriaDirections) + { + var convertedMatrix = Matrix.Build.DenseOfArray(matrix); + return Calculate(convertedMatrix,weights, criteriaDirections); + } + + private MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, double[] weights, int[] criteriaDirections) + { + var normalizedMatrix = DataNormalization.NormalizeMatrix(matrix, criteriaDirections); + var weightedMatrix = WeightedMatrix(normalizedMatrix, weights); + + var idealBest = IdealValues(weightedMatrix, true); + var idealWorst = IdealValues(weightedMatrix, false); + + var distanceToBest = CalculateEuclideanDistance(weightedMatrix, idealBest); + var distanceToWorst = CalculateEuclideanDistance(weightedMatrix, idealWorst); + var topsisScores = CalculateTopsisScores(distanceToBest, distanceToWorst); + + return topsisScores; + } + private Matrix WeightedMatrix(Matrix matrix, double[] weights) + { + for (int i = 0; i < matrix.RowCount; i++) + { + for (int j = 0; j < matrix.ColumnCount; j++) + { + matrix[i, j] *= weights[j]; + } + } + return matrix; + } + private MathNet.Numerics.LinearAlgebra.Vector IdealValues(Matrix matrix, bool pis) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build + .Dense(matrix.ColumnCount, i => + { + var columnValues = matrix.Column(i).ToArray(); + return pis ? columnValues.Max() : columnValues.Min(); + }); + } + private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance(Matrix matrix, MathNet.Numerics.LinearAlgebra.Vector ideal) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build + .DenseOfArray(matrix + .EnumerateRows() + .Select(row => row.Subtract(ideal) + .PointwisePower(2) + .PointwiseSqrt() + .Sum()) + .ToArray()); + } + private MathNet.Numerics.LinearAlgebra.Vector CalculateTopsisScores(MathNet.Numerics.LinearAlgebra.Vector distanceToBest, MathNet.Numerics.LinearAlgebra.Vector distanceToWorst) + { + return distanceToWorst + .PointwiseDivide(distanceToBest.Add(distanceToWorst)); + } +} \ No newline at end of file diff --git a/McdaMethods/McdaMethods.csproj b/McdaToolkit/McdaToolkit.csproj similarity index 100% rename from McdaMethods/McdaMethods.csproj rename to McdaToolkit/McdaToolkit.csproj diff --git a/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs b/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs new file mode 100644 index 0000000..ebdcecc --- /dev/null +++ b/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs @@ -0,0 +1,9 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; + +namespace McdaToolkit.Normalization.Abstraction; + +public interface IDataNormalization +{ + Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); +} \ No newline at end of file diff --git a/McdaToolkit/Normalization/DataNormalization.cs b/McdaToolkit/Normalization/DataNormalization.cs new file mode 100644 index 0000000..f65bc87 --- /dev/null +++ b/McdaToolkit/Normalization/DataNormalization.cs @@ -0,0 +1,27 @@ +using System.Numerics; +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.Enums; +using McdaToolkit.Extensions; +using McdaToolkit.Normalization.Abstraction; +using McdaToolkit.NormalizationMethods.Abstraction; +using McdaToolkit.Options; + +namespace McdaToolkit.Normalization; + + +internal class DataNormalization(NormalizationMethod method) : IDataNormalization +{ + private readonly INormalizationMethod _method = NormalizationFactory.CreateNormalizationMethod(method); + + public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) + { + foreach (var (col,index) in matrix.EnumerateColumns().Indexed()) + { + matrix.SetColumn(index, + criteriaTypes[index] == 1 + ? _method.Normalize(data: col, cost: false) + : _method.Normalize(data: col, cost: true)); + } + return matrix; + } +} diff --git a/McdaToolkit/NormalizationFactory.cs b/McdaToolkit/NormalizationFactory.cs new file mode 100644 index 0000000..7f99d08 --- /dev/null +++ b/McdaToolkit/NormalizationFactory.cs @@ -0,0 +1,18 @@ +using System.Numerics; +using McdaToolkit.Enums; +using McdaToolkit.NormalizationMethods; +using McdaToolkit.NormalizationMethods.Abstraction; + +namespace McdaToolkit; + +internal static class NormalizationFactory +{ + public static INormalizationMethod CreateNormalizationMethod(NormalizationMethod method) + { + return method switch + { + NormalizationMethod.MinMax => new MinMaxNormalization(), + _ => throw new Exception("Not existing normalization") + }; + } +} \ No newline at end of file diff --git a/McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs b/McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs new file mode 100644 index 0000000..b5f3513 --- /dev/null +++ b/McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs @@ -0,0 +1,9 @@ + +using System.Numerics; + +namespace McdaToolkit.NormalizationMethods.Abstraction; + +public interface INormalizationMethod +{ + MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost); +} \ No newline at end of file diff --git a/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs new file mode 100644 index 0000000..1d6b4fa --- /dev/null +++ b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs @@ -0,0 +1,23 @@ +using System.Numerics; +using McdaToolkit.NormalizationMethods.Abstraction; + +namespace McdaToolkit.NormalizationMethods; + +public class MinMaxNormalization : INormalizationMethod +{ + public MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) + { + double difference = data.Maximum() - data.Minimum(); + + if (Math.Abs(difference) < double.Epsilon) + { + return MathNet.Numerics.LinearAlgebra.Vector.Build.Dense(data.Count, (i) => 1); + } + + if (cost) + { + return (data.Maximum() - data) / difference; + } + return (data - data.Minimum()) / difference; + } +} \ No newline at end of file diff --git a/McdaToolkit/Options/McdaMethodOptions.cs b/McdaToolkit/Options/McdaMethodOptions.cs new file mode 100644 index 0000000..86d8ced --- /dev/null +++ b/McdaToolkit/Options/McdaMethodOptions.cs @@ -0,0 +1,8 @@ +using McdaToolkit.Enums; + +namespace McdaToolkit.Options; + +public class McdaMethodOptions +{ + public NormalizationMethod NormalizationMethod { get; set; } = NormalizationMethod.MinMax; +} \ No newline at end of file From 11e2f9f181c64cf605b03bf9fb38a26f828ce8e7 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Mon, 3 Jun 2024 00:06:28 +0200 Subject: [PATCH 16/21] chore(release): 1.0.0 --- McdaToolkit/CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 McdaToolkit/CHANGELOG.md diff --git a/McdaToolkit/CHANGELOG.md b/McdaToolkit/CHANGELOG.md new file mode 100644 index 0000000..b42125c --- /dev/null +++ b/McdaToolkit/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [versionize](https://github.com/versionize/versionize) for commit guidelines. + + +## [1.0.0](https://www.github.com/SarcasticMoose/mcda-toolkit/releases/tag/v1.0.0) (2024-06-03) + +### Features + +* add enumeration iteration with index ([5196aa1](https://www.github.com/SarcasticMoose/mcda-toolkit/commit/5196aa1df9c2b86d6a495454b2e3fb9a2a5f3d1d)) +* add generic methods ([d75c45e](https://www.github.com/SarcasticMoose/mcda-toolkit/commit/d75c45e9bb11a8a001be2151ffd8a070d1461fc7)) +* add versioning ([69b93d0](https://www.github.com/SarcasticMoose/mcda-toolkit/commit/69b93d0b2d4669bb7ffb28f3e36fb754280ea352)) + From 605888d963dec94ce6f73b5ce3d109286d8e2021 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Mon, 3 Jun 2024 00:06:40 +0200 Subject: [PATCH 17/21] chore(release): 1.0.1 --- McdaToolkit/CHANGELOG.md | 3 +++ McdaToolkit/McdaToolkit.csproj | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/McdaToolkit/CHANGELOG.md b/McdaToolkit/CHANGELOG.md index b42125c..c3cab80 100644 --- a/McdaToolkit/CHANGELOG.md +++ b/McdaToolkit/CHANGELOG.md @@ -2,6 +2,9 @@ All notable changes to this project will be documented in this file. See [versionize](https://github.com/versionize/versionize) for commit guidelines. + +## [1.0.1](https://www.github.com/SarcasticMoose/mcda-toolkit/releases/tag/v1.0.1) (2024-06-03) + ## [1.0.0](https://www.github.com/SarcasticMoose/mcda-toolkit/releases/tag/v1.0.0) (2024-06-03) diff --git a/McdaToolkit/McdaToolkit.csproj b/McdaToolkit/McdaToolkit.csproj index 27ff54c..990ee77 100644 --- a/McdaToolkit/McdaToolkit.csproj +++ b/McdaToolkit/McdaToolkit.csproj @@ -1,10 +1,10 @@ - + net8.0 enable enable - 1.0.0 + 1.0.1 From 5b133ffc32a137bd345829b51cdb5132a71aefa5 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Tue, 4 Jun 2024 21:31:49 +0200 Subject: [PATCH 18/21] refactor: renaming modules, cleaning etc refactor: changed folders structure --- .../Helpers/DoubleHelpers.cs | 6 +-- .../McdaMethods/TopsisTests.cs | 38 -------------- McdaToolkit.UnitTests/McdaMethodsTests.cs | 52 +++++++++++++++++++ .../NormalizationUnitTests.cs | 46 ++++++++++++++++ ...onMethod.cs => NormalizationMethodEnum.cs} | 2 +- McdaToolkit/Mcda/Abstraction/McdaMethod.cs | 17 ------ .../{Abstraction => Interfaces}/IMethod.cs | 2 +- McdaToolkit/Mcda/TopsisMethod.cs | 23 ++++---- .../Abstraction/IDataNormalization.cs | 9 ---- ...ization.cs => DataNormalizationService.cs} | 16 +++--- .../Interfaces/IDataNormalization.cs | 8 +++ McdaToolkit/NormalizationFactory.cs | 8 +-- .../INormalizationMethod.cs | 4 +- .../MinMaxNormalization.cs | 12 +++-- McdaToolkit/Options/McdaMethodOptions.cs | 2 +- 15 files changed, 146 insertions(+), 99 deletions(-) delete mode 100644 McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs create mode 100644 McdaToolkit.UnitTests/McdaMethodsTests.cs create mode 100644 McdaToolkit.UnitTests/NormalizationUnitTests.cs rename McdaToolkit/Enums/{NormalizationMethod.cs => NormalizationMethodEnum.cs} (56%) delete mode 100644 McdaToolkit/Mcda/Abstraction/McdaMethod.cs rename McdaToolkit/Mcda/{Abstraction => Interfaces}/IMethod.cs (79%) delete mode 100644 McdaToolkit/Normalization/Abstraction/IDataNormalization.cs rename McdaToolkit/Normalization/{DataNormalization.cs => DataNormalizationService.cs} (50%) create mode 100644 McdaToolkit/Normalization/Interfaces/IDataNormalization.cs rename McdaToolkit/NormalizationMethods/{Abstraction => Interfaces}/INormalizationMethod.cs (67%) diff --git a/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs b/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs index e4a62e7..6df6c05 100644 --- a/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs +++ b/McdaToolkit.UnitTests/Helpers/DoubleHelpers.cs @@ -15,11 +15,11 @@ public static bool IsResultTheSame(Vector vector,double[] expected) foreach (var item in result) { - if (Math.Abs(item.expected - item.result) > epsilon) + if (Math.Abs(item.expected - item.result) < epsilon) { - return false; + return true; } } - return true; + return false; } } \ No newline at end of file diff --git a/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs b/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs deleted file mode 100644 index 0a8132b..0000000 --- a/McdaToolkit.UnitTests/McdaMethods/TopsisTests.cs +++ /dev/null @@ -1,38 +0,0 @@ -using FluentAssertions; -using MathNet.Numerics.LinearAlgebra; -using McdaToolkit.Mcda; -using McdaToolkit.Options; -using McdaToolkit.UnitTests.Helpers; - -namespace McdaToolkit.UnitTests.McdaMethods; - -public class TopsisTests -{ - [Fact] - public void CalculateMatrixOfDouble_ShouldReturn_CorrectExpectedMatrix() - { - var matrix = new double[,] - { - { 1, 3000 }, - { 2, 3750 }, - { 5, 4500 } - }; - double[] weights = new double[] - { - 0.5,0.5 - }; - int[] types = new int[] - { - -1, - 1 - }; - double[] expectedTopsisScore = new double[] - { - 0.5, 0.625, 0.5 - }; - - var topsis = new TopsisMethod(); - var result = topsis.Calculate(matrix,weights,types); - TestHelpers.IsResultTheSame(result,expectedTopsisScore).Should().BeTrue(); - } -} \ No newline at end of file diff --git a/McdaToolkit.UnitTests/McdaMethodsTests.cs b/McdaToolkit.UnitTests/McdaMethodsTests.cs new file mode 100644 index 0000000..f67115b --- /dev/null +++ b/McdaToolkit.UnitTests/McdaMethodsTests.cs @@ -0,0 +1,52 @@ +using FluentAssertions; +using MathNet.Numerics; +using McdaToolkit.Mcda; +using McdaToolkit.UnitTests.Helpers; +using Xunit.Abstractions; + +namespace McdaToolkit.UnitTests; + +public class McdaMethodsTests +{ + private readonly ITestOutputHelper _testOutputHelper; + + public McdaMethodsTests(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + [Fact] + public void Calculate_TopsisMethod_ShouldBeEqualToExpected() + { + var matrix = new double[,] + { + { 66, 56, 95 }, + { 61, 55, 166 }, + { 65, 49, 113 }, + { 95, 56, 99 }, + { 63, 43, 178 }, + { 74, 59, 140 }, + }; + double[] weights = new double[] + { + 0.4,0.25,0.35 + }; + int[] types = new int[] + { + -1, + -1, + 1 + }; + double[] expectedTopsisScore = new double[] + { + 0.38805147,0.76189759,0.58509479,0.06374247,0.97647059,0.43681786 + }; + + var topsis = new TopsisMethod(); + var result = topsis.Calculate(matrix,weights,types); + result.Enumerate() + .Select(x => x.Round(8)) + .Should() + .BeEquivalentTo(expectedTopsisScore); + } +} \ No newline at end of file diff --git a/McdaToolkit.UnitTests/NormalizationUnitTests.cs b/McdaToolkit.UnitTests/NormalizationUnitTests.cs new file mode 100644 index 0000000..8b3f921 --- /dev/null +++ b/McdaToolkit.UnitTests/NormalizationUnitTests.cs @@ -0,0 +1,46 @@ +using FluentAssertions; +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.Enums; +using McdaToolkit.Normalization; + +namespace McdaToolkit.UnitTests; + +public class NormalizationUnitTests +{ + [Fact] + public void Normalize_MinMaxNormalization_ShouldReturnedExpectedValues() + { + var matrixToNormalize = Matrix.Build.DenseOfArray(new double[,] + { + { 66, 56, 95 }, + { 61, 55, 166 }, + { 65, 49, 113 }, + { 95, 56, 99 }, + { 63, 43, 178 }, + { 74, 59, 140 }, + }); + + var expected = new double[][] + { + [0.85294118, 0.1875, 0.0], + [1.0, 0.25, 0.85542169], + [0.88235294, 0.625, 0.21686747], + [0.0, 0.1875, 0.04819277], + [0.94117647, 1.0, 1.0], + [0.61764706, 0.0, 0.54216867] + }; + + int[] types = [-1,-1, 1]; + + var dataNormalization = new DataNormalizationService(NormalizationMethodEnum.MinMax); + + var normalizedMatrix = dataNormalization.NormalizeMatrix(matrixToNormalize,types); + + var equalityResult = normalizedMatrix + .EnumerateRows() + .Select((x, i) => Helpers.TestHelpers.IsResultTheSame(x, expected[i])) + .All(y => y); + + equalityResult.Should().BeTrue(); + } +} \ No newline at end of file diff --git a/McdaToolkit/Enums/NormalizationMethod.cs b/McdaToolkit/Enums/NormalizationMethodEnum.cs similarity index 56% rename from McdaToolkit/Enums/NormalizationMethod.cs rename to McdaToolkit/Enums/NormalizationMethodEnum.cs index 5eda8d9..c3e52f7 100644 --- a/McdaToolkit/Enums/NormalizationMethod.cs +++ b/McdaToolkit/Enums/NormalizationMethodEnum.cs @@ -1,6 +1,6 @@ namespace McdaToolkit.Enums; -public enum NormalizationMethod +public enum NormalizationMethodEnum { MinMax } \ No newline at end of file diff --git a/McdaToolkit/Mcda/Abstraction/McdaMethod.cs b/McdaToolkit/Mcda/Abstraction/McdaMethod.cs deleted file mode 100644 index c6da69d..0000000 --- a/McdaToolkit/Mcda/Abstraction/McdaMethod.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; -using McdaToolkit.Enums; -using McdaToolkit.Normalization; -using McdaToolkit.Normalization.Abstraction; - -namespace McdaToolkit.Mcda.Abstraction; - -public abstract class McdaMethod : IMethod -{ - protected IDataNormalization DataNormalization = new DataNormalization(NormalizationMethod.MinMax); - - public abstract MathNet.Numerics.LinearAlgebra.Vector Calculate( - double[,] matrix, - double[] weights, - int[] criteriaDirections); -} \ No newline at end of file diff --git a/McdaToolkit/Mcda/Abstraction/IMethod.cs b/McdaToolkit/Mcda/Interfaces/IMethod.cs similarity index 79% rename from McdaToolkit/Mcda/Abstraction/IMethod.cs rename to McdaToolkit/Mcda/Interfaces/IMethod.cs index 4e72ea4..5705f4a 100644 --- a/McdaToolkit/Mcda/Abstraction/IMethod.cs +++ b/McdaToolkit/Mcda/Interfaces/IMethod.cs @@ -1,4 +1,4 @@ -namespace McdaToolkit.Mcda.Abstraction; +namespace McdaToolkit.Mcda.Interfaces; public interface IMethod { diff --git a/McdaToolkit/Mcda/TopsisMethod.cs b/McdaToolkit/Mcda/TopsisMethod.cs index 6f0b01e..5be6233 100644 --- a/McdaToolkit/Mcda/TopsisMethod.cs +++ b/McdaToolkit/Mcda/TopsisMethod.cs @@ -1,33 +1,35 @@ using System.Numerics; using MathNet.Numerics.LinearAlgebra; -using McdaToolkit.Mcda.Abstraction; +using McdaToolkit.Enums; +using McdaToolkit.Mcda.Interfaces; using McdaToolkit.Normalization; using McdaToolkit.Options; namespace McdaToolkit.Mcda; -public class TopsisMethod : McdaMethod +public class TopsisMethod : IMethod { + private DataNormalizationService _normalizationServiceService; public TopsisMethod() - { - + { + _normalizationServiceService = new DataNormalizationService(NormalizationMethodEnum.MinMax); } public TopsisMethod(McdaMethodOptions options) { - DataNormalization = new DataNormalization(options.NormalizationMethod); + _normalizationServiceService = new DataNormalizationService(options.NormalizationMethodEnum); } - public override MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, + public MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, int[] criteriaDirections) { var convertedMatrix = Matrix.Build.DenseOfArray(matrix); return Calculate(convertedMatrix,weights, criteriaDirections); } - private MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix matrix, double[] weights, int[] criteriaDirections) + private MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix? matrix, double[] weights, int[] criteriaDirections) { - var normalizedMatrix = DataNormalization.NormalizeMatrix(matrix, criteriaDirections); + var normalizedMatrix = _normalizationServiceService.NormalizeMatrix(matrix, criteriaDirections); var weightedMatrix = WeightedMatrix(normalizedMatrix, weights); var idealBest = IdealValues(weightedMatrix, true); @@ -64,7 +66,8 @@ private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance return MathNet.Numerics.LinearAlgebra.Vector.Build .DenseOfArray(matrix .EnumerateRows() - .Select(row => row.Subtract(ideal) + .Select(row => row + .Subtract(ideal) .PointwisePower(2) .PointwiseSqrt() .Sum()) @@ -75,4 +78,4 @@ private MathNet.Numerics.LinearAlgebra.Vector CalculateTopsisScores(Math return distanceToWorst .PointwiseDivide(distanceToBest.Add(distanceToWorst)); } -} \ No newline at end of file +} diff --git a/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs b/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs deleted file mode 100644 index ebdcecc..0000000 --- a/McdaToolkit/Normalization/Abstraction/IDataNormalization.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Numerics; -using MathNet.Numerics.LinearAlgebra; - -namespace McdaToolkit.Normalization.Abstraction; - -public interface IDataNormalization -{ - Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); -} \ No newline at end of file diff --git a/McdaToolkit/Normalization/DataNormalization.cs b/McdaToolkit/Normalization/DataNormalizationService.cs similarity index 50% rename from McdaToolkit/Normalization/DataNormalization.cs rename to McdaToolkit/Normalization/DataNormalizationService.cs index f65bc87..ad04b3e 100644 --- a/McdaToolkit/Normalization/DataNormalization.cs +++ b/McdaToolkit/Normalization/DataNormalizationService.cs @@ -2,26 +2,28 @@ using MathNet.Numerics.LinearAlgebra; using McdaToolkit.Enums; using McdaToolkit.Extensions; -using McdaToolkit.Normalization.Abstraction; -using McdaToolkit.NormalizationMethods.Abstraction; +using McdaToolkit.Normalization.Interfaces; +using McdaToolkit.NormalizationMethods.Interfaces; using McdaToolkit.Options; namespace McdaToolkit.Normalization; -internal class DataNormalization(NormalizationMethod method) : IDataNormalization +public class DataNormalizationService(NormalizationMethodEnum methodEnum) : IDataNormalization { - private readonly INormalizationMethod _method = NormalizationFactory.CreateNormalizationMethod(method); + private readonly INormalizationMethod _method = NormalizationFactory.CreateNormalizationMethod(methodEnum); - public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) + public Matrix NormalizeMatrix(Matrix? matrix, int[] criteriaTypes) { + var normalizedMatrix = Matrix.Build.Dense(matrix.RowCount, matrix.ColumnCount); + foreach (var (col,index) in matrix.EnumerateColumns().Indexed()) { - matrix.SetColumn(index, + normalizedMatrix.SetColumn(index, criteriaTypes[index] == 1 ? _method.Normalize(data: col, cost: false) : _method.Normalize(data: col, cost: true)); } - return matrix; + return normalizedMatrix; } } diff --git a/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs b/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs new file mode 100644 index 0000000..5431713 --- /dev/null +++ b/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs @@ -0,0 +1,8 @@ +using MathNet.Numerics.LinearAlgebra; + +namespace McdaToolkit.Normalization.Interfaces; + +public interface IDataNormalization +{ + Matrix NormalizeMatrix(Matrix? matrix, int[] criteriaTypes); +} \ No newline at end of file diff --git a/McdaToolkit/NormalizationFactory.cs b/McdaToolkit/NormalizationFactory.cs index 7f99d08..e8ede78 100644 --- a/McdaToolkit/NormalizationFactory.cs +++ b/McdaToolkit/NormalizationFactory.cs @@ -1,17 +1,17 @@ using System.Numerics; using McdaToolkit.Enums; using McdaToolkit.NormalizationMethods; -using McdaToolkit.NormalizationMethods.Abstraction; +using McdaToolkit.NormalizationMethods.Interfaces; namespace McdaToolkit; internal static class NormalizationFactory { - public static INormalizationMethod CreateNormalizationMethod(NormalizationMethod method) + public static INormalizationMethod CreateNormalizationMethod(NormalizationMethodEnum methodEnum) { - return method switch + return methodEnum switch { - NormalizationMethod.MinMax => new MinMaxNormalization(), + NormalizationMethodEnum.MinMax => new MinMaxNormalization(), _ => throw new Exception("Not existing normalization") }; } diff --git a/McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs b/McdaToolkit/NormalizationMethods/Interfaces/INormalizationMethod.cs similarity index 67% rename from McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs rename to McdaToolkit/NormalizationMethods/Interfaces/INormalizationMethod.cs index b5f3513..a56c642 100644 --- a/McdaToolkit/NormalizationMethods/Abstraction/INormalizationMethod.cs +++ b/McdaToolkit/NormalizationMethods/Interfaces/INormalizationMethod.cs @@ -1,7 +1,5 @@ -using System.Numerics; - -namespace McdaToolkit.NormalizationMethods.Abstraction; +namespace McdaToolkit.NormalizationMethods.Interfaces; public interface INormalizationMethod { diff --git a/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs index 1d6b4fa..b00a9f4 100644 --- a/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs +++ b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs @@ -1,5 +1,5 @@ using System.Numerics; -using McdaToolkit.NormalizationMethods.Abstraction; +using McdaToolkit.NormalizationMethods.Interfaces; namespace McdaToolkit.NormalizationMethods; @@ -7,17 +7,19 @@ public class MinMaxNormalization : INormalizationMethod { public MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) { - double difference = data.Maximum() - data.Minimum(); + var max = data.Maximum(); + var min = data.Minimum(); + var difference = max - min; - if (Math.Abs(difference) < double.Epsilon) + if (Math.Abs(difference) < 1.11e-16) { return MathNet.Numerics.LinearAlgebra.Vector.Build.Dense(data.Count, (i) => 1); } if (cost) { - return (data.Maximum() - data) / difference; + return (max - data) / difference; } - return (data - data.Minimum()) / difference; + return (data - min) / difference; } } \ No newline at end of file diff --git a/McdaToolkit/Options/McdaMethodOptions.cs b/McdaToolkit/Options/McdaMethodOptions.cs index 86d8ced..ebbd381 100644 --- a/McdaToolkit/Options/McdaMethodOptions.cs +++ b/McdaToolkit/Options/McdaMethodOptions.cs @@ -4,5 +4,5 @@ namespace McdaToolkit.Options; public class McdaMethodOptions { - public NormalizationMethod NormalizationMethod { get; set; } = NormalizationMethod.MinMax; + public NormalizationMethodEnum NormalizationMethodEnum { get; set; } = NormalizationMethodEnum.MinMax; } \ No newline at end of file From 962a157b352f8b08b1de16a611bbf237d7ba8ec0 Mon Sep 17 00:00:00 2001 From: SarcasticMoose Date: Wed, 5 Jun 2024 09:15:10 +0200 Subject: [PATCH 19/21] refactor: code cleaning feat: add nuget info --- McdaMethods.sln | 6 +++ McdaToolkit.UnitTests/McdaMethodsTests.cs | 2 +- .../Extensions/EnumerableExtentions.cs | 6 ++- McdaToolkit/Mcda/Interfaces/IMethod.cs | 6 --- McdaToolkit/McdaMethods/Interfaces/IMethod.cs | 9 ++++ McdaToolkit/McdaMethods/McdaMethod.cs | 21 +++++++++ .../{Mcda => McdaMethods}/TopsisMethod.cs | 45 +++++++++---------- McdaToolkit/McdaToolkit.csproj | 11 ++++- .../Normalization/DataNormalizationService.cs | 2 +- .../Interfaces/IDataNormalization.cs | 2 +- .../MinMaxNormalization.cs | 7 ++- 11 files changed, 78 insertions(+), 39 deletions(-) delete mode 100644 McdaToolkit/Mcda/Interfaces/IMethod.cs create mode 100644 McdaToolkit/McdaMethods/Interfaces/IMethod.cs create mode 100644 McdaToolkit/McdaMethods/McdaMethod.cs rename McdaToolkit/{Mcda => McdaMethods}/TopsisMethod.cs (61%) diff --git a/McdaMethods.sln b/McdaMethods.sln index 7f4097e..e6dba29 100644 --- a/McdaMethods.sln +++ b/McdaMethods.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit", "McdaToolkit\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit.UnitTests", "McdaToolkit.UnitTests\McdaToolkit.UnitTests.csproj", "{675DE565-59A0-4865-A306-B12FCC64EF1F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestUddsadsada", "TestUddsadsada\TestUddsadsada.csproj", "{C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {675DE565-59A0-4865-A306-B12FCC64EF1F}.Debug|Any CPU.Build.0 = Debug|Any CPU {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.ActiveCfg = Release|Any CPU {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.Build.0 = Release|Any CPU + {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/McdaToolkit.UnitTests/McdaMethodsTests.cs b/McdaToolkit.UnitTests/McdaMethodsTests.cs index f67115b..e1d34f6 100644 --- a/McdaToolkit.UnitTests/McdaMethodsTests.cs +++ b/McdaToolkit.UnitTests/McdaMethodsTests.cs @@ -1,6 +1,6 @@ using FluentAssertions; using MathNet.Numerics; -using McdaToolkit.Mcda; +using McdaToolkit.McdaMethods; using McdaToolkit.UnitTests.Helpers; using Xunit.Abstractions; diff --git a/McdaToolkit/Extensions/EnumerableExtentions.cs b/McdaToolkit/Extensions/EnumerableExtentions.cs index cb0ae6f..4d2848d 100644 --- a/McdaToolkit/Extensions/EnumerableExtentions.cs +++ b/McdaToolkit/Extensions/EnumerableExtentions.cs @@ -4,7 +4,11 @@ internal static class EnumerableExtentions { public static IEnumerable<(T item, int index)> Indexed(this IEnumerable source) { - ArgumentNullException.ThrowIfNull(source); + if (source is null) + { + throw new ArgumentNullException(); + } + var i = 0; foreach (var item in source) { diff --git a/McdaToolkit/Mcda/Interfaces/IMethod.cs b/McdaToolkit/Mcda/Interfaces/IMethod.cs deleted file mode 100644 index 5705f4a..0000000 --- a/McdaToolkit/Mcda/Interfaces/IMethod.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace McdaToolkit.Mcda.Interfaces; - -public interface IMethod -{ - MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, int[] criteriaDirections); -} \ No newline at end of file diff --git a/McdaToolkit/McdaMethods/Interfaces/IMethod.cs b/McdaToolkit/McdaMethods/Interfaces/IMethod.cs new file mode 100644 index 0000000..0853a6c --- /dev/null +++ b/McdaToolkit/McdaMethods/Interfaces/IMethod.cs @@ -0,0 +1,9 @@ +using MathNet.Numerics.LinearAlgebra; + +namespace McdaToolkit.McdaMethods.Interfaces; + +public interface IMethod +{ + Vector Calculate(double[,] matrix, double[] weights, int[] criteriaDirections); + Vector Calculate(IEnumerable> matrix, double[] weights, int[] criteriaDirections); +} \ No newline at end of file diff --git a/McdaToolkit/McdaMethods/McdaMethod.cs b/McdaToolkit/McdaMethods/McdaMethod.cs new file mode 100644 index 0000000..9869d09 --- /dev/null +++ b/McdaToolkit/McdaMethods/McdaMethod.cs @@ -0,0 +1,21 @@ +using MathNet.Numerics.LinearAlgebra; +using McdaToolkit.McdaMethods.Interfaces; + +namespace McdaToolkit.McdaMethods; + +public abstract class McdaMethod : IMethod +{ + public Vector Calculate(double[,] matrix, double[] weights, int[] criteriaDirections) + { + var matrixTypeOfMatrix = Matrix.Build.DenseOfArray(matrix); + return Calculate(matrixTypeOfMatrix, weights, criteriaDirections); + } + + public Vector Calculate(IEnumerable> matrix, double[] weights, int[] criteriaDirections) + { + var matrixTypeOfMatrix = Matrix.Build.DenseOfRows(matrix); + return Calculate(matrixTypeOfMatrix, weights, criteriaDirections); + } + + protected abstract Vector Calculate(Matrix matrix, double[] weights, int[] criteriaDirections); +} \ No newline at end of file diff --git a/McdaToolkit/Mcda/TopsisMethod.cs b/McdaToolkit/McdaMethods/TopsisMethod.cs similarity index 61% rename from McdaToolkit/Mcda/TopsisMethod.cs rename to McdaToolkit/McdaMethods/TopsisMethod.cs index 5be6233..51fa068 100644 --- a/McdaToolkit/Mcda/TopsisMethod.cs +++ b/McdaToolkit/McdaMethods/TopsisMethod.cs @@ -1,33 +1,27 @@ -using System.Numerics; using MathNet.Numerics.LinearAlgebra; using McdaToolkit.Enums; -using McdaToolkit.Mcda.Interfaces; +using McdaToolkit.McdaMethods.Interfaces; using McdaToolkit.Normalization; using McdaToolkit.Options; -namespace McdaToolkit.Mcda; +namespace McdaToolkit.McdaMethods; -public class TopsisMethod : IMethod +public class TopsisMethod : McdaMethod { private DataNormalizationService _normalizationServiceService; + public TopsisMethod() - { + { _normalizationServiceService = new DataNormalizationService(NormalizationMethodEnum.MinMax); } - - public TopsisMethod(McdaMethodOptions options) - { - _normalizationServiceService = new DataNormalizationService(options.NormalizationMethodEnum); - } - public MathNet.Numerics.LinearAlgebra.Vector Calculate(double[,] matrix, double[] weights, - int[] criteriaDirections) + public TopsisMethod(McdaMethodOptions options) { - var convertedMatrix = Matrix.Build.DenseOfArray(matrix); - return Calculate(convertedMatrix,weights, criteriaDirections); + _normalizationServiceService = new DataNormalizationService(options.NormalizationMethodEnum); } - private MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix? matrix, double[] weights, int[] criteriaDirections) + protected override Vector Calculate(Matrix matrix, double[] weights, + int[] criteriaDirections) { var normalizedMatrix = _normalizationServiceService.NormalizeMatrix(matrix, criteriaDirections); var weightedMatrix = WeightedMatrix(normalizedMatrix, weights); @@ -41,6 +35,7 @@ private MathNet.Numerics.LinearAlgebra.Vector Calculate(Matrix? return topsisScores; } + private Matrix WeightedMatrix(Matrix matrix, double[] weights) { for (int i = 0; i < matrix.RowCount; i++) @@ -50,20 +45,24 @@ private Matrix WeightedMatrix(Matrix matrix, double[] weights) matrix[i, j] *= weights[j]; } } + return matrix; } - private MathNet.Numerics.LinearAlgebra.Vector IdealValues(Matrix matrix, bool pis) + + private Vector IdealValues(Matrix matrix, bool pis) { - return MathNet.Numerics.LinearAlgebra.Vector.Build + return Vector.Build .Dense(matrix.ColumnCount, i => { var columnValues = matrix.Column(i).ToArray(); return pis ? columnValues.Max() : columnValues.Min(); }); } - private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance(Matrix matrix, MathNet.Numerics.LinearAlgebra.Vector ideal) + + private Vector CalculateEuclideanDistance(Matrix matrix, + Vector ideal) { - return MathNet.Numerics.LinearAlgebra.Vector.Build + return Vector.Build .DenseOfArray(matrix .EnumerateRows() .Select(row => row @@ -73,9 +72,9 @@ private MathNet.Numerics.LinearAlgebra.Vector CalculateEuclideanDistance .Sum()) .ToArray()); } - private MathNet.Numerics.LinearAlgebra.Vector CalculateTopsisScores(MathNet.Numerics.LinearAlgebra.Vector distanceToBest, MathNet.Numerics.LinearAlgebra.Vector distanceToWorst) + + private Vector CalculateTopsisScores(Vector distanceToBest, Vector distanceToWorst) { - return distanceToWorst - .PointwiseDivide(distanceToBest.Add(distanceToWorst)); + return distanceToWorst.PointwiseDivide(distanceToBest.Add(distanceToWorst)); } -} +} \ No newline at end of file diff --git a/McdaToolkit/McdaToolkit.csproj b/McdaToolkit/McdaToolkit.csproj index 990ee77..5047265 100644 --- a/McdaToolkit/McdaToolkit.csproj +++ b/McdaToolkit/McdaToolkit.csproj @@ -1,12 +1,19 @@ - net8.0 enable enable + + McdaToolkit 1.0.1 + Jakub Tokarczyk + latest + netstandard2.1;net6.0;net7.0;net8.0 + © 2024 Jakub Tokarczyk + MIT + https://github.com/SarcasticMoose/mcda-toolkit - + diff --git a/McdaToolkit/Normalization/DataNormalizationService.cs b/McdaToolkit/Normalization/DataNormalizationService.cs index ad04b3e..82e299d 100644 --- a/McdaToolkit/Normalization/DataNormalizationService.cs +++ b/McdaToolkit/Normalization/DataNormalizationService.cs @@ -13,7 +13,7 @@ public class DataNormalizationService(NormalizationMethodEnum methodEnum) : IDat { private readonly INormalizationMethod _method = NormalizationFactory.CreateNormalizationMethod(methodEnum); - public Matrix NormalizeMatrix(Matrix? matrix, int[] criteriaTypes) + public Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes) { var normalizedMatrix = Matrix.Build.Dense(matrix.RowCount, matrix.ColumnCount); diff --git a/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs b/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs index 5431713..ef571b4 100644 --- a/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs +++ b/McdaToolkit/Normalization/Interfaces/IDataNormalization.cs @@ -4,5 +4,5 @@ namespace McdaToolkit.Normalization.Interfaces; public interface IDataNormalization { - Matrix NormalizeMatrix(Matrix? matrix, int[] criteriaTypes); + Matrix NormalizeMatrix(Matrix matrix, int[] criteriaTypes); } \ No newline at end of file diff --git a/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs index b00a9f4..99107e8 100644 --- a/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs +++ b/McdaToolkit/NormalizationMethods/MinMaxNormalization.cs @@ -1,19 +1,18 @@ -using System.Numerics; using McdaToolkit.NormalizationMethods.Interfaces; +using MathNet.Numerics.LinearAlgebra; namespace McdaToolkit.NormalizationMethods; public class MinMaxNormalization : INormalizationMethod { - public MathNet.Numerics.LinearAlgebra.Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) + public Vector Normalize(MathNet.Numerics.LinearAlgebra.Vector data, bool cost = false) { var max = data.Maximum(); var min = data.Minimum(); var difference = max - min; - if (Math.Abs(difference) < 1.11e-16) { - return MathNet.Numerics.LinearAlgebra.Vector.Build.Dense(data.Count, (i) => 1); + return Vector.Build.Dense(data.Count, (i) => 1); } if (cost) From a9cdc05d72d01901eb0be13aa1772187fabfa083 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk Date: Wed, 5 Jun 2024 15:18:55 +0200 Subject: [PATCH 20/21] fix: fix project --- McdaMethods.sln | 6 ------ 1 file changed, 6 deletions(-) diff --git a/McdaMethods.sln b/McdaMethods.sln index e6dba29..7f4097e 100644 --- a/McdaMethods.sln +++ b/McdaMethods.sln @@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit", "McdaToolkit\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McdaToolkit.UnitTests", "McdaToolkit.UnitTests\McdaToolkit.UnitTests.csproj", "{675DE565-59A0-4865-A306-B12FCC64EF1F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestUddsadsada", "TestUddsadsada\TestUddsadsada.csproj", "{C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,10 +21,6 @@ Global {675DE565-59A0-4865-A306-B12FCC64EF1F}.Debug|Any CPU.Build.0 = Debug|Any CPU {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.ActiveCfg = Release|Any CPU {675DE565-59A0-4865-A306-B12FCC64EF1F}.Release|Any CPU.Build.0 = Release|Any CPU - {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7D4020C-DC44-47E3-BB9C-2D4CCFA88A82}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From d3b31173472fdec539d4a12c0f1196eb38ed6cd9 Mon Sep 17 00:00:00 2001 From: Jakub Tokarczyk <101338588+SarcasticMoose@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:27:40 +0200 Subject: [PATCH 21/21] Update release-and-publish.yml --- .github/workflows/release-and-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml index f256682..8e6bf3b 100644 --- a/.github/workflows/release-and-publish.yml +++ b/.github/workflows/release-and-publish.yml @@ -33,6 +33,7 @@ jobs: net-version: ['8.x'] fail-fast: false steps: + - uses: actions/checkout@v4 - name: Test run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.net-version }}" - name: Upload dotnet test results