From 4cb180f6e4e165d7572900dd7b2c814786302aba Mon Sep 17 00:00:00 2001 From: "R. Kaleta" Date: Wed, 1 Oct 2025 19:25:11 +0200 Subject: [PATCH 1/4] Remove ANT support --- .gitattributes | 1 - .github/workflows/build-and-test.yml | 25 +----- gradle.Jenkinsfile => Jenkinsfile | 0 ant.Jenkinsfile | 115 ------------------------- build.xml | 120 --------------------------- ci/install_ant_junit5.sh | 17 ---- ivy.xml | 11 --- 7 files changed, 1 insertion(+), 288 deletions(-) rename gradle.Jenkinsfile => Jenkinsfile (100%) delete mode 100644 ant.Jenkinsfile delete mode 100644 build.xml delete mode 100755 ci/install_ant_junit5.sh delete mode 100644 ivy.xml diff --git a/.gitattributes b/.gitattributes index 097f9f9..afd59d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,4 +6,3 @@ # These are Windows script files and should use crlf *.bat text eol=crlf - diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index cb7db67..4f90742 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -5,7 +5,7 @@ on: - pull_request jobs: - gradle-build-and-test: + build-and-test: runs-on: ubuntu-latest steps: @@ -23,26 +23,3 @@ jobs: - name: Test run: $GITHUB_WORKSPACE/gradlew test - - ant-build-and-test: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-java@v4 - with: - java-version: 17 - distribution: temurin - - - name: Install JUnit5 for ANT - run: $GITHUB_WORKSPACE/ci/install_ant_junit5.sh - - - name: Download Dependencies - run: ant resolve - - - name: Build - run: ant build - - - name: Test - run: ant test diff --git a/gradle.Jenkinsfile b/Jenkinsfile similarity index 100% rename from gradle.Jenkinsfile rename to Jenkinsfile diff --git a/ant.Jenkinsfile b/ant.Jenkinsfile deleted file mode 100644 index 919a84f..0000000 --- a/ant.Jenkinsfile +++ /dev/null @@ -1,115 +0,0 @@ -pipeline { - agent { - label "local" - } - - parameters { - booleanParam( - name: "archive", - description: "Should artifacts be archived?", - defaultValue: false - ) - booleanParam( - name: "javadoc", - description: "Should generate Javadoc?", - defaultValue: false - ) - } - - environment { - JDK_NAME = "Open JDK" - ANT_NAME = "Ant" - ANT_OUTPUT_DIR = "antBuild" - } - - options { - skipDefaultCheckout true - timeout(time: 20, unit: "MINUTES") - buildDiscarder logRotator(numToKeepStr: "10", artifactNumToKeepStr: "5") - timestamps() - } - - stages { - stage("Preparation") { - steps { - script { - def scmEnv = checkout scm - currentBuild.displayName = "${env.BUILD_NUMBER} ${scmEnv.GIT_COMMIT.take(8)}" - } - } - } - - stage("Build") { - steps { - echo "#INFO: Building project" - withAnt(installation: "${env.ANT_NAME}", jdk: "${env.JDK_NAME}") { - sh "ant resolve jar" - } - } - } - - stage("Unit tests") { - steps { - echo "#INFO: Running unit tests" - withAnt(installation: "${env.ANT_NAME}", jdk: "${env.JDK_NAME}") { - sh "ant test" - } - } - - post { - always { - junit( - testResults: "${env.ANT_OUTPUT_DIR}/junit/result/TEST-*.xml", - healthScaleFactor: 1.0, - skipPublishingChecks: true - ) - } - } - } - - stage("Archive artifacts") { - when { - beforeAgent true - expression { - params.archive - } - } - - steps { - archiveArtifacts(artifacts: "${env.ANT_OUTPUT_DIR}/dist/*.jar", onlyIfSuccessful: true) - } - } - - stage("Javadoc") { - when { - beforeAgent true - expression { - params.javadoc - } - } - - steps { - echo "#INFO: Publish Javadoc" - withAnt(installation: "${env.ANT_NAME}", jdk: "${env.JDK_NAME}") { - sh "ant docs" - } - } - - post { - always { - javadoc(javadocDir: "${env.ANT_OUTPUT_DIR}/docs", keepAll: false) - } - } - } - } - - post { - always { - chuckNorris() - } - - cleanup { - cleanWs() - } - } -} diff --git a/build.xml b/build.xml deleted file mode 100644 index b24fab0..0000000 --- a/build.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ci/install_ant_junit5.sh b/ci/install_ant_junit5.sh deleted file mode 100755 index c768be7..0000000 --- a/ci/install_ant_junit5.sh +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/sh - -set -e - -echo ">>> Check ant version" -ANT=$(ant -version | sed -r 's/.*version ([0-9.]+).*/\1/g') - -if [ -f ${HOME}/.ant/lib/ant-junitlauncher-${ANT}.jar ] -then - echo ">>> File ant-junitlauncher.jar found :)" -else - LINK="https://repo1.maven.org/maven2/org/apache/ant/ant-junitlauncher/${ANT}/ant-junitlauncher-${ANT}.jar" - - rm -f ${HOME}/.ant/lib/ant-junitlauncher-*.jar - echo ">>> Download ant-junitlauncher.jar for version ${ANT}" - wget $LINK -P "${HOME}/.ant/lib" -fi diff --git a/ivy.xml b/ivy.xml deleted file mode 100644 index 188ca18..0000000 --- a/ivy.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - From 315a98db2a83877240464347bec765c77a00bca9 Mon Sep 17 00:00:00 2001 From: "R. Kaleta" Date: Wed, 1 Oct 2025 19:25:19 +0200 Subject: [PATCH 2/4] Add module-info.java --- src/main/java/module-info.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/module-info.java diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..f7de8a6 --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,15 @@ +module algolib { + exports algolib.geometry; + exports algolib.geometry.dim2; + exports algolib.geometry.dim3; + exports algolib.graphs; + exports algolib.graphs.algorithms; + exports algolib.graphs.algorithms.strategy; + exports algolib.graphs.properties; + exports algolib.maths; + exports algolib.sequences; + exports algolib.structures; + exports algolib.structures.heaps; + exports algolib.text; + exports algolib.tuples; +} From 5401eeabbbf97139383424a249f3b2f97a07a10d Mon Sep 17 00:00:00 2001 From: "R. Kaleta" Date: Sun, 2 Nov 2025 00:42:15 +0100 Subject: [PATCH 3/4] Change package names --- Jenkinsfile | 4 - build.gradle | 3 +- settings.gradle | 2 +- .../algolib/geometry/GeometryObject.java | 2 +- .../algolib/geometry/dim2/ClosestPoints.java | 29 ++-- .../algolib/geometry/dim2/ConvexHull.java | 2 +- .../algolib/geometry/dim2/Geometry2D.java | 2 +- .../algolib/geometry/dim2/Point2D.java | 7 +- .../algolib/geometry/dim2/Vector2D.java | 7 +- .../algolib/geometry/dim3/Geometry3D.java | 2 +- .../algolib/geometry/dim3/Point3D.java | 7 +- .../algolib/geometry/dim3/Vector3D.java | 9 +- .../algolib/graphs/DirectedGraph.java | 2 +- .../algolib/graphs/DirectedSimpleGraph.java | 2 +- .../refhumbold}/algolib/graphs/Edge.java | 2 +- .../refhumbold}/algolib/graphs/Graph.java | 2 +- .../graphs/GraphPartitionException.java | 2 +- .../algolib/graphs/GraphRepresentation.java | 2 +- .../algolib/graphs/MultipartiteGraph.java | 2 +- .../algolib/graphs/SimpleGraph.java | 2 +- .../refhumbold}/algolib/graphs/TreeGraph.java | 2 +- .../algolib/graphs/UndirectedGraph.java | 2 +- .../algolib/graphs/UndirectedSimpleGraph.java | 2 +- .../refhumbold}/algolib/graphs/Vertex.java | 2 +- .../algolib/graphs/algorithms/Cutting.java | 11 +- .../DirectedCyclicGraphException.java | 2 +- .../algorithms/LowestCommonAncestor.java | 17 +- .../algolib/graphs/algorithms/Matching.java | 15 +- .../algorithms/MinimalSpanningTree.java | 24 ++- .../algolib/graphs/algorithms/Searching.java | 17 +- .../graphs/algorithms/ShortestPaths.java | 45 +++--- .../StronglyConnectedComponents.java | 9 +- .../graphs/algorithms/TopologicalSorting.java | 9 +- .../graphs/algorithms/TreeDiameter.java | 12 +- .../algorithms/strategy/BfsStrategy.java | 4 +- .../algorithms/strategy/DfsStrategy.java | 4 +- .../algorithms/strategy/EmptyStrategy.java | 4 +- .../algolib/graphs/properties/Weighted.java | 2 +- .../refhumbold}/algolib/maths/Equation.java | 2 +- .../algolib/maths/EquationSystem.java | 2 +- .../refhumbold}/algolib/maths/Fraction.java | 2 +- .../maths/InfiniteSolutionsException.java | 2 +- .../refhumbold}/algolib/maths/Integers.java | 2 +- .../algolib/maths/NoSolutionException.java | 2 +- .../algolib/maths/PrimesSearching.java | 2 +- .../algolib/maths/PrimesTesting.java | 2 +- .../sequences/LongestCommonSubsequence.java | 2 +- .../LongestIncreasingSubsequence.java | 2 +- .../algolib/sequences/MaximumSubarray.java | 11 +- .../algolib/sequences/Sorting.java | 2 +- .../algolib/structures/AvlTree.java | 2 +- .../algolib/structures/DisjointSets.java | 2 +- .../structures/heaps/AbstractHeap.java | 2 +- .../algolib/structures/heaps/DoubleHeap.java | 2 +- .../algolib/structures/heaps/LeftistHeap.java | 2 +- .../algolib/structures/heaps/PairingHeap.java | 2 +- .../algolib/text/BaseWordsMap.java | 19 +-- .../algolib/text/EditDistance.java | 2 +- .../algolib/text/KnuthMorrisPratt.java | 2 +- .../refhumbold}/algolib/text/SuffixArray.java | 2 +- .../github/refhumbold}/algolib/text/Trie.java | 2 +- .../algolib/tuples/ComparablePair.java | 2 +- .../algolib/tuples/ComparableTriple.java | 2 +- .../refhumbold}/algolib/tuples/Pair.java | 2 +- .../refhumbold}/algolib/tuples/Triple.java | 2 +- src/main/java/module-info.java | 26 +-- .../geometry/dim2/ClosestPointsTest.java | 5 +- .../algolib/geometry/dim2/ConvexHullTest.java | 6 +- .../algolib/geometry/dim2/Geometry2DTest.java | 37 ++--- .../algolib/geometry/dim2/Vector2DTest.java | 5 +- .../algolib/geometry/dim3/Geometry3DTest.java | 38 ++--- .../algolib/geometry/dim3/Vector3DTest.java | 11 +- .../graphs/DirectedSimpleGraphTest.java | 64 ++++---- .../algolib/graphs/MultipartiteGraphTest.java | 20 +-- .../algolib/graphs/TreeGraphTest.java | 20 +-- .../graphs/UndirectedSimpleGraphTest.java | 51 +++--- .../graphs/algorithms/CuttingTest.java | 11 +- .../algorithms/LowestCommonAncestorTest.java | 7 +- .../graphs/algorithms/MatchingTest.java | 9 +- .../algorithms/MinimalSpanningTreeTest.java | 13 +- .../graphs/algorithms/SearchingTest.java | 59 +++---- .../graphs/algorithms/ShortestPathsTest.java | 153 +++++++++--------- .../StronglyConnectedComponentsTest.java | 14 +- .../algorithms/TopologicalSortingTest.java | 25 ++- .../graphs/algorithms/TreeDiameterTest.java | 7 +- .../algolib/maths/EquationSystemTest.java | 42 +++-- .../algolib/maths/EquationTest.java | 12 +- .../algolib/maths/FractionTest.java | 2 +- .../algolib/maths/IntegersTest.java | 2 +- .../algolib/maths/PrimesSearchingTest.java | 21 +-- .../algolib/maths/PrimesTestingTest.java | 2 +- .../LongestCommonSubsequenceTest.java | 6 +- .../LongestIncreasingSubsequenceTest.java | 10 +- .../sequences/MaximumSubarrayTest.java | 2 +- .../algolib/sequences/SortingTest.java | 2 +- .../algolib/structures/AvlTreeTest.java | 2 +- .../algolib/structures/DisjointSetsTest.java | 4 +- .../structures/heaps/DoubleHeapTest.java | 2 +- .../structures/heaps/LeftistHeapTest.java | 2 +- .../structures/heaps/PairingHeapTest.java | 2 +- .../algolib/text/BaseWordsMapTest.java | 5 +- .../algolib/text/EditDistanceTest.java | 2 +- .../algolib/text/KnuthMorrisPrattTest.java | 2 +- .../algolib/text/SuffixArrayTest.java | 2 +- .../refhumbold}/algolib/text/TrieTest.java | 2 +- .../algolib/tuples/ComparablePairTest.java | 2 +- .../algolib/tuples/ComparableTripleTest.java | 2 +- 107 files changed, 501 insertions(+), 565 deletions(-) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/GeometryObject.java (86%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim2/ClosestPoints.java (82%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim2/ConvexHull.java (96%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim2/Geometry2D.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim2/Point2D.java (88%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim2/Vector2D.java (92%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim3/Geometry3D.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim3/Point3D.java (87%) rename src/main/java/{ => com/github/refhumbold}/algolib/geometry/dim3/Vector3D.java (92%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/DirectedGraph.java (90%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/DirectedSimpleGraph.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/Edge.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/Graph.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/GraphPartitionException.java (84%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/GraphRepresentation.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/MultipartiteGraph.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/SimpleGraph.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/TreeGraph.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/UndirectedGraph.java (89%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/UndirectedSimpleGraph.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/Vertex.java (92%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/Cutting.java (93%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/DirectedCyclicGraphException.java (82%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/LowestCommonAncestor.java (87%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/Matching.java (92%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/MinimalSpanningTree.java (85%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/Searching.java (92%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/ShortestPaths.java (78%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/StronglyConnectedComponents.java (93%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/TopologicalSorting.java (94%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/TreeDiameter.java (84%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/strategy/BfsStrategy.java (67%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/strategy/DfsStrategy.java (57%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/strategy/EmptyStrategy.java (81%) rename src/main/java/{ => com/github/refhumbold}/algolib/graphs/properties/Weighted.java (64%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/Equation.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/EquationSystem.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/Fraction.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/InfiniteSolutionsException.java (84%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/Integers.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/NoSolutionException.java (83%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/PrimesSearching.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/maths/PrimesTesting.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/sequences/LongestCommonSubsequence.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/sequences/LongestIncreasingSubsequence.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/sequences/MaximumSubarray.java (88%) rename src/main/java/{ => com/github/refhumbold}/algolib/sequences/Sorting.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/AvlTree.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/DisjointSets.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/heaps/AbstractHeap.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/heaps/DoubleHeap.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/heaps/LeftistHeap.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/structures/heaps/PairingHeap.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/text/BaseWordsMap.java (85%) rename src/main/java/{ => com/github/refhumbold}/algolib/text/EditDistance.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/text/KnuthMorrisPratt.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/text/SuffixArray.java (99%) rename src/main/java/{ => com/github/refhumbold}/algolib/text/Trie.java (98%) rename src/main/java/{ => com/github/refhumbold}/algolib/tuples/ComparablePair.java (96%) rename src/main/java/{ => com/github/refhumbold}/algolib/tuples/ComparableTriple.java (97%) rename src/main/java/{ => com/github/refhumbold}/algolib/tuples/Pair.java (95%) rename src/main/java/{ => com/github/refhumbold}/algolib/tuples/Triple.java (95%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim2/ClosestPointsTest.java (96%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim2/ConvexHullTest.java (92%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim2/Geometry2DTest.java (70%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim2/Vector2DTest.java (96%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim3/Geometry3DTest.java (70%) rename src/test/java/{ => com/github/refhumbold}/algolib/geometry/dim3/Vector3DTest.java (94%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/DirectedSimpleGraphTest.java (86%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/MultipartiteGraphTest.java (91%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/TreeGraphTest.java (88%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/UndirectedSimpleGraphTest.java (87%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/CuttingTest.java (95%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/LowestCommonAncestorTest.java (95%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/MatchingTest.java (91%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/MinimalSpanningTreeTest.java (92%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/SearchingTest.java (80%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/ShortestPathsTest.java (65%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java (89%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/TopologicalSortingTest.java (86%) rename src/test/java/{ => com/github/refhumbold}/algolib/graphs/algorithms/TreeDiameterTest.java (93%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/EquationSystemTest.java (65%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/EquationTest.java (91%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/FractionTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/IntegersTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/PrimesSearchingTest.java (70%) rename src/test/java/{ => com/github/refhumbold}/algolib/maths/PrimesTestingTest.java (98%) rename src/test/java/{ => com/github/refhumbold}/algolib/sequences/LongestCommonSubsequenceTest.java (91%) rename src/test/java/{ => com/github/refhumbold}/algolib/sequences/LongestIncreasingSubsequenceTest.java (87%) rename src/test/java/{ => com/github/refhumbold}/algolib/sequences/MaximumSubarrayTest.java (98%) rename src/test/java/{ => com/github/refhumbold}/algolib/sequences/SortingTest.java (97%) rename src/test/java/{ => com/github/refhumbold}/algolib/structures/AvlTreeTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/structures/DisjointSetsTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/structures/heaps/DoubleHeapTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/structures/heaps/LeftistHeapTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/structures/heaps/PairingHeapTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/text/BaseWordsMapTest.java (97%) rename src/test/java/{ => com/github/refhumbold}/algolib/text/EditDistanceTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/text/KnuthMorrisPrattTest.java (98%) rename src/test/java/{ => com/github/refhumbold}/algolib/text/SuffixArrayTest.java (98%) rename src/test/java/{ => com/github/refhumbold}/algolib/text/TrieTest.java (99%) rename src/test/java/{ => com/github/refhumbold}/algolib/tuples/ComparablePairTest.java (98%) rename src/test/java/{ => com/github/refhumbold}/algolib/tuples/ComparableTripleTest.java (98%) diff --git a/Jenkinsfile b/Jenkinsfile index 3441c09..e5f790c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -102,10 +102,6 @@ pipeline { } post { - always { - chuckNorris() - } - cleanup { cleanWs() } diff --git a/build.gradle b/build.gradle index d4f8bd0..672c442 100644 --- a/build.gradle +++ b/build.gradle @@ -9,11 +9,10 @@ ext { specVersion = "${majorVersion}.${minorVersion}" jarVersion = "${majorVersion}.${minorVersion}.${dateVersion}" vendor = 'Rafał Kaleta' - mainPackage = 'algolib' + mainPackage = 'com.github.refhumbold.algolib' } version = project.jarVersion -archivesBaseName = project.mainPackage repositories { mavenCentral() diff --git a/settings.gradle b/settings.gradle index e9994f2..d3a994b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -rootProject.name = 'AlgoLib_Java' +rootProject.name = 'AlgoLib' diff --git a/src/main/java/algolib/geometry/GeometryObject.java b/src/main/java/com/github/refhumbold/algolib/geometry/GeometryObject.java similarity index 86% rename from src/main/java/algolib/geometry/GeometryObject.java rename to src/main/java/com/github/refhumbold/algolib/geometry/GeometryObject.java index eec97db..244cb5e 100644 --- a/src/main/java/algolib/geometry/GeometryObject.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/GeometryObject.java @@ -1,4 +1,4 @@ -package algolib.geometry; +package com.github.refhumbold.algolib.geometry; public abstract class GeometryObject { diff --git a/src/main/java/algolib/geometry/dim2/ClosestPoints.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPoints.java similarity index 82% rename from src/main/java/algolib/geometry/dim2/ClosestPoints.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPoints.java index 738638e..d2aed65 100644 --- a/src/main/java/algolib/geometry/dim2/ClosestPoints.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPoints.java @@ -1,12 +1,11 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; - -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.tuples.Pair; /** Algorithm for searching pair of closest points in 2D. */ public final class ClosestPoints @@ -35,8 +34,9 @@ public static Pair findClosestPoints(List points) } // Searches for closest points among three of them. - private static Pair searchThree( - Point2D point1, Point2D point2, Point2D point3) + private static Pair searchThree(Point2D point1, + Point2D point2, + Point2D point3) { double distance12 = Geometry2D.distance(point1, point2); double distance23 = Geometry2D.distance(point2, point3); @@ -53,8 +53,9 @@ private static Pair searchThree( // Searches for closest points inside a belt of given width. // The resulting distance should not be less than belt width. - private static Optional> checkBelt( - List pointsY, double middleX, double beltWidth) + private static Optional> checkBelt(List pointsY, + double middleX, + double beltWidth) { Optional> closestPoints = Optional.empty(); List beltPoints = new ArrayList<>(); @@ -90,15 +91,17 @@ private static Optional> checkBelt( // Searches for closest points in given sublist of points. // Points are given sorted by X coordinate and by Y coordinate. - private static Pair searchClosest( - List pointsX, List pointsY, int indexBegin, int indexEnd) + private static Pair searchClosest(List pointsX, + List pointsY, + int indexBegin, + int indexEnd) { if(indexEnd - indexBegin <= 2) return Pair.of(pointsX.get(indexBegin), pointsX.get(indexEnd - 1)); if(indexEnd - indexBegin == 3) return searchThree(pointsX.get(indexBegin), pointsX.get(indexBegin + 1), - pointsX.get(indexBegin + 2)); + pointsX.get(indexBegin + 2)); int indexMiddle = (indexBegin + indexEnd) / 2; List closetsYL = new ArrayList<>(); @@ -106,7 +109,7 @@ private static Pair searchClosest( for(Point2D pt : pointsY) if(pt.x < pointsX.get(indexMiddle).x - || pt.x == pointsX.get(indexMiddle).x && pt.y < pointsX.get(indexMiddle).y) + || pt.x == pointsX.get(indexMiddle).x && pt.y < pointsX.get(indexMiddle).y) closetsYL.add(pt); else closetsYR.add(pt); @@ -118,9 +121,7 @@ private static Pair searchClosest( Geometry2D.distance(closestL.first, closestL.second) <= Geometry2D.distance( closestR.first, closestR.second) ? closestL : closestR; Optional> beltPoints = checkBelt(pointsY, pointsX.get(indexMiddle).x, - Geometry2D.distance( - closestPoints.first, - closestPoints.second)); + Geometry2D.distance(closestPoints.first, closestPoints.second)); return beltPoints.orElse(closestPoints); } diff --git a/src/main/java/algolib/geometry/dim2/ConvexHull.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHull.java similarity index 96% rename from src/main/java/algolib/geometry/dim2/ConvexHull.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHull.java index 8b44a49..1f10c1e 100644 --- a/src/main/java/algolib/geometry/dim2/ConvexHull.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHull.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/main/java/algolib/geometry/dim2/Geometry2D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2D.java similarity index 97% rename from src/main/java/algolib/geometry/dim2/Geometry2D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2D.java index 520eeb8..ead515e 100644 --- a/src/main/java/algolib/geometry/dim2/Geometry2D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2D.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.List; diff --git a/src/main/java/algolib/geometry/dim2/Point2D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Point2D.java similarity index 88% rename from src/main/java/algolib/geometry/dim2/Point2D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim2/Point2D.java index 62c53da..7791f89 100644 --- a/src/main/java/algolib/geometry/dim2/Point2D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Point2D.java @@ -1,8 +1,7 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.Objects; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; /** Structure of point in 2D. */ public final class Point2D @@ -21,7 +20,7 @@ private Point2D(double x, double y) @Override public double[] getCoordinates() { - return new double[]{x, y}; + return new double[]{ x, y }; } public static Point2D of(double x, double y) diff --git a/src/main/java/algolib/geometry/dim2/Vector2D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Vector2D.java similarity index 92% rename from src/main/java/algolib/geometry/dim2/Vector2D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim2/Vector2D.java index 4ebac4d..af4be8d 100644 --- a/src/main/java/algolib/geometry/dim2/Vector2D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim2/Vector2D.java @@ -1,8 +1,7 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.Objects; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; /** Structure of vector in 2D. */ public final class Vector2D @@ -21,7 +20,7 @@ private Vector2D(double x, double y) @Override public double[] getCoordinates() { - return new double[]{x, y}; + return new double[]{ x, y }; } public static Vector2D of(double x, double y) diff --git a/src/main/java/algolib/geometry/dim3/Geometry3D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3D.java similarity index 97% rename from src/main/java/algolib/geometry/dim3/Geometry3D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3D.java index 60bfccf..9992e9a 100644 --- a/src/main/java/algolib/geometry/dim3/Geometry3D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3D.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim3; +package com.github.refhumbold.algolib.geometry.dim3; import java.util.List; diff --git a/src/main/java/algolib/geometry/dim3/Point3D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Point3D.java similarity index 87% rename from src/main/java/algolib/geometry/dim3/Point3D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim3/Point3D.java index 93eb981..13f7950 100644 --- a/src/main/java/algolib/geometry/dim3/Point3D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Point3D.java @@ -1,8 +1,7 @@ -package algolib.geometry.dim3; +package com.github.refhumbold.algolib.geometry.dim3; import java.util.Objects; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; /** Structure of point in 3D. */ public final class Point3D @@ -23,7 +22,7 @@ private Point3D(double x, double y, double z) @Override public double[] getCoordinates() { - return new double[]{x, y, z}; + return new double[]{ x, y, z }; } public static Point3D of(double x, double y, double z) diff --git a/src/main/java/algolib/geometry/dim3/Vector3D.java b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Vector3D.java similarity index 92% rename from src/main/java/algolib/geometry/dim3/Vector3D.java rename to src/main/java/com/github/refhumbold/algolib/geometry/dim3/Vector3D.java index 720d69b..c60a69d 100644 --- a/src/main/java/algolib/geometry/dim3/Vector3D.java +++ b/src/main/java/com/github/refhumbold/algolib/geometry/dim3/Vector3D.java @@ -1,8 +1,7 @@ -package algolib.geometry.dim3; +package com.github.refhumbold.algolib.geometry.dim3; import java.util.Objects; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; /** Structure of vector in 3D. */ public final class Vector3D @@ -23,7 +22,7 @@ private Vector3D(double x, double y, double z) @Override public double[] getCoordinates() { - return new double[]{x, y, z}; + return new double[]{ x, y, z }; } public static Vector3D of(double x, double y, double z) @@ -44,7 +43,7 @@ public static double dot(Vector3D v1, Vector3D v2) public static Vector3D cross(Vector3D v1, Vector3D v2) { return Vector3D.of(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, - v1.x * v2.y - v1.y * v2.x); + v1.x * v2.y - v1.y * v2.x); } public static double area(Vector3D v1, Vector3D v2) diff --git a/src/main/java/algolib/graphs/DirectedGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/DirectedGraph.java similarity index 90% rename from src/main/java/algolib/graphs/DirectedGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/DirectedGraph.java index 337a267..6a98396 100644 --- a/src/main/java/algolib/graphs/DirectedGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/DirectedGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; /** Structure of directed graph. */ public interface DirectedGraph diff --git a/src/main/java/algolib/graphs/DirectedSimpleGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraph.java similarity index 98% rename from src/main/java/algolib/graphs/DirectedSimpleGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraph.java index b1ee025..d38fc66 100644 --- a/src/main/java/algolib/graphs/DirectedSimpleGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.Set; diff --git a/src/main/java/algolib/graphs/Edge.java b/src/main/java/com/github/refhumbold/algolib/graphs/Edge.java similarity index 97% rename from src/main/java/algolib/graphs/Edge.java rename to src/main/java/com/github/refhumbold/algolib/graphs/Edge.java index c4643dc..7e05a5d 100644 --- a/src/main/java/algolib/graphs/Edge.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/Edge.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Objects; diff --git a/src/main/java/algolib/graphs/Graph.java b/src/main/java/com/github/refhumbold/algolib/graphs/Graph.java similarity index 98% rename from src/main/java/algolib/graphs/Graph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/Graph.java index a3a47f2..833d0d1 100644 --- a/src/main/java/algolib/graphs/Graph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/Graph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; diff --git a/src/main/java/algolib/graphs/GraphPartitionException.java b/src/main/java/com/github/refhumbold/algolib/graphs/GraphPartitionException.java similarity index 84% rename from src/main/java/algolib/graphs/GraphPartitionException.java rename to src/main/java/com/github/refhumbold/algolib/graphs/GraphPartitionException.java index 39e9dfc..2830889 100644 --- a/src/main/java/algolib/graphs/GraphPartitionException.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/GraphPartitionException.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.io.Serial; diff --git a/src/main/java/algolib/graphs/GraphRepresentation.java b/src/main/java/com/github/refhumbold/algolib/graphs/GraphRepresentation.java similarity index 98% rename from src/main/java/algolib/graphs/GraphRepresentation.java rename to src/main/java/com/github/refhumbold/algolib/graphs/GraphRepresentation.java index 4957a0b..42fda70 100644 --- a/src/main/java/algolib/graphs/GraphRepresentation.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/GraphRepresentation.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/algolib/graphs/MultipartiteGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/MultipartiteGraph.java similarity index 99% rename from src/main/java/algolib/graphs/MultipartiteGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/MultipartiteGraph.java index 43efd35..efc4281 100644 --- a/src/main/java/algolib/graphs/MultipartiteGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/MultipartiteGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/algolib/graphs/SimpleGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/SimpleGraph.java similarity index 99% rename from src/main/java/algolib/graphs/SimpleGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/SimpleGraph.java index 0531287..373c366 100644 --- a/src/main/java/algolib/graphs/SimpleGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/SimpleGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.stream.Collectors; diff --git a/src/main/java/algolib/graphs/TreeGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/TreeGraph.java similarity index 98% rename from src/main/java/algolib/graphs/TreeGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/TreeGraph.java index af41909..67c7de9 100644 --- a/src/main/java/algolib/graphs/TreeGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/TreeGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/algolib/graphs/UndirectedGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/UndirectedGraph.java similarity index 89% rename from src/main/java/algolib/graphs/UndirectedGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/UndirectedGraph.java index b506e40..3cb9404 100644 --- a/src/main/java/algolib/graphs/UndirectedGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/UndirectedGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; /** Structure of undirected graph. */ public interface UndirectedGraph diff --git a/src/main/java/algolib/graphs/UndirectedSimpleGraph.java b/src/main/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraph.java similarity index 98% rename from src/main/java/algolib/graphs/UndirectedSimpleGraph.java rename to src/main/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraph.java index fc85e0e..f566397 100644 --- a/src/main/java/algolib/graphs/UndirectedSimpleGraph.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraph.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.stream.Collectors; diff --git a/src/main/java/algolib/graphs/Vertex.java b/src/main/java/com/github/refhumbold/algolib/graphs/Vertex.java similarity index 92% rename from src/main/java/algolib/graphs/Vertex.java rename to src/main/java/com/github/refhumbold/algolib/graphs/Vertex.java index a791295..5285b13 100644 --- a/src/main/java/algolib/graphs/Vertex.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/Vertex.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Objects; diff --git a/src/main/java/algolib/graphs/algorithms/Cutting.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Cutting.java similarity index 93% rename from src/main/java/algolib/graphs/algorithms/Cutting.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Cutting.java index 6ad6c16..8c3f401 100644 --- a/src/main/java/algolib/graphs/algorithms/Cutting.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Cutting.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.ArrayList; import java.util.Collection; @@ -6,11 +6,10 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; - -import algolib.graphs.Edge; -import algolib.graphs.UndirectedGraph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.Edge; +import com.github.refhumbold.algolib.graphs.UndirectedGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; /** Algorithms for graph cutting (edge cut and vertex cut). */ public final class Cutting diff --git a/src/main/java/algolib/graphs/algorithms/DirectedCyclicGraphException.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/DirectedCyclicGraphException.java similarity index 82% rename from src/main/java/algolib/graphs/algorithms/DirectedCyclicGraphException.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/DirectedCyclicGraphException.java index f567244..7e0e104 100644 --- a/src/main/java/algolib/graphs/algorithms/DirectedCyclicGraphException.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/DirectedCyclicGraphException.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.io.Serial; diff --git a/src/main/java/algolib/graphs/algorithms/LowestCommonAncestor.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestor.java similarity index 87% rename from src/main/java/algolib/graphs/algorithms/LowestCommonAncestor.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestor.java index 3aeba94..e8d951b 100644 --- a/src/main/java/algolib/graphs/algorithms/LowestCommonAncestor.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestor.java @@ -1,14 +1,13 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; - -import algolib.graphs.TreeGraph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.TreeGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; /** Algorithm for lowest common ancestors in a rooted tree. */ public final class LowestCommonAncestor @@ -19,8 +18,8 @@ public final class LowestCommonAncestor private final LcaStrategy strategy = new LcaStrategy<>(); private boolean empty = true; - public LowestCommonAncestor( - TreeGraph graph, Vertex root) + public LowestCommonAncestor(TreeGraph graph, + Vertex root) { this.graph = graph; this.root = root; @@ -54,7 +53,7 @@ private Vertex find(Vertex vertex1, Vertex vertex2 Vertex nextVertex = candidates.stream() .filter(candidate -> !isOffspring(vertex2, - candidate)) + candidate)) .findFirst() .orElse(paths.get(vertex1).get(0)); @@ -78,7 +77,7 @@ private void initialize() private boolean isOffspring(Vertex vertex1, Vertex vertex2) { return strategy.preTimes.get(vertex1) >= strategy.preTimes.get(vertex2) - && strategy.postTimes.get(vertex1) <= strategy.postTimes.get(vertex2); + && strategy.postTimes.get(vertex1) <= strategy.postTimes.get(vertex2); } private static class LcaStrategy diff --git a/src/main/java/algolib/graphs/algorithms/Matching.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Matching.java similarity index 92% rename from src/main/java/algolib/graphs/algorithms/Matching.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Matching.java index 86c47b6..e548203 100644 --- a/src/main/java/algolib/graphs/algorithms/Matching.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Matching.java @@ -1,11 +1,10 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; - -import algolib.graphs.MultipartiteGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.MultipartiteGraph; +import com.github.refhumbold.algolib.graphs.Vertex; /** Hopcroft-Karp algorithm for matching in a bipartite graph. */ public final class Matching @@ -15,8 +14,7 @@ public final class Matching * @param graph the bipartite graph * @return the map of matched vertices */ - public static Map, - Vertex> match( + public static Map, Vertex> match( MultipartiteGraph graph) { MatchAugmenter augmenter = @@ -93,8 +91,7 @@ private void bfs(Map, Double> distances) } } - private boolean dfs( - Vertex vertex, + private boolean dfs(Vertex vertex, Set> visited, Map, Double> distances) { @@ -112,7 +109,7 @@ private boolean dfs( } if(!visited.contains(matched) && distances.get(matched) == distances.get(vertex) + 1 - && dfs(matched, visited, distances)) + && dfs(matched, visited, distances)) { matching.put(vertex, neighbour); matching.put(neighbour, vertex); diff --git a/src/main/java/algolib/graphs/algorithms/MinimalSpanningTree.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTree.java similarity index 85% rename from src/main/java/algolib/graphs/algorithms/MinimalSpanningTree.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTree.java index dc8b27b..4d41e6d 100644 --- a/src/main/java/algolib/graphs/algorithms/MinimalSpanningTree.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTree.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.Comparator; import java.util.HashSet; @@ -6,14 +6,13 @@ import java.util.PriorityQueue; import java.util.Set; import java.util.stream.Collectors; - -import algolib.graphs.Edge; -import algolib.graphs.UndirectedGraph; -import algolib.graphs.UndirectedSimpleGraph; -import algolib.graphs.Vertex; -import algolib.graphs.properties.Weighted; -import algolib.structures.DisjointSets; -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.graphs.Edge; +import com.github.refhumbold.algolib.graphs.UndirectedGraph; +import com.github.refhumbold.algolib.graphs.UndirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.structures.DisjointSets; +import com.github.refhumbold.algolib.tuples.Pair; /** Algorithms for minimal spanning tree. */ public final class MinimalSpanningTree @@ -56,7 +55,8 @@ public static Undirect * @return the minimal spanning tree */ public static UndirectedGraph prim( - UndirectedGraph graph, Vertex source) + UndirectedGraph graph, + Vertex source) { UndirectedSimpleGraph mst = new UndirectedSimpleGraph<>( @@ -64,9 +64,7 @@ public static Undirect Set> visited = new HashSet<>(); PriorityQueue, Vertex>> queue = new PriorityQueue<>( (pair1, pair2) -> Double.compare(graph.getProperties().get(pair1.first).getWeight(), - graph.getProperties() - .get(pair2.first) - .getWeight())); + graph.getProperties().get(pair2.first).getWeight())); visited.add(source); diff --git a/src/main/java/algolib/graphs/algorithms/Searching.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Searching.java similarity index 92% rename from src/main/java/algolib/graphs/algorithms/Searching.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Searching.java index 35203bc..58fee6a 100644 --- a/src/main/java/algolib/graphs/algorithms/Searching.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/Searching.java @@ -1,11 +1,10 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.*; - -import algolib.graphs.Graph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.BfsStrategy; -import algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.Graph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.BfsStrategy; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; /** Algorithms for graph searching. */ public final class Searching @@ -17,8 +16,7 @@ public final class Searching * @param roots the starting vertices * @return the visited vertices */ - public static Collection> bfs( - Graph graph, + public static Collection> bfs(Graph graph, BfsStrategy strategy, Collection> roots) { @@ -131,8 +129,7 @@ public static Collection void dfsRecursiveStep( - Graph graph, + private static void dfsRecursiveStep(Graph graph, DfsStrategy strategy, DfsRecursiveState state) { diff --git a/src/main/java/algolib/graphs/algorithms/ShortestPaths.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPaths.java similarity index 78% rename from src/main/java/algolib/graphs/algorithms/ShortestPaths.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPaths.java index 18472e5..eb8a59a 100644 --- a/src/main/java/algolib/graphs/algorithms/ShortestPaths.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPaths.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.HashMap; import java.util.HashSet; @@ -7,13 +7,12 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; - -import algolib.graphs.DirectedGraph; -import algolib.graphs.Edge; -import algolib.graphs.Graph; -import algolib.graphs.Vertex; -import algolib.graphs.properties.Weighted; -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.graphs.DirectedGraph; +import com.github.refhumbold.algolib.graphs.Edge; +import com.github.refhumbold.algolib.graphs.Graph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.tuples.Pair; /** Algorithms for shortest paths in a weighted graph. */ public final class ShortestPaths @@ -26,16 +25,16 @@ public final class ShortestPaths * @return the map of distances to each vertex * @throws IllegalStateException if the graph contains a negative cycle */ - public static Map, - Double> bellmanFord( - DirectedGraph graph, Vertex source) + public static Map, Double> bellmanFord( + DirectedGraph graph, + Vertex source) throws IllegalStateException { Map, Double> distances = graph.getVertices() .stream() .collect( Collectors.toMap(Function.identity(), - v -> Weighted.INFINITY)); + v -> Weighted.INFINITY)); distances.put(source, 0.0); @@ -43,16 +42,13 @@ Double> bellmanFord( for(Vertex vertex : graph.getVertices()) for(Edge edge : graph.getAdjacentEdges(vertex)) distances.put(edge.destination, Math.min(distances.get(edge.destination), - distances.get(vertex) - + graph.getProperties() - .get(edge) - .getWeight())); + distances.get(vertex) + graph.getProperties().get(edge).getWeight())); for(Vertex vertex : graph.getVertices()) for(Edge edge : graph.getAdjacentEdges(vertex)) if(distances.get(vertex) < Weighted.INFINITY - && distances.get(vertex) + graph.getProperties().get(edge).getWeight() - < distances.get(edge.destination)) + && distances.get(vertex) + graph.getProperties().get(edge).getWeight() + < distances.get(edge.destination)) throw new IllegalStateException("Graph contains a negative cycle."); return distances; @@ -65,9 +61,9 @@ Double> bellmanFord( * @return the map of distances to each vertex. * @throws IllegalStateException if the graph contains an edge with negative weight */ - public static Map, - Double> dijkstra( - Graph graph, Vertex source) + public static Map, Double> dijkstra( + Graph graph, + Vertex source) throws IllegalStateException { for(Edge edge : graph.getEdges()) @@ -78,7 +74,7 @@ Double> dijkstra( .stream() .collect( Collectors.toMap(Function.identity(), - v -> Weighted.INFINITY)); + v -> Weighted.INFINITY)); Set> visited = new HashSet<>(); PriorityQueue>> vertexQueue = new PriorityQueue<>((pair1, pair2) -> Double.compare(pair1.first, pair2.first)); @@ -128,14 +124,13 @@ public static Map e : graph.getEdges()) distances.put(Pair.of(e.source, e.destination), - graph.getProperties().get(e).getWeight()); + graph.getProperties().get(e).getWeight()); for(Vertex w : graph.getVertices()) for(Vertex v : graph.getVertices()) for(Vertex u : graph.getVertices()) distances.put(Pair.of(v, u), Math.min(distances.get(Pair.of(v, u)), - distances.get(Pair.of(v, w)) - + distances.get(Pair.of(w, u)))); + distances.get(Pair.of(v, w)) + distances.get(Pair.of(w, u)))); return distances; } diff --git a/src/main/java/algolib/graphs/algorithms/StronglyConnectedComponents.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponents.java similarity index 93% rename from src/main/java/algolib/graphs/algorithms/StronglyConnectedComponents.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponents.java index 72e384a..ad04c61 100644 --- a/src/main/java/algolib/graphs/algorithms/StronglyConnectedComponents.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponents.java @@ -1,11 +1,10 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.*; import java.util.stream.Collectors; - -import algolib.graphs.DirectedGraph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.DirectedGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; /** Algorithm for strongly connected components. */ public final class StronglyConnectedComponents diff --git a/src/main/java/algolib/graphs/algorithms/TopologicalSorting.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSorting.java similarity index 94% rename from src/main/java/algolib/graphs/algorithms/TopologicalSorting.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSorting.java index 0de0442..3e96077 100644 --- a/src/main/java/algolib/graphs/algorithms/TopologicalSorting.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSorting.java @@ -1,10 +1,9 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.*; - -import algolib.graphs.DirectedGraph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.DirectedGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; /** Algorithms for topological sorting of a directed acyclic graph. */ public final class TopologicalSorting diff --git a/src/main/java/algolib/graphs/algorithms/TreeDiameter.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameter.java similarity index 84% rename from src/main/java/algolib/graphs/algorithms/TreeDiameter.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameter.java index 5c9c6b3..ae4161b 100644 --- a/src/main/java/algolib/graphs/algorithms/TreeDiameter.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameter.java @@ -1,10 +1,10 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; -import algolib.graphs.Edge; -import algolib.graphs.TreeGraph; -import algolib.graphs.Vertex; -import algolib.graphs.properties.Weighted; -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.graphs.Edge; +import com.github.refhumbold.algolib.graphs.TreeGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.tuples.Pair; /** Algorithm for computing diameter of a tree. */ public final class TreeDiameter diff --git a/src/main/java/algolib/graphs/algorithms/strategy/BfsStrategy.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/BfsStrategy.java similarity index 67% rename from src/main/java/algolib/graphs/algorithms/strategy/BfsStrategy.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/BfsStrategy.java index 1c3948a..016066a 100644 --- a/src/main/java/algolib/graphs/algorithms/strategy/BfsStrategy.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/BfsStrategy.java @@ -1,6 +1,6 @@ -package algolib.graphs.algorithms.strategy; +package com.github.refhumbold.algolib.graphs.algorithms.strategy; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.Vertex; public interface BfsStrategy { diff --git a/src/main/java/algolib/graphs/algorithms/strategy/DfsStrategy.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/DfsStrategy.java similarity index 57% rename from src/main/java/algolib/graphs/algorithms/strategy/DfsStrategy.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/DfsStrategy.java index 94d31bb..3163da4 100644 --- a/src/main/java/algolib/graphs/algorithms/strategy/DfsStrategy.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/DfsStrategy.java @@ -1,6 +1,6 @@ -package algolib.graphs.algorithms.strategy; +package com.github.refhumbold.algolib.graphs.algorithms.strategy; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.Vertex; public interface DfsStrategy extends BfsStrategy diff --git a/src/main/java/algolib/graphs/algorithms/strategy/EmptyStrategy.java b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/EmptyStrategy.java similarity index 81% rename from src/main/java/algolib/graphs/algorithms/strategy/EmptyStrategy.java rename to src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/EmptyStrategy.java index 9243334..f9279cd 100644 --- a/src/main/java/algolib/graphs/algorithms/strategy/EmptyStrategy.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/algorithms/strategy/EmptyStrategy.java @@ -1,6 +1,6 @@ -package algolib.graphs.algorithms.strategy; +package com.github.refhumbold.algolib.graphs.algorithms.strategy; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.Vertex; public class EmptyStrategy implements DfsStrategy diff --git a/src/main/java/algolib/graphs/properties/Weighted.java b/src/main/java/com/github/refhumbold/algolib/graphs/properties/Weighted.java similarity index 64% rename from src/main/java/algolib/graphs/properties/Weighted.java rename to src/main/java/com/github/refhumbold/algolib/graphs/properties/Weighted.java index 448f77a..896e771 100644 --- a/src/main/java/algolib/graphs/properties/Weighted.java +++ b/src/main/java/com/github/refhumbold/algolib/graphs/properties/Weighted.java @@ -1,4 +1,4 @@ -package algolib.graphs.properties; +package com.github.refhumbold.algolib.graphs.properties; public interface Weighted { diff --git a/src/main/java/algolib/maths/Equation.java b/src/main/java/com/github/refhumbold/algolib/maths/Equation.java similarity index 99% rename from src/main/java/algolib/maths/Equation.java rename to src/main/java/com/github/refhumbold/algolib/maths/Equation.java index 119f943..d41d0cf 100644 --- a/src/main/java/algolib/maths/Equation.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/Equation.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; diff --git a/src/main/java/algolib/maths/EquationSystem.java b/src/main/java/com/github/refhumbold/algolib/maths/EquationSystem.java similarity index 99% rename from src/main/java/algolib/maths/EquationSystem.java rename to src/main/java/com/github/refhumbold/algolib/maths/EquationSystem.java index 22e5ef9..e3fb052 100644 --- a/src/main/java/algolib/maths/EquationSystem.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/EquationSystem.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.util.Arrays; import java.util.stream.Collectors; diff --git a/src/main/java/algolib/maths/Fraction.java b/src/main/java/com/github/refhumbold/algolib/maths/Fraction.java similarity index 99% rename from src/main/java/algolib/maths/Fraction.java rename to src/main/java/com/github/refhumbold/algolib/maths/Fraction.java index 111b3c2..6979c6c 100644 --- a/src/main/java/algolib/maths/Fraction.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/Fraction.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.io.Serial; import java.util.Objects; diff --git a/src/main/java/algolib/maths/InfiniteSolutionsException.java b/src/main/java/com/github/refhumbold/algolib/maths/InfiniteSolutionsException.java similarity index 84% rename from src/main/java/algolib/maths/InfiniteSolutionsException.java rename to src/main/java/com/github/refhumbold/algolib/maths/InfiniteSolutionsException.java index 9ea32d7..f578a62 100644 --- a/src/main/java/algolib/maths/InfiniteSolutionsException.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/InfiniteSolutionsException.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.io.Serial; diff --git a/src/main/java/algolib/maths/Integers.java b/src/main/java/com/github/refhumbold/algolib/maths/Integers.java similarity index 99% rename from src/main/java/algolib/maths/Integers.java rename to src/main/java/com/github/refhumbold/algolib/maths/Integers.java index fcd08a9..a68a5d3 100644 --- a/src/main/java/algolib/maths/Integers.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/Integers.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; /** Algorithms for basic computations on integers. */ public final class Integers diff --git a/src/main/java/algolib/maths/NoSolutionException.java b/src/main/java/com/github/refhumbold/algolib/maths/NoSolutionException.java similarity index 83% rename from src/main/java/algolib/maths/NoSolutionException.java rename to src/main/java/com/github/refhumbold/algolib/maths/NoSolutionException.java index 1fb10bc..b1a0daf 100644 --- a/src/main/java/algolib/maths/NoSolutionException.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/NoSolutionException.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.io.Serial; diff --git a/src/main/java/algolib/maths/PrimesSearching.java b/src/main/java/com/github/refhumbold/algolib/maths/PrimesSearching.java similarity index 98% rename from src/main/java/algolib/maths/PrimesSearching.java rename to src/main/java/com/github/refhumbold/algolib/maths/PrimesSearching.java index a32b884..017fd14 100644 --- a/src/main/java/algolib/maths/PrimesSearching.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/PrimesSearching.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/algolib/maths/PrimesTesting.java b/src/main/java/com/github/refhumbold/algolib/maths/PrimesTesting.java similarity index 98% rename from src/main/java/algolib/maths/PrimesTesting.java rename to src/main/java/com/github/refhumbold/algolib/maths/PrimesTesting.java index e14d47f..622de23 100644 --- a/src/main/java/algolib/maths/PrimesTesting.java +++ b/src/main/java/com/github/refhumbold/algolib/maths/PrimesTesting.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.util.Random; import java.util.stream.IntStream; diff --git a/src/main/java/algolib/sequences/LongestCommonSubsequence.java b/src/main/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequence.java similarity index 97% rename from src/main/java/algolib/sequences/LongestCommonSubsequence.java rename to src/main/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequence.java index 9837827..b5d2113 100644 --- a/src/main/java/algolib/sequences/LongestCommonSubsequence.java +++ b/src/main/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequence.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.List; import java.util.stream.IntStream; diff --git a/src/main/java/algolib/sequences/LongestIncreasingSubsequence.java b/src/main/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequence.java similarity index 98% rename from src/main/java/algolib/sequences/LongestIncreasingSubsequence.java rename to src/main/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequence.java index 1b3a744..5df5662 100644 --- a/src/main/java/algolib/sequences/LongestIncreasingSubsequence.java +++ b/src/main/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequence.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/algolib/sequences/MaximumSubarray.java b/src/main/java/com/github/refhumbold/algolib/sequences/MaximumSubarray.java similarity index 88% rename from src/main/java/algolib/sequences/MaximumSubarray.java rename to src/main/java/com/github/refhumbold/algolib/sequences/MaximumSubarray.java index 93a9157..85e2b08 100644 --- a/src/main/java/algolib/sequences/MaximumSubarray.java +++ b/src/main/java/com/github/refhumbold/algolib/sequences/MaximumSubarray.java @@ -1,11 +1,10 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; - -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.tuples.Pair; /** Algorithms for maximum subarray. */ public final class MaximumSubarray @@ -74,11 +73,9 @@ public static double countMaximalSubsum(Collection sequence) Math.max(intervalSums.get(indexRight), intervalSums.get(indexLeft)), suffixSums.get(indexRight) + prefixSums.get(indexLeft))); prefixSums.set(index, Math.max(prefixSums.get(indexRight), - allSums.get(indexRight) + prefixSums.get( - indexLeft))); + allSums.get(indexRight) + prefixSums.get(indexLeft))); suffixSums.set(index, Math.max(suffixSums.get(indexLeft), - suffixSums.get(indexRight) + allSums.get( - indexLeft))); + suffixSums.get(indexRight) + allSums.get(indexLeft))); allSums.set(index, allSums.get(indexRight) + allSums.get(indexLeft)); index /= 2; } diff --git a/src/main/java/algolib/sequences/Sorting.java b/src/main/java/com/github/refhumbold/algolib/sequences/Sorting.java similarity index 99% rename from src/main/java/algolib/sequences/Sorting.java rename to src/main/java/com/github/refhumbold/algolib/sequences/Sorting.java index 6f1eee7..d1c4cd4 100644 --- a/src/main/java/algolib/sequences/Sorting.java +++ b/src/main/java/com/github/refhumbold/algolib/sequences/Sorting.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/algolib/structures/AvlTree.java b/src/main/java/com/github/refhumbold/algolib/structures/AvlTree.java similarity index 99% rename from src/main/java/algolib/structures/AvlTree.java rename to src/main/java/com/github/refhumbold/algolib/structures/AvlTree.java index daf648d..87502a9 100644 --- a/src/main/java/algolib/structures/AvlTree.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/AvlTree.java @@ -1,4 +1,4 @@ -package algolib.structures; +package com.github.refhumbold.algolib.structures; import java.util.*; import java.util.function.BiFunction; diff --git a/src/main/java/algolib/structures/DisjointSets.java b/src/main/java/com/github/refhumbold/algolib/structures/DisjointSets.java similarity index 99% rename from src/main/java/algolib/structures/DisjointSets.java rename to src/main/java/com/github/refhumbold/algolib/structures/DisjointSets.java index 7db47f7..734ccfe 100644 --- a/src/main/java/algolib/structures/DisjointSets.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/DisjointSets.java @@ -1,4 +1,4 @@ -package algolib.structures; +package com.github.refhumbold.algolib.structures; import java.util.*; import java.util.function.Function; diff --git a/src/main/java/algolib/structures/heaps/AbstractHeap.java b/src/main/java/com/github/refhumbold/algolib/structures/heaps/AbstractHeap.java similarity index 97% rename from src/main/java/algolib/structures/heaps/AbstractHeap.java rename to src/main/java/com/github/refhumbold/algolib/structures/heaps/AbstractHeap.java index d7091fe..ef19c03 100644 --- a/src/main/java/algolib/structures/heaps/AbstractHeap.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/heaps/AbstractHeap.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.AbstractQueue; import java.util.Comparator; diff --git a/src/main/java/algolib/structures/heaps/DoubleHeap.java b/src/main/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeap.java similarity index 99% rename from src/main/java/algolib/structures/heaps/DoubleHeap.java rename to src/main/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeap.java index 87f54b1..137cb23 100644 --- a/src/main/java/algolib/structures/heaps/DoubleHeap.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeap.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.*; diff --git a/src/main/java/algolib/structures/heaps/LeftistHeap.java b/src/main/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeap.java similarity index 98% rename from src/main/java/algolib/structures/heaps/LeftistHeap.java rename to src/main/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeap.java index a797e27..7cc2075 100644 --- a/src/main/java/algolib/structures/heaps/LeftistHeap.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeap.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.ArrayDeque; import java.util.Collection; diff --git a/src/main/java/algolib/structures/heaps/PairingHeap.java b/src/main/java/com/github/refhumbold/algolib/structures/heaps/PairingHeap.java similarity index 98% rename from src/main/java/algolib/structures/heaps/PairingHeap.java rename to src/main/java/com/github/refhumbold/algolib/structures/heaps/PairingHeap.java index acba0a2..5586fca 100644 --- a/src/main/java/algolib/structures/heaps/PairingHeap.java +++ b/src/main/java/com/github/refhumbold/algolib/structures/heaps/PairingHeap.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.*; diff --git a/src/main/java/algolib/text/BaseWordsMap.java b/src/main/java/com/github/refhumbold/algolib/text/BaseWordsMap.java similarity index 85% rename from src/main/java/algolib/text/BaseWordsMap.java rename to src/main/java/com/github/refhumbold/algolib/text/BaseWordsMap.java index c25ce38..68380bb 100644 --- a/src/main/java/algolib/text/BaseWordsMap.java +++ b/src/main/java/com/github/refhumbold/algolib/text/BaseWordsMap.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.Comparator; import java.util.HashMap; @@ -7,9 +7,8 @@ import java.util.Objects; import java.util.function.BiFunction; import java.util.stream.IntStream; - -import algolib.tuples.ComparablePair; -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.tuples.ComparablePair; +import com.github.refhumbold.algolib.tuples.Pair; /** Structure of base words map using Karp-Miller-Rosenberg algorithm. */ public final class BaseWordsMap @@ -85,21 +84,19 @@ public Pair getCode(int startIndex, int endIndex) int n = getMaxLength(endIndex - startIndex); return Pair.of(factors.get(Pair.of(startIndex, startIndex + n)), - factors.get(Pair.of(endIndex - n, endIndex))); + factors.get(Pair.of(endIndex - n, endIndex))); } // Builds base words map using Karp-Miller-Rosenberg algorithm. private void create() { - int codeValue = extend(1, 0, (i, length) -> new int[]{text.charAt(i), 1 + text.charAt(i), i, - i + length}); + int codeValue = extend(1, 0, + (i, length) -> new int[]{ text.charAt(i), 1 + text.charAt(i), i, i + length }); for(int currentLength = 2; currentLength <= text.length(); currentLength *= 2) codeValue = extend(currentLength, codeValue, - (i, length) -> new int[]{factors.get(Pair.of(i, i + length / 2)), - factors.get(Pair.of(i + length / 2, - i + length)), i, - i + length}); + (i, length) -> new int[]{ factors.get(Pair.of(i, i + length / 2)), + factors.get(Pair.of(i + length / 2, i + length)), i, i + length }); } // Encodes substring of given length using already counted factors. diff --git a/src/main/java/algolib/text/EditDistance.java b/src/main/java/com/github/refhumbold/algolib/text/EditDistance.java similarity index 99% rename from src/main/java/algolib/text/EditDistance.java rename to src/main/java/com/github/refhumbold/algolib/text/EditDistance.java index 5793ed4..2b517d1 100644 --- a/src/main/java/algolib/text/EditDistance.java +++ b/src/main/java/com/github/refhumbold/algolib/text/EditDistance.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.stream.IntStream; diff --git a/src/main/java/algolib/text/KnuthMorrisPratt.java b/src/main/java/com/github/refhumbold/algolib/text/KnuthMorrisPratt.java similarity index 97% rename from src/main/java/algolib/text/KnuthMorrisPratt.java rename to src/main/java/com/github/refhumbold/algolib/text/KnuthMorrisPratt.java index 4e31d0c..4270c4f 100644 --- a/src/main/java/algolib/text/KnuthMorrisPratt.java +++ b/src/main/java/com/github/refhumbold/algolib/text/KnuthMorrisPratt.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/algolib/text/SuffixArray.java b/src/main/java/com/github/refhumbold/algolib/text/SuffixArray.java similarity index 99% rename from src/main/java/algolib/text/SuffixArray.java rename to src/main/java/com/github/refhumbold/algolib/text/SuffixArray.java index 546fea9..ecfe48a 100644 --- a/src/main/java/algolib/text/SuffixArray.java +++ b/src/main/java/com/github/refhumbold/algolib/text/SuffixArray.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/algolib/text/Trie.java b/src/main/java/com/github/refhumbold/algolib/text/Trie.java similarity index 98% rename from src/main/java/algolib/text/Trie.java rename to src/main/java/com/github/refhumbold/algolib/text/Trie.java index fa103a1..b14470d 100644 --- a/src/main/java/algolib/text/Trie.java +++ b/src/main/java/com/github/refhumbold/algolib/text/Trie.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/algolib/tuples/ComparablePair.java b/src/main/java/com/github/refhumbold/algolib/tuples/ComparablePair.java similarity index 96% rename from src/main/java/algolib/tuples/ComparablePair.java rename to src/main/java/com/github/refhumbold/algolib/tuples/ComparablePair.java index 89de9a9..58c25d6 100644 --- a/src/main/java/algolib/tuples/ComparablePair.java +++ b/src/main/java/com/github/refhumbold/algolib/tuples/ComparablePair.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import java.util.Comparator; import java.util.Objects; diff --git a/src/main/java/algolib/tuples/ComparableTriple.java b/src/main/java/com/github/refhumbold/algolib/tuples/ComparableTriple.java similarity index 97% rename from src/main/java/algolib/tuples/ComparableTriple.java rename to src/main/java/com/github/refhumbold/algolib/tuples/ComparableTriple.java index 9c7aab4..8bcc043 100644 --- a/src/main/java/algolib/tuples/ComparableTriple.java +++ b/src/main/java/com/github/refhumbold/algolib/tuples/ComparableTriple.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import java.util.Comparator; import java.util.Objects; diff --git a/src/main/java/algolib/tuples/Pair.java b/src/main/java/com/github/refhumbold/algolib/tuples/Pair.java similarity index 95% rename from src/main/java/algolib/tuples/Pair.java rename to src/main/java/com/github/refhumbold/algolib/tuples/Pair.java index 727837b..a64b4c8 100644 --- a/src/main/java/algolib/tuples/Pair.java +++ b/src/main/java/com/github/refhumbold/algolib/tuples/Pair.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import java.util.Objects; diff --git a/src/main/java/algolib/tuples/Triple.java b/src/main/java/com/github/refhumbold/algolib/tuples/Triple.java similarity index 95% rename from src/main/java/algolib/tuples/Triple.java rename to src/main/java/com/github/refhumbold/algolib/tuples/Triple.java index c2c4433..ee6b4e0 100644 --- a/src/main/java/algolib/tuples/Triple.java +++ b/src/main/java/com/github/refhumbold/algolib/tuples/Triple.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import java.util.Objects; diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index f7de8a6..b58089c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,15 +1,15 @@ module algolib { - exports algolib.geometry; - exports algolib.geometry.dim2; - exports algolib.geometry.dim3; - exports algolib.graphs; - exports algolib.graphs.algorithms; - exports algolib.graphs.algorithms.strategy; - exports algolib.graphs.properties; - exports algolib.maths; - exports algolib.sequences; - exports algolib.structures; - exports algolib.structures.heaps; - exports algolib.text; - exports algolib.tuples; + exports com.github.refhumbold.algolib.geometry; + exports com.github.refhumbold.algolib.geometry.dim2; + exports com.github.refhumbold.algolib.geometry.dim3; + exports com.github.refhumbold.algolib.graphs; + exports com.github.refhumbold.algolib.graphs.algorithms; + exports com.github.refhumbold.algolib.graphs.algorithms.strategy; + exports com.github.refhumbold.algolib.graphs.properties; + exports com.github.refhumbold.algolib.maths; + exports com.github.refhumbold.algolib.sequences; + exports com.github.refhumbold.algolib.structures; + exports com.github.refhumbold.algolib.structures.heaps; + exports com.github.refhumbold.algolib.text; + exports com.github.refhumbold.algolib.tuples; } diff --git a/src/test/java/algolib/geometry/dim2/ClosestPointsTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPointsTest.java similarity index 96% rename from src/test/java/algolib/geometry/dim2/ClosestPointsTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPointsTest.java index 97000a6..523c27a 100644 --- a/src/test/java/algolib/geometry/dim2/ClosestPointsTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/ClosestPointsTest.java @@ -1,11 +1,10 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.List; import java.util.NoSuchElementException; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.tuples.Pair; // Tests: Algorithm for pair of closest points in 2D. public class ClosestPointsTest diff --git a/src/test/java/algolib/geometry/dim2/ConvexHullTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHullTest.java similarity index 92% rename from src/test/java/algolib/geometry/dim2/ConvexHullTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHullTest.java index 133d02d..e170d35 100644 --- a/src/test/java/algolib/geometry/dim2/ConvexHullTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/ConvexHullTest.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.List; import org.assertj.core.api.Assertions; @@ -56,8 +56,8 @@ public void findConvexHull_ThenPointsInHull() // then Assertions.assertThat(result) .containsExactly(Point2D.of(-1, -8), Point2D.of(3, -6), Point2D.of(6, -4), - Point2D.of(10, 2), Point2D.of(5, 9), Point2D.of(-5, 10), - Point2D.of(-7, 7), Point2D.of(-8, -7)); + Point2D.of(10, 2), Point2D.of(5, 9), Point2D.of(-5, 10), + Point2D.of(-7, 7), Point2D.of(-8, -7)); } @Test diff --git a/src/test/java/algolib/geometry/dim2/Geometry2DTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2DTest.java similarity index 70% rename from src/test/java/algolib/geometry/dim2/Geometry2DTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2DTest.java index eaac301..e367062 100644 --- a/src/test/java/algolib/geometry/dim2/Geometry2DTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/Geometry2DTest.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import java.util.Arrays; import java.util.List; @@ -14,8 +14,8 @@ public void sortByX_ThenSortedStablyAscending() // given List sequence = Arrays.asList(Point2D.of(0.0, 0.0), Point2D.of(-2.0, -3.0), Point2D.of(-3.0, 2.0), - Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), - Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); + Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), + Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); // when Geometry2D.sortByX(sequence); @@ -23,10 +23,9 @@ public void sortByX_ThenSortedStablyAscending() // then Assertions.assertThat(sequence) .containsExactly(Point2D.of(-3.0, 2.0), Point2D.of(-3.0, -2.0), - Point2D.of(-2.0, -3.0), Point2D.of(-2.0, 3.0), - Point2D.of(0.0, 0.0), Point2D.of(2.0, 3.0), - Point2D.of(2.0, -3.0), Point2D.of(3.0, -2.0), - Point2D.of(3.0, 2.0)); + Point2D.of(-2.0, -3.0), Point2D.of(-2.0, 3.0), Point2D.of(0.0, 0.0), + Point2D.of(2.0, 3.0), Point2D.of(2.0, -3.0), Point2D.of(3.0, -2.0), + Point2D.of(3.0, 2.0)); } @Test @@ -35,8 +34,8 @@ public void sortByY_ThenSortedStablyAscending() // given List sequence = Arrays.asList(Point2D.of(0.0, 0.0), Point2D.of(-2.0, -3.0), Point2D.of(-3.0, 2.0), - Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), - Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); + Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), + Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); // when Geometry2D.sortByY(sequence); @@ -44,10 +43,9 @@ public void sortByY_ThenSortedStablyAscending() // then Assertions.assertThat(sequence) .containsExactly(Point2D.of(-2.0, -3.0), Point2D.of(2.0, -3.0), - Point2D.of(3.0, -2.0), Point2D.of(-3.0, -2.0), - Point2D.of(0.0, 0.0), Point2D.of(-3.0, 2.0), - Point2D.of(3.0, 2.0), Point2D.of(2.0, 3.0), - Point2D.of(-2.0, 3.0)); + Point2D.of(3.0, -2.0), Point2D.of(-3.0, -2.0), Point2D.of(0.0, 0.0), + Point2D.of(-3.0, 2.0), Point2D.of(3.0, 2.0), Point2D.of(2.0, 3.0), + Point2D.of(-2.0, 3.0)); } @Test @@ -56,8 +54,8 @@ public void sortByAngle_ThenSortedAscending() // given List sequence = Arrays.asList(Point2D.of(0.0, 0.0), Point2D.of(-2.0, -3.0), Point2D.of(-3.0, 2.0), - Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), - Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); + Point2D.of(2.0, 3.0), Point2D.of(3.0, -2.0), Point2D.of(-2.0, 3.0), + Point2D.of(3.0, 2.0), Point2D.of(2.0, -3.0), Point2D.of(-3.0, -2.0)); // when Geometry2D.sortByAngle(sequence); @@ -65,9 +63,8 @@ public void sortByAngle_ThenSortedAscending() // then Assertions.assertThat(sequence) .containsExactly(Point2D.of(0.0, 0.0), Point2D.of(3.0, 2.0), Point2D.of(2.0, 3.0), - Point2D.of(-2.0, 3.0), Point2D.of(-3.0, 2.0), - Point2D.of(-3.0, -2.0), Point2D.of(-2.0, -3.0), - Point2D.of(2.0, -3.0), Point2D.of(3.0, -2.0)); + Point2D.of(-2.0, 3.0), Point2D.of(-3.0, 2.0), Point2D.of(-3.0, -2.0), + Point2D.of(-2.0, -3.0), Point2D.of(2.0, -3.0), Point2D.of(3.0, -2.0)); } @Test @@ -76,7 +73,7 @@ public void sortByAngle_WhenEqualAngles_ThenCompareRadius() // given List sequence = Arrays.asList(Point2D.of(0.0, 0.0), Point2D.of(1.0, 1.0), Point2D.of(-2.0, -2.0), - Point2D.of(-3.0, -3.0), Point2D.of(4.0, 4.0)); + Point2D.of(-3.0, -3.0), Point2D.of(4.0, 4.0)); // when Geometry2D.sortByAngle(sequence); @@ -84,7 +81,7 @@ public void sortByAngle_WhenEqualAngles_ThenCompareRadius() // then Assertions.assertThat(sequence) .containsExactly(Point2D.of(0.0, 0.0), Point2D.of(1.0, 1.0), Point2D.of(4.0, 4.0), - Point2D.of(-2.0, -2.0), Point2D.of(-3.0, -3.0)); + Point2D.of(-2.0, -2.0), Point2D.of(-3.0, -3.0)); } @Test diff --git a/src/test/java/algolib/geometry/dim2/Vector2DTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/Vector2DTest.java similarity index 96% rename from src/test/java/algolib/geometry/dim2/Vector2DTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim2/Vector2DTest.java index abb2814..e4e194f 100644 --- a/src/test/java/algolib/geometry/dim2/Vector2DTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim2/Vector2DTest.java @@ -1,10 +1,9 @@ -package algolib.geometry.dim2; +package com.github.refhumbold.algolib.geometry.dim2; import org.assertj.core.api.Assertions; import org.assertj.core.data.Offset; import org.junit.jupiter.api.Test; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; // Tests: Structure of vector in 2D. public class Vector2DTest diff --git a/src/test/java/algolib/geometry/dim3/Geometry3DTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3DTest.java similarity index 70% rename from src/test/java/algolib/geometry/dim3/Geometry3DTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3DTest.java index e696d57..717a9e9 100644 --- a/src/test/java/algolib/geometry/dim3/Geometry3DTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim3/Geometry3DTest.java @@ -1,4 +1,4 @@ -package algolib.geometry.dim3; +package com.github.refhumbold.algolib.geometry.dim3; import java.util.Arrays; import java.util.List; @@ -14,17 +14,17 @@ public void sortByX_ThenSortedStablyAscending() // given List sequence = Arrays.asList(Point3D.of(0.0, 0.0, 0.0), Point3D.of(2.0, 3.0, -5.0), - Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), - Point3D.of(-3.0, 2.0, 5.0)); + Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), + Point3D.of(-3.0, 2.0, 5.0)); // when Geometry3D.sortByX(sequence); // then Assertions.assertThat(sequence) .containsExactly(Point3D.of(-3.0, 2.0, 5.0), Point3D.of(-2.0, -3.0, 5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), - Point3D.of(2.0, 3.0, -5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(3.0, 2.0, 5.0)); + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), + Point3D.of(2.0, 3.0, -5.0), Point3D.of(2.0, -3.0, -5.0), + Point3D.of(3.0, 2.0, 5.0)); } @Test @@ -33,17 +33,17 @@ public void sortByY_ThenSortedStablyAscending() // given List sequence = Arrays.asList(Point3D.of(0.0, 0.0, 0.0), Point3D.of(2.0, 3.0, -5.0), - Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), - Point3D.of(-3.0, 2.0, 5.0)); + Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), + Point3D.of(-3.0, 2.0, 5.0)); // when Geometry3D.sortByY(sequence); // then Assertions.assertThat(sequence) .containsExactly(Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), - Point3D.of(3.0, 2.0, 5.0), Point3D.of(-3.0, 2.0, 5.0), - Point3D.of(2.0, 3.0, -5.0)); + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), + Point3D.of(3.0, 2.0, 5.0), Point3D.of(-3.0, 2.0, 5.0), + Point3D.of(2.0, 3.0, -5.0)); } @Test @@ -52,17 +52,17 @@ public void sortByZ_ThenSortedStablyAscending() // given List sequence = Arrays.asList(Point3D.of(0.0, 0.0, 0.0), Point3D.of(2.0, 3.0, -5.0), - Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), - Point3D.of(-3.0, 2.0, 5.0)); + Point3D.of(-2.0, -3.0, 5.0), Point3D.of(2.0, -3.0, -5.0), + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(3.0, 2.0, 5.0), + Point3D.of(-3.0, 2.0, 5.0)); // when Geometry3D.sortByZ(sequence); // then Assertions.assertThat(sequence) .containsExactly(Point3D.of(2.0, 3.0, -5.0), Point3D.of(2.0, -3.0, -5.0), - Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), - Point3D.of(-2.0, -3.0, 5.0), Point3D.of(3.0, 2.0, 5.0), - Point3D.of(-3.0, 2.0, 5.0)); + Point3D.of(-2.0, -3.0, -5.0), Point3D.of(0.0, 0.0, 0.0), + Point3D.of(-2.0, -3.0, 5.0), Point3D.of(3.0, 2.0, 5.0), + Point3D.of(-3.0, 2.0, 5.0)); } @Test diff --git a/src/test/java/algolib/geometry/dim3/Vector3DTest.java b/src/test/java/com/github/refhumbold/algolib/geometry/dim3/Vector3DTest.java similarity index 94% rename from src/test/java/algolib/geometry/dim3/Vector3DTest.java rename to src/test/java/com/github/refhumbold/algolib/geometry/dim3/Vector3DTest.java index bfccb99..b883fbc 100644 --- a/src/test/java/algolib/geometry/dim3/Vector3DTest.java +++ b/src/test/java/com/github/refhumbold/algolib/geometry/dim3/Vector3DTest.java @@ -1,10 +1,9 @@ -package algolib.geometry.dim3; +package com.github.refhumbold.algolib.geometry.dim3; import org.assertj.core.api.Assertions; import org.assertj.core.data.Offset; import org.junit.jupiter.api.Test; - -import algolib.geometry.GeometryObject; +import com.github.refhumbold.algolib.geometry.GeometryObject; // Tests: Structure of vector in 3D. public class Vector3DTest @@ -95,7 +94,7 @@ public void volume_ThenScalarTripleProduct() { // when double result = Vector3D.volume(Vector3D.of(1.5, -4.0, -3.5), Vector3D.of(9.0, -2.5, 8.5), - Vector3D.of(1.0, -1.0, 1.0)); + Vector3D.of(1.0, -1.0, 1.0)); // then Assertions.assertThat(result).isCloseTo(33.75, OFFSET); } @@ -105,7 +104,7 @@ public void volume_WhenParallel_ThenZero() { // when double result = Vector3D.volume(Vector3D.of(3.0, 3.0, 3.0), Vector3D.of(-8.0, -8.0, -8.0), - Vector3D.of(2.0, -2.0, 2.0)); + Vector3D.of(2.0, -2.0, 2.0)); // then Assertions.assertThat(result).isCloseTo(0.0, OFFSET); } @@ -115,7 +114,7 @@ public void volume_WhenOrthogonal_ThenZero() { // when double result = Vector3D.volume(Vector3D.of(3.0, 3.0, 3.0), Vector3D.of(1.0, 0.0, 1.0), - Vector3D.of(0.0, -2.0, 0.0)); + Vector3D.of(0.0, -2.0, 0.0)); // then Assertions.assertThat(result).isCloseTo(0.0, OFFSET); } diff --git a/src/test/java/algolib/graphs/DirectedSimpleGraphTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraphTest.java similarity index 86% rename from src/test/java/algolib/graphs/DirectedSimpleGraphTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraphTest.java index e8e0bf0..1a6d707 100644 --- a/src/test/java/algolib/graphs/DirectedSimpleGraphTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/DirectedSimpleGraphTest.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.stream.Collectors; @@ -112,8 +112,8 @@ public void getVertices_ThenAllVertices() // then Assertions.assertThat(result) .containsOnly(new Vertex<>(0), new Vertex<>(1), new Vertex<>(2), new Vertex<>(3), - new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), - new Vertex<>(8), new Vertex<>(9)); + new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), + new Vertex<>(8), new Vertex<>(9)); } @Test @@ -134,12 +134,12 @@ public void getEdges_ThenAllEdges() // then Assertions.assertThat(result) .containsOnly(new Edge<>(new Vertex<>(1), new Vertex<>(5)), - new Edge<>(new Vertex<>(2), new Vertex<>(4)), - new Edge<>(new Vertex<>(3), new Vertex<>(6)), - new Edge<>(new Vertex<>(6), new Vertex<>(3)), - new Edge<>(new Vertex<>(7), new Vertex<>(7)), - new Edge<>(new Vertex<>(8), new Vertex<>(0)), - new Edge<>(new Vertex<>(9), new Vertex<>(3))); + new Edge<>(new Vertex<>(2), new Vertex<>(4)), + new Edge<>(new Vertex<>(3), new Vertex<>(6)), + new Edge<>(new Vertex<>(6), new Vertex<>(3)), + new Edge<>(new Vertex<>(7), new Vertex<>(7)), + new Edge<>(new Vertex<>(8), new Vertex<>(0)), + new Edge<>(new Vertex<>(9), new Vertex<>(3))); } @Test @@ -227,7 +227,7 @@ public void getNeighbours_ThenDestinationVerticesOfOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Vertex<>(1), new Vertex<>(3), new Vertex<>(4), - new Vertex<>(7), new Vertex<>(9)); + new Vertex<>(7), new Vertex<>(9)); } @Test @@ -248,10 +248,10 @@ public void getAdjacentEdges_ThenOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Edge<>(new Vertex<>(1), new Vertex<>(1)), - new Edge<>(new Vertex<>(1), new Vertex<>(3)), - new Edge<>(new Vertex<>(1), new Vertex<>(4)), - new Edge<>(new Vertex<>(1), new Vertex<>(7)), - new Edge<>(new Vertex<>(1), new Vertex<>(9))); + new Edge<>(new Vertex<>(1), new Vertex<>(3)), + new Edge<>(new Vertex<>(1), new Vertex<>(4)), + new Edge<>(new Vertex<>(1), new Vertex<>(7)), + new Edge<>(new Vertex<>(1), new Vertex<>(9))); } @Test @@ -386,15 +386,15 @@ public void reverse_ThenAllEdgesHaveReversedDirection() // then Assertions.assertThat(testObject.getEdges()) .containsOnly(new Edge<>(new Vertex<>(1), new Vertex<>(9)), - new Edge<>(new Vertex<>(2), new Vertex<>(1)), - new Edge<>(new Vertex<>(2), new Vertex<>(6)), - new Edge<>(new Vertex<>(4), new Vertex<>(5)), - new Edge<>(new Vertex<>(5), new Vertex<>(3)), - new Edge<>(new Vertex<>(6), new Vertex<>(6)), - new Edge<>(new Vertex<>(6), new Vertex<>(9)), - new Edge<>(new Vertex<>(7), new Vertex<>(5)), - new Edge<>(new Vertex<>(8), new Vertex<>(7)), - new Edge<>(new Vertex<>(9), new Vertex<>(4))); + new Edge<>(new Vertex<>(2), new Vertex<>(1)), + new Edge<>(new Vertex<>(2), new Vertex<>(6)), + new Edge<>(new Vertex<>(4), new Vertex<>(5)), + new Edge<>(new Vertex<>(5), new Vertex<>(3)), + new Edge<>(new Vertex<>(6), new Vertex<>(6)), + new Edge<>(new Vertex<>(6), new Vertex<>(9)), + new Edge<>(new Vertex<>(7), new Vertex<>(5)), + new Edge<>(new Vertex<>(8), new Vertex<>(7)), + new Edge<>(new Vertex<>(9), new Vertex<>(4))); Assertions.assertThat(testObject.getProperties().get(vertex)).isEqualTo(vertexProperty); Assertions.assertThat(testObject.getProperties().get(new Vertex<>(9))).isNull(); Assertions.assertThat(testObject.getProperties().get(testObject.getEdge(2, 1))) @@ -429,15 +429,15 @@ public void reversedCopy_ThenNewGraphWithReversedEdges() Assertions.assertThat(result.getVertices()).hasSameElementsAs(testObject.getVertices()); Assertions.assertThat(result.getEdges()) .containsOnly(new Edge<>(new Vertex<>(1), new Vertex<>(9)), - new Edge<>(new Vertex<>(2), new Vertex<>(1)), - new Edge<>(new Vertex<>(2), new Vertex<>(6)), - new Edge<>(new Vertex<>(4), new Vertex<>(5)), - new Edge<>(new Vertex<>(5), new Vertex<>(3)), - new Edge<>(new Vertex<>(6), new Vertex<>(6)), - new Edge<>(new Vertex<>(6), new Vertex<>(9)), - new Edge<>(new Vertex<>(7), new Vertex<>(5)), - new Edge<>(new Vertex<>(8), new Vertex<>(7)), - new Edge<>(new Vertex<>(9), new Vertex<>(4))); + new Edge<>(new Vertex<>(2), new Vertex<>(1)), + new Edge<>(new Vertex<>(2), new Vertex<>(6)), + new Edge<>(new Vertex<>(4), new Vertex<>(5)), + new Edge<>(new Vertex<>(5), new Vertex<>(3)), + new Edge<>(new Vertex<>(6), new Vertex<>(6)), + new Edge<>(new Vertex<>(6), new Vertex<>(9)), + new Edge<>(new Vertex<>(7), new Vertex<>(5)), + new Edge<>(new Vertex<>(8), new Vertex<>(7)), + new Edge<>(new Vertex<>(9), new Vertex<>(4))); Assertions.assertThat(result.getProperties().get(vertex)).isEqualTo(vertexProperty); Assertions.assertThat(result.getProperties().get(new Vertex<>(9))).isNull(); Assertions.assertThat(result.getProperties().get(result.getEdge(2, 1))) diff --git a/src/test/java/algolib/graphs/MultipartiteGraphTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/MultipartiteGraphTest.java similarity index 91% rename from src/test/java/algolib/graphs/MultipartiteGraphTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/MultipartiteGraphTest.java index 4e27706..2ca3098 100644 --- a/src/test/java/algolib/graphs/MultipartiteGraphTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/MultipartiteGraphTest.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.List; @@ -14,8 +14,8 @@ public class MultipartiteGraphTest @BeforeEach public void setUp() { - testObject = new MultipartiteGraph<>(5, List.of(List.of(0, 1, 2), List.of(3, 4), - List.of(5, 6, 7, 8), List.of(9))); + testObject = new MultipartiteGraph<>(5, + List.of(List.of(0, 1, 2), List.of(3, 4), List.of(5, 6, 7, 8), List.of(9))); testObject.addEdgeBetween(new Vertex<>(0), new Vertex<>(3)); testObject.addEdgeBetween(new Vertex<>(1), new Vertex<>(5)); testObject.addEdgeBetween(new Vertex<>(2), new Vertex<>(9)); @@ -73,8 +73,8 @@ public void getVertices_ThenAllVertices() // then Assertions.assertThat(result) .containsOnly(new Vertex<>(0), new Vertex<>(1), new Vertex<>(2), new Vertex<>(3), - new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), - new Vertex<>(8), new Vertex<>(9)); + new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), + new Vertex<>(8), new Vertex<>(9)); } @Test @@ -86,10 +86,10 @@ public void getEdges_ThenAllEdges() // then Assertions.assertThat(result) .containsOnly(new Edge<>(new Vertex<>(0), new Vertex<>(3)), - new Edge<>(new Vertex<>(1), new Vertex<>(5)), - new Edge<>(new Vertex<>(2), new Vertex<>(9)), - new Edge<>(new Vertex<>(4), new Vertex<>(6)), - new Edge<>(new Vertex<>(7), new Vertex<>(9))); + new Edge<>(new Vertex<>(1), new Vertex<>(5)), + new Edge<>(new Vertex<>(2), new Vertex<>(9)), + new Edge<>(new Vertex<>(4), new Vertex<>(6)), + new Edge<>(new Vertex<>(7), new Vertex<>(9))); } @Test @@ -140,7 +140,7 @@ public void getAdjacentEdges_ThenDestinationVerticesOfOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Edge<>(new Vertex<>(2), new Vertex<>(9)), - new Edge<>(new Vertex<>(7), new Vertex<>(9))); + new Edge<>(new Vertex<>(7), new Vertex<>(9))); } @Test diff --git a/src/test/java/algolib/graphs/TreeGraphTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/TreeGraphTest.java similarity index 88% rename from src/test/java/algolib/graphs/TreeGraphTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/TreeGraphTest.java index 270d969..570582b 100644 --- a/src/test/java/algolib/graphs/TreeGraphTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/TreeGraphTest.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import org.assertj.core.api.Assertions; @@ -73,7 +73,7 @@ public void getVertices_ThenAllVertices() // then Assertions.assertThat(result) .containsOnly(new Vertex<>(0), new Vertex<>(1), new Vertex<>(2), new Vertex<>(3), - new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7)); + new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7)); } @Test @@ -85,12 +85,12 @@ public void getEdges_ThenAllEdges() // then Assertions.assertThat(result) .containsOnly(new Edge<>(new Vertex<>(1), new Vertex<>(0)), - new Edge<>(new Vertex<>(2), new Vertex<>(0)), - new Edge<>(new Vertex<>(3), new Vertex<>(0)), - new Edge<>(new Vertex<>(4), new Vertex<>(1)), - new Edge<>(new Vertex<>(5), new Vertex<>(1)), - new Edge<>(new Vertex<>(6), new Vertex<>(2)), - new Edge<>(new Vertex<>(7), new Vertex<>(2))); + new Edge<>(new Vertex<>(2), new Vertex<>(0)), + new Edge<>(new Vertex<>(3), new Vertex<>(0)), + new Edge<>(new Vertex<>(4), new Vertex<>(1)), + new Edge<>(new Vertex<>(5), new Vertex<>(1)), + new Edge<>(new Vertex<>(6), new Vertex<>(2)), + new Edge<>(new Vertex<>(7), new Vertex<>(2))); } @Test @@ -142,8 +142,8 @@ public void getAdjacentEdges_ThenDestinationVerticesOfOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Edge<>(new Vertex<>(1), new Vertex<>(0)), - new Edge<>(new Vertex<>(4), new Vertex<>(1)), - new Edge<>(new Vertex<>(5), new Vertex<>(1))); + new Edge<>(new Vertex<>(4), new Vertex<>(1)), + new Edge<>(new Vertex<>(5), new Vertex<>(1))); } @Test diff --git a/src/test/java/algolib/graphs/UndirectedSimpleGraphTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraphTest.java similarity index 87% rename from src/test/java/algolib/graphs/UndirectedSimpleGraphTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraphTest.java index 0ea4319..ee317c4 100644 --- a/src/test/java/algolib/graphs/UndirectedSimpleGraphTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/UndirectedSimpleGraphTest.java @@ -1,4 +1,4 @@ -package algolib.graphs; +package com.github.refhumbold.algolib.graphs; import java.util.Collection; import java.util.stream.Collectors; @@ -110,8 +110,8 @@ public void getVertices_ThenAllVertices() // then Assertions.assertThat(result) .containsOnly(new Vertex<>(0), new Vertex<>(1), new Vertex<>(2), new Vertex<>(3), - new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), - new Vertex<>(8), new Vertex<>(9)); + new Vertex<>(4), new Vertex<>(5), new Vertex<>(6), new Vertex<>(7), + new Vertex<>(8), new Vertex<>(9)); } @Test @@ -131,11 +131,11 @@ public void getEdges_ThenAllEdges() // then Assertions.assertThat(result) .containsOnly(new Edge<>(new Vertex<>(7), new Vertex<>(7)), - new Edge<>(new Vertex<>(1), new Vertex<>(5)), - new Edge<>(new Vertex<>(2), new Vertex<>(4)), - new Edge<>(new Vertex<>(8), new Vertex<>(0)), - new Edge<>(new Vertex<>(6), new Vertex<>(3)), - new Edge<>(new Vertex<>(9), new Vertex<>(3))); + new Edge<>(new Vertex<>(1), new Vertex<>(5)), + new Edge<>(new Vertex<>(2), new Vertex<>(4)), + new Edge<>(new Vertex<>(8), new Vertex<>(0)), + new Edge<>(new Vertex<>(6), new Vertex<>(3)), + new Edge<>(new Vertex<>(9), new Vertex<>(3))); } @Test @@ -224,8 +224,7 @@ public void getNeighbours_ThenDestinationVerticesOfOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Vertex<>(1), new Vertex<>(2), new Vertex<>(3), - new Vertex<>(4), new Vertex<>(6), new Vertex<>(7), - new Vertex<>(9)); + new Vertex<>(4), new Vertex<>(6), new Vertex<>(7), new Vertex<>(9)); } @Test @@ -246,12 +245,12 @@ public void getAdjacentEdges_ThenOutgoingEdges() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(new Edge<>(new Vertex<>(1), new Vertex<>(1)), - new Edge<>(new Vertex<>(2), new Vertex<>(1)), - new Edge<>(new Vertex<>(1), new Vertex<>(3)), - new Edge<>(new Vertex<>(1), new Vertex<>(4)), - new Edge<>(new Vertex<>(6), new Vertex<>(1)), - new Edge<>(new Vertex<>(1), new Vertex<>(7)), - new Edge<>(new Vertex<>(1), new Vertex<>(9))); + new Edge<>(new Vertex<>(2), new Vertex<>(1)), + new Edge<>(new Vertex<>(1), new Vertex<>(3)), + new Edge<>(new Vertex<>(1), new Vertex<>(4)), + new Edge<>(new Vertex<>(6), new Vertex<>(1)), + new Edge<>(new Vertex<>(1), new Vertex<>(7)), + new Edge<>(new Vertex<>(1), new Vertex<>(9))); } @Test @@ -398,16 +397,16 @@ public void asDirected_ThenDirectedGraph() Assertions.assertThat(result.getVertices()).hasSameSizeAs(testObject.getVertices()); Assertions.assertThat(result.getEdges()) .containsOnly(new Edge<>(new Vertex<>(0), new Vertex<>(8)), - new Edge<>(new Vertex<>(1), new Vertex<>(5)), - new Edge<>(new Vertex<>(2), new Vertex<>(4)), - new Edge<>(new Vertex<>(3), new Vertex<>(6)), - new Edge<>(new Vertex<>(3), new Vertex<>(9)), - new Edge<>(new Vertex<>(4), new Vertex<>(2)), - new Edge<>(new Vertex<>(5), new Vertex<>(1)), - new Edge<>(new Vertex<>(6), new Vertex<>(3)), - new Edge<>(new Vertex<>(7), new Vertex<>(7)), - new Edge<>(new Vertex<>(8), new Vertex<>(0)), - new Edge<>(new Vertex<>(9), new Vertex<>(3))); + new Edge<>(new Vertex<>(1), new Vertex<>(5)), + new Edge<>(new Vertex<>(2), new Vertex<>(4)), + new Edge<>(new Vertex<>(3), new Vertex<>(6)), + new Edge<>(new Vertex<>(3), new Vertex<>(9)), + new Edge<>(new Vertex<>(4), new Vertex<>(2)), + new Edge<>(new Vertex<>(5), new Vertex<>(1)), + new Edge<>(new Vertex<>(6), new Vertex<>(3)), + new Edge<>(new Vertex<>(7), new Vertex<>(7)), + new Edge<>(new Vertex<>(8), new Vertex<>(0)), + new Edge<>(new Vertex<>(9), new Vertex<>(3))); Assertions.assertThat(result.getProperties().get(vertex)).isEqualTo(vertexProperty); Assertions.assertThat(result.getProperties().get(new Vertex<>(9))).isNull(); Assertions.assertThat(result.getProperties().get(result.getEdge(1, 5))) diff --git a/src/test/java/algolib/graphs/algorithms/CuttingTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/CuttingTest.java similarity index 95% rename from src/test/java/algolib/graphs/algorithms/CuttingTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/CuttingTest.java index 8a6c5f7..3770e3f 100644 --- a/src/test/java/algolib/graphs/algorithms/CuttingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/CuttingTest.java @@ -1,14 +1,13 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.Collection; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.graphs.Edge; -import algolib.graphs.UndirectedSimpleGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.Edge; +import com.github.refhumbold.algolib.graphs.UndirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; // Tests: Algorithms for graph cutting (edge cut and vertex cut). public class CuttingTest @@ -93,7 +92,7 @@ public void findVertexCut_WhenPresentSeparators_ThenSeparators() // then Assertions.assertThat(result) .containsOnly(graph.getVertex(0), graph.getVertex(1), graph.getVertex(5), - graph.getVertex(7)); + graph.getVertex(7)); } @Test diff --git a/src/test/java/algolib/graphs/algorithms/LowestCommonAncestorTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestorTest.java similarity index 95% rename from src/test/java/algolib/graphs/algorithms/LowestCommonAncestorTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestorTest.java index 8d57f11..0bbe774 100644 --- a/src/test/java/algolib/graphs/algorithms/LowestCommonAncestorTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/LowestCommonAncestorTest.java @@ -1,12 +1,11 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import algolib.graphs.TreeGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.TreeGraph; +import com.github.refhumbold.algolib.graphs.Vertex; // Tests: Algorithm for lowest common ancestors in a rooted tree. public class LowestCommonAncestorTest diff --git a/src/test/java/algolib/graphs/algorithms/MatchingTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MatchingTest.java similarity index 91% rename from src/test/java/algolib/graphs/algorithms/MatchingTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MatchingTest.java index 9c42ef1..4b9c021 100644 --- a/src/test/java/algolib/graphs/algorithms/MatchingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MatchingTest.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.List; import java.util.Map; @@ -6,9 +6,8 @@ import java.util.stream.IntStream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.graphs.MultipartiteGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.MultipartiteGraph; +import com.github.refhumbold.algolib.graphs.Vertex; // Tests: Hopcroft-Karp algorithm for matching in a bipartite graph. public class MatchingTest @@ -26,7 +25,7 @@ public void match_WhenMatchingExists_ThenMaximalMatching() graph.addEdgeBetween(graph.getVertex(3), graph.getVertex(6)); graph.addEdgeBetween(graph.getVertex(6), graph.getVertex(7)); - int[] matches = new int[]{5, 2, 1, 4, 3, 0, 7, 6}; + int[] matches = new int[]{ 5, 2, 1, 4, 3, 0, 7, 6 }; Map, Vertex> expected = IntStream.range(0, matches.length) .boxed() .collect(Collectors.toMap( diff --git a/src/test/java/algolib/graphs/algorithms/MinimalSpanningTreeTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTreeTest.java similarity index 92% rename from src/test/java/algolib/graphs/algorithms/MinimalSpanningTreeTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTreeTest.java index c1088ee..ca9c378 100644 --- a/src/test/java/algolib/graphs/algorithms/MinimalSpanningTreeTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/MinimalSpanningTreeTest.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -7,10 +7,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import algolib.graphs.UndirectedGraph; -import algolib.graphs.UndirectedSimpleGraph; -import algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.graphs.UndirectedGraph; +import com.github.refhumbold.algolib.graphs.UndirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.properties.Weighted; // Tests: Algorithms for minimal spanning tree. public class MinimalSpanningTreeTest @@ -56,7 +55,7 @@ public void kruskal_ThenMinimalSpanningTree() Assertions.assertThat(result.getEdgesCount()).isEqualTo(4); Assertions.assertThat(result.getEdges()) .containsOnly(graph.getEdge(0, 1), graph.getEdge(0, 2), graph.getEdge(2, 4), - graph.getEdge(3, 4)); + graph.getEdge(3, 4)); Assertions.assertThat(mstSize).isCloseTo(12.0, OFFSET); } @@ -78,7 +77,7 @@ public void prim_ThenMinimalSpanningTree() Assertions.assertThat(result.getEdgesCount()).isEqualTo(4); Assertions.assertThat(result.getEdges()) .containsOnly(graph.getEdge(0, 1), graph.getEdge(0, 2), graph.getEdge(2, 4), - graph.getEdge(3, 4)); + graph.getEdge(3, 4)); Assertions.assertThat(mstSize).isCloseTo(12.0, Offset.offset(0.000001)); } diff --git a/src/test/java/algolib/graphs/algorithms/SearchingTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/SearchingTest.java similarity index 80% rename from src/test/java/algolib/graphs/algorithms/SearchingTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/SearchingTest.java index 0083a8d..8f6a43d 100644 --- a/src/test/java/algolib/graphs/algorithms/SearchingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/SearchingTest.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.Collection; import java.util.HashSet; @@ -9,12 +9,11 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import algolib.graphs.DirectedSimpleGraph; -import algolib.graphs.UndirectedSimpleGraph; -import algolib.graphs.Vertex; -import algolib.graphs.algorithms.strategy.DfsStrategy; -import algolib.graphs.algorithms.strategy.EmptyStrategy; +import com.github.refhumbold.algolib.graphs.DirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.UndirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.DfsStrategy; +import com.github.refhumbold.algolib.graphs.algorithms.strategy.EmptyStrategy; // Tests: Algorithms for graph searching. public class SearchingTest @@ -65,13 +64,13 @@ public void bfs_WhenUndirectedGraphAndSingleRoot_ThenVisitedVertices() { // when Collection> result = Searching.bfs(undirectedGraph, new EmptyStrategy<>(), - List.of(undirectedGraph.getVertex(0))); + List.of(undirectedGraph.getVertex(0))); // then Assertions.assertThat(result) .isSubsetOf(undirectedGraph.getVertices()) .doesNotContain(undirectedGraph.getVertex(2), undirectedGraph.getVertex(6), - undirectedGraph.getVertex(9)); + undirectedGraph.getVertex(9)); } @Test @@ -82,8 +81,7 @@ public void bfs_WhenUndirectedGraphAndManyRoots_ThenAllVertices() // when Collection> result = Searching.bfs(undirectedGraph, strategy, - List.of(undirectedGraph.getVertex(0), - undirectedGraph.getVertex(6))); + List.of(undirectedGraph.getVertex(0), undirectedGraph.getVertex(6))); // then Assertions.assertThat(result).hasSameElementsAs(undirectedGraph.getVertices()); @@ -107,13 +105,13 @@ public void bfs_WhenDirectedGraphAndSingleRoot_ThenVisitedVertices() { // when Collection> result = Searching.bfs(directedGraph, new EmptyStrategy<>(), - List.of(directedGraph.getVertex(1))); + List.of(directedGraph.getVertex(1))); // then Assertions.assertThat(result) .containsExactlyInAnyOrder(directedGraph.getVertex(0), directedGraph.getVertex(1), - directedGraph.getVertex(3), directedGraph.getVertex(4), - directedGraph.getVertex(7)); + directedGraph.getVertex(3), directedGraph.getVertex(4), + directedGraph.getVertex(7)); } @Test @@ -124,8 +122,7 @@ public void bfs_WhenDirectedGraphAndMultipleRoots_ThenAllVertices() // when Collection> result = Searching.bfs(directedGraph, strategy, - List.of(directedGraph.getVertex(8), - directedGraph.getVertex(6))); + List.of(directedGraph.getVertex(8), directedGraph.getVertex(6))); // then Assertions.assertThat(result).hasSameElementsAs(directedGraph.getVertices()); @@ -142,13 +139,13 @@ public void dfsIterative_WhenUndirectedGraphAndSingleRoot_ThenVisitedVertices() // when Collection> result = Searching.dfsIterative(undirectedGraph, new EmptyStrategy<>(), - List.of(undirectedGraph.getVertex(0))); + List.of(undirectedGraph.getVertex(0))); // then Assertions.assertThat(result) .isSubsetOf(undirectedGraph.getVertices()) .doesNotContain(undirectedGraph.getVertex(2), undirectedGraph.getVertex(6), - undirectedGraph.getVertex(9)); + undirectedGraph.getVertex(9)); } @Test @@ -159,10 +156,7 @@ public void dfsIterative_WhenUndirectedGraphAndManyRoots_ThenAllVertices() // when Collection> result = Searching.dfsIterative(undirectedGraph, strategy, - List.of(undirectedGraph.getVertex( - 0), - undirectedGraph.getVertex( - 6))); + List.of(undirectedGraph.getVertex(0), undirectedGraph.getVertex(6))); // then Assertions.assertThat(result).hasSameElementsAs(undirectedGraph.getVertices()); @@ -187,13 +181,13 @@ public void dfsIterative_WhenDirectedGraphAndSingleRoot_ThenVisitedVertices() // when Collection> result = Searching.dfsIterative(directedGraph, new EmptyStrategy<>(), - List.of(directedGraph.getVertex(1))); + List.of(directedGraph.getVertex(1))); // then Assertions.assertThat(result) .containsExactlyInAnyOrder(directedGraph.getVertex(0), directedGraph.getVertex(1), - directedGraph.getVertex(3), directedGraph.getVertex(4), - directedGraph.getVertex(7)); + directedGraph.getVertex(3), directedGraph.getVertex(4), + directedGraph.getVertex(7)); } @Test @@ -204,10 +198,7 @@ public void dfsIterative_WhenDirectedGraphAndMultipleRoots_ThenAllVertices() // when Collection> result = Searching.dfsIterative(directedGraph, strategy, - List.of(directedGraph.getVertex( - 8), - directedGraph.getVertex( - 6))); + List.of(directedGraph.getVertex(8), directedGraph.getVertex(6))); // then Assertions.assertThat(result).hasSameElementsAs(directedGraph.getVertices()); @@ -224,13 +215,13 @@ public void dfsRecursive_WhenUndirectedGraphAndSingleRoot_ThenVisitedVertices() // when Collection> result = Searching.dfsRecursive(undirectedGraph, new EmptyStrategy<>(), - List.of(undirectedGraph.getVertex(0))); + List.of(undirectedGraph.getVertex(0))); // then Assertions.assertThat(result) .isSubsetOf(undirectedGraph.getVertices()) .doesNotContain(undirectedGraph.getVertex(2), undirectedGraph.getVertex(6), - undirectedGraph.getVertex(9)); + undirectedGraph.getVertex(9)); } @Test @@ -268,13 +259,13 @@ public void dfsRecursive_WhenDirectedGraphAndSingleRoot_ThenVisitedVertices() // when Collection> result = Searching.dfsRecursive(directedGraph, new EmptyStrategy<>(), - List.of(directedGraph.getVertex(1))); + List.of(directedGraph.getVertex(1))); // then Assertions.assertThat(result) .containsExactlyInAnyOrder(directedGraph.getVertex(0), directedGraph.getVertex(1), - directedGraph.getVertex(3), directedGraph.getVertex(4), - directedGraph.getVertex(7)); + directedGraph.getVertex(3), directedGraph.getVertex(4), + directedGraph.getVertex(7)); } @Test diff --git a/src/test/java/algolib/graphs/algorithms/ShortestPathsTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPathsTest.java similarity index 65% rename from src/test/java/algolib/graphs/algorithms/ShortestPathsTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPathsTest.java index e6da875..12006c8 100644 --- a/src/test/java/algolib/graphs/algorithms/ShortestPathsTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/ShortestPathsTest.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.HashMap; import java.util.List; @@ -8,13 +8,12 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import algolib.graphs.DirectedSimpleGraph; -import algolib.graphs.Graph; -import algolib.graphs.UndirectedSimpleGraph; -import algolib.graphs.Vertex; -import algolib.graphs.properties.Weighted; -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.graphs.DirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Graph; +import com.github.refhumbold.algolib.graphs.UndirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.tuples.Pair; // Tests: Algorithms for shortest paths in a graph. public class ShortestPathsTest @@ -29,64 +28,64 @@ public void setUp() directedGraph = new DirectedSimpleGraph<>( IntStream.range(0, 10).boxed().collect(Collectors.toList())); directedGraph.addEdgeBetween(directedGraph.getVertex(0), directedGraph.getVertex(1), - new Weight(4.0)); + new Weight(4.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(1), directedGraph.getVertex(4), - new Weight(7.0)); + new Weight(7.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(1), directedGraph.getVertex(7), - new Weight(12.0)); + new Weight(12.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(2), directedGraph.getVertex(4), - new Weight(6.0)); + new Weight(6.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(2), directedGraph.getVertex(6), - new Weight(8.0)); + new Weight(8.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(3), directedGraph.getVertex(0), - new Weight(3.0)); + new Weight(3.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(3), directedGraph.getVertex(7), - new Weight(5.0)); + new Weight(5.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(4), directedGraph.getVertex(5), - new Weight(1.0)); + new Weight(1.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(4), directedGraph.getVertex(3), - new Weight(10.0)); + new Weight(10.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(5), directedGraph.getVertex(6), - new Weight(4.0)); + new Weight(4.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(5), directedGraph.getVertex(8), - new Weight(2.0)); + new Weight(2.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(6), directedGraph.getVertex(5), - new Weight(7.0)); + new Weight(7.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(7), directedGraph.getVertex(5), - new Weight(2.0)); + new Weight(2.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(7), directedGraph.getVertex(8), - new Weight(6.0)); + new Weight(6.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(8), directedGraph.getVertex(9), - new Weight(10.0)); + new Weight(10.0)); directedGraph.addEdgeBetween(directedGraph.getVertex(9), directedGraph.getVertex(6), - new Weight(3.0)); + new Weight(3.0)); undirectedGraph = new UndirectedSimpleGraph<>( IntStream.range(0, 10).boxed().collect(Collectors.toList())); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(0), undirectedGraph.getVertex(1), - new Weight(4.0)); + new Weight(4.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(1), undirectedGraph.getVertex(4), - new Weight(7.0)); + new Weight(7.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(1), undirectedGraph.getVertex(7), - new Weight(12.0)); + new Weight(12.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(2), undirectedGraph.getVertex(6), - new Weight(8.0)); + new Weight(8.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(3), undirectedGraph.getVertex(0), - new Weight(3.0)); + new Weight(3.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(3), undirectedGraph.getVertex(7), - new Weight(5.0)); + new Weight(5.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(4), undirectedGraph.getVertex(5), - new Weight(1.0)); + new Weight(1.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(4), undirectedGraph.getVertex(3), - new Weight(10.0)); + new Weight(10.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(5), undirectedGraph.getVertex(8), - new Weight(2.0)); + new Weight(2.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(7), undirectedGraph.getVertex(5), - new Weight(2.0)); + new Weight(2.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(7), undirectedGraph.getVertex(8), - new Weight(6.0)); + new Weight(6.0)); undirectedGraph.addEdgeBetween(undirectedGraph.getVertex(9), undirectedGraph.getVertex(6), - new Weight(3.0)); + new Weight(3.0)); } // region bellmanFord @@ -114,7 +113,7 @@ public void bellmanFord_WhenNegativeEdge_ThenEdgeIncluded() Map, Double> expected = fromList(directedGraph, distances); directedGraph.addEdgeBetween(directedGraph.getVertex(8), directedGraph.getVertex(3), - new Weight(-5.0)); + new Weight(-5.0)); // when Map, Double> result = @@ -134,7 +133,7 @@ public void bellmanFord_WhenUndirectedGraph_ThenShortestPathsLengths() // when Map, Double> result = ShortestPaths.bellmanFord(undirectedGraph.asDirected(), - undirectedGraph.getVertex(1)); + undirectedGraph.getVertex(1)); // then Assertions.assertThat(result).isEqualTo(expected); @@ -145,12 +144,11 @@ public void bellmanFord_WhenNegativeCycle_ThenIllegalStateException() { // given directedGraph.addEdgeBetween(directedGraph.getVertex(8), directedGraph.getVertex(3), - new Weight(-20.0)); + new Weight(-20.0)); // then Assertions.assertThatThrownBy( - () -> ShortestPaths.bellmanFord(directedGraph, - directedGraph.getVertex(1))) + () -> ShortestPaths.bellmanFord(directedGraph, directedGraph.getVertex(1))) .isInstanceOf(IllegalStateException.class); } @@ -192,7 +190,7 @@ public void dijkstra_WhenNegativeEdge_ThenIllegalStateException() { // given directedGraph.addEdgeBetween(directedGraph.getVertex(8), directedGraph.getVertex(3), - new Weight(-5.0)); + new Weight(-5.0)); // then Assertions.assertThatThrownBy( @@ -207,16 +205,16 @@ public void dijkstra_WhenNegativeEdge_ThenIllegalStateException() public void floydWarshall_WhenDirectedGraph_ThenAllShortestPathsLengths() { // given - double[][] distances = {{0.0, 4.0, INF, 21.0, 11.0, 12.0, 16.0, 16.0, 14.0, 24.0}, - {20.0, 0.0, INF, 17.0, 7.0, 8.0, 12.0, 12.0, 10.0, 20.0}, - {19.0, 23.0, 0.0, 16.0, 6.0, 7.0, 8.0, 21.0, 9.0, 19.0}, - {3.0, 7.0, INF, 0.0, 14.0, 7.0, 11.0, 5.0, 9.0, 19.0}, - {13.0, 17.0, INF, 10.0, 0.0, 1.0, 5.0, 15.0, 3.0, 13.0}, - {INF, INF, INF, INF, INF, 0.0, 4.0, INF, 2.0, 12.0}, - {INF, INF, INF, INF, INF, 7.0, 0.0, INF, 9.0, 19.0}, - {INF, INF, INF, INF, INF, 2.0, 6.0, 0.0, 4.0, 14.0}, - {INF, INF, INF, INF, INF, 20.0, 13.0, INF, 0.0, 10.0}, - {INF, INF, INF, INF, INF, 10.0, 3.0, INF, 12.0, 0.0}}; + double[][] distances = { { 0.0, 4.0, INF, 21.0, 11.0, 12.0, 16.0, 16.0, 14.0, 24.0 }, + { 20.0, 0.0, INF, 17.0, 7.0, 8.0, 12.0, 12.0, 10.0, 20.0 }, + { 19.0, 23.0, 0.0, 16.0, 6.0, 7.0, 8.0, 21.0, 9.0, 19.0 }, + { 3.0, 7.0, INF, 0.0, 14.0, 7.0, 11.0, 5.0, 9.0, 19.0 }, + { 13.0, 17.0, INF, 10.0, 0.0, 1.0, 5.0, 15.0, 3.0, 13.0 }, + { INF, INF, INF, INF, INF, 0.0, 4.0, INF, 2.0, 12.0 }, + { INF, INF, INF, INF, INF, 7.0, 0.0, INF, 9.0, 19.0 }, + { INF, INF, INF, INF, INF, 2.0, 6.0, 0.0, 4.0, 14.0 }, + { INF, INF, INF, INF, INF, 20.0, 13.0, INF, 0.0, 10.0 }, + { INF, INF, INF, INF, INF, 10.0, 3.0, INF, 12.0, 0.0 } }; Map, Vertex>, Double> expected = fromMatrix(undirectedGraph, distances); @@ -232,21 +230,21 @@ public void floydWarshall_WhenDirectedGraph_ThenAllShortestPathsLengths() public void floydWarshall_WhenNegativeEdge_ThenEdgeIncluded() { // given - double[][] distances = {{0.0, 4.0, INF, 9.0, 11.0, 12.0, 16.0, 14.0, 14.0, 24.0}, - {8.0, 0.0, INF, 5.0, 7.0, 8.0, 12.0, 10.0, 10.0, 20.0}, - {7.0, 11.0, 0.0, 4.0, 6.0, 7.0, 8.0, 9.0, 9.0, 19.0}, - {3.0, 7.0, INF, 0.0, 14.0, 7.0, 11.0, 5.0, 9.0, 19.0}, - {1.0, 5.0, INF, -2.0, 0.0, 1.0, 5.0, 3.0, 3.0, 13.0}, - {0.0, 4.0, INF, -3.0, 11.0, 0.0, 4.0, 2.0, 2.0, 12.0}, - {7.0, 11.0, INF, 4.0, 18.0, 7.0, 0.0, 9.0, 9.0, 19.0}, - {2.0, 6.0, INF, -1.0, 13.0, 2.0, 6.0, 0.0, 4.0, 14.0}, - {-2.0, 2.0, INF, -5.0, 9.0, 2.0, 6.0, 0.0, 0.0, 10.0}, - {10.0, 14.0, INF, 7.0, 21.0, 10.0, 3.0, 12.0, 12.0, 0.0}}; + double[][] distances = { { 0.0, 4.0, INF, 9.0, 11.0, 12.0, 16.0, 14.0, 14.0, 24.0 }, + { 8.0, 0.0, INF, 5.0, 7.0, 8.0, 12.0, 10.0, 10.0, 20.0 }, + { 7.0, 11.0, 0.0, 4.0, 6.0, 7.0, 8.0, 9.0, 9.0, 19.0 }, + { 3.0, 7.0, INF, 0.0, 14.0, 7.0, 11.0, 5.0, 9.0, 19.0 }, + { 1.0, 5.0, INF, -2.0, 0.0, 1.0, 5.0, 3.0, 3.0, 13.0 }, + { 0.0, 4.0, INF, -3.0, 11.0, 0.0, 4.0, 2.0, 2.0, 12.0 }, + { 7.0, 11.0, INF, 4.0, 18.0, 7.0, 0.0, 9.0, 9.0, 19.0 }, + { 2.0, 6.0, INF, -1.0, 13.0, 2.0, 6.0, 0.0, 4.0, 14.0 }, + { -2.0, 2.0, INF, -5.0, 9.0, 2.0, 6.0, 0.0, 0.0, 10.0 }, + { 10.0, 14.0, INF, 7.0, 21.0, 10.0, 3.0, 12.0, 12.0, 0.0 } }; Map, Vertex>, Double> expected = fromMatrix(undirectedGraph, distances); directedGraph.addEdgeBetween(directedGraph.getVertex(8), directedGraph.getVertex(3), - new Weight(-5.0)); + new Weight(-5.0)); // when Map, Vertex>, Double> result = @@ -260,20 +258,19 @@ public void floydWarshall_WhenNegativeEdge_ThenEdgeIncluded() public void floydWarshall_WhenUndirectedGraph_ThenAllShortestPathsLengths() { // given - double[][] distances = {{0.0, 4.0, INF, 3.0, 11.0, 10.0, INF, 8.0, 12.0, INF}, - {4.0, 0.0, INF, 7.0, 7.0, 8.0, INF, 10.0, 10.0, INF}, - {INF, INF, 0.0, INF, INF, INF, 8.0, INF, INF, 11.0}, - {3.0, 7.0, INF, 0.0, 8.0, 7.0, INF, 5.0, 9.0, INF}, - {11.0, 7.0, INF, 8.0, 0.0, 1.0, INF, 3.0, 3.0, INF}, - {10, 8, INF, 7.0, 1.0, 0.0, INF, 2.0, 2.0, INF}, - {INF, INF, 8.0, INF, INF, INF, 0.0, INF, INF, 3.0}, - {8.0, 10.0, INF, 5.0, 3.0, 2.0, INF, 0.0, 4.0, INF}, - {12.0, 10.0, INF, 9.0, 3.0, 2.0, INF, 4.0, 0.0, INF}, - {INF, INF, 11.0, INF, INF, INF, 3.0, INF, INF, 0.0}}; + double[][] distances = { { 0.0, 4.0, INF, 3.0, 11.0, 10.0, INF, 8.0, 12.0, INF }, + { 4.0, 0.0, INF, 7.0, 7.0, 8.0, INF, 10.0, 10.0, INF }, + { INF, INF, 0.0, INF, INF, INF, 8.0, INF, INF, 11.0 }, + { 3.0, 7.0, INF, 0.0, 8.0, 7.0, INF, 5.0, 9.0, INF }, + { 11.0, 7.0, INF, 8.0, 0.0, 1.0, INF, 3.0, 3.0, INF }, + { 10, 8, INF, 7.0, 1.0, 0.0, INF, 2.0, 2.0, INF }, + { INF, INF, 8.0, INF, INF, INF, 0.0, INF, INF, 3.0 }, + { 8.0, 10.0, INF, 5.0, 3.0, 2.0, INF, 0.0, 4.0, INF }, + { 12.0, 10.0, INF, 9.0, 3.0, 2.0, INF, 4.0, 0.0, INF }, + { INF, INF, 11.0, INF, INF, INF, 3.0, INF, INF, 0.0 } }; Map, Vertex>, Double> expected = fromMatrix(undirectedGraph, distances); - // when Map, Vertex>, Double> result = ShortestPaths.floydWarshall(undirectedGraph.asDirected()); @@ -284,8 +281,8 @@ public void floydWarshall_WhenUndirectedGraph_ThenAllShortestPathsLengths() // endregion - private Map, Double> fromList( - Graph graph, List distances) + private Map, Double> fromList(Graph graph, + List distances) { Map, Double> map = new HashMap<>(); @@ -295,8 +292,8 @@ private Map, Double> fromList( return map; } - private Map, Vertex>, Double> fromMatrix( - Graph graph, double[][] distances) + private Map, Vertex>, Double> fromMatrix(Graph graph, + double[][] distances) { Map, Vertex>, Double> expected = new HashMap<>(); diff --git a/src/test/java/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java similarity index 89% rename from src/test/java/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java index ad3d073..43e1544 100644 --- a/src/test/java/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/StronglyConnectedComponentsTest.java @@ -1,4 +1,4 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.HashSet; import java.util.List; @@ -7,9 +7,8 @@ import java.util.stream.IntStream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.graphs.DirectedSimpleGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.DirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; // Tests: Algorithm for strongly connected components. public class StronglyConnectedComponentsTest @@ -43,10 +42,10 @@ public void findScc_WhenManyComponents_ThenAllListed() Assertions.assertThat(result) .containsExactlyInAnyOrder( Set.of(graph.getVertex(0), graph.getVertex(1), graph.getVertex(3), - graph.getVertex(4)), Set.of(graph.getVertex(2)), + graph.getVertex(4)), Set.of(graph.getVertex(2)), Set.of(graph.getVertex(5)), Set.of(graph.getVertex(6), graph.getVertex(7), graph.getVertex(8), - graph.getVertex(9))); + graph.getVertex(9))); } @Test @@ -84,7 +83,6 @@ public void findScc_WhenEmptyGraph_ThenEachVertexIsComponent() // then Assertions.assertThat(result) .containsExactlyInAnyOrder(Set.of(graph.getVertex(0)), Set.of(graph.getVertex(1)), - Set.of(graph.getVertex(2)), - Set.of(graph.getVertex(3))); + Set.of(graph.getVertex(2)), Set.of(graph.getVertex(3))); } } diff --git a/src/test/java/algolib/graphs/algorithms/TopologicalSortingTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSortingTest.java similarity index 86% rename from src/test/java/algolib/graphs/algorithms/TopologicalSortingTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSortingTest.java index 93ebad4..7b77060 100644 --- a/src/test/java/algolib/graphs/algorithms/TopologicalSortingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TopologicalSortingTest.java @@ -1,14 +1,13 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.graphs.DirectedGraph; -import algolib.graphs.DirectedSimpleGraph; -import algolib.graphs.Vertex; +import com.github.refhumbold.algolib.graphs.DirectedGraph; +import com.github.refhumbold.algolib.graphs.DirectedSimpleGraph; +import com.github.refhumbold.algolib.graphs.Vertex; // Tests: Algorithms for topological sorting of a graph. public class TopologicalSortingTest @@ -39,7 +38,7 @@ public void inputsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder() // then Assertions.assertThat(result) .containsExactly(graph.getVertex(3), graph.getVertex(5), graph.getVertex(1), - graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)); + graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)); } @Test @@ -107,13 +106,13 @@ public void dfsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder() // then Assertions.assertThat(result) .isIn(List.of(graph.getVertex(3), graph.getVertex(5), graph.getVertex(1), - graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)), - List.of(graph.getVertex(5), graph.getVertex(3), graph.getVertex(1), - graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)), - List.of(graph.getVertex(3), graph.getVertex(5), graph.getVertex(1), - graph.getVertex(0), graph.getVertex(4), graph.getVertex(2)), - List.of(graph.getVertex(5), graph.getVertex(3), graph.getVertex(1), - graph.getVertex(0), graph.getVertex(4), graph.getVertex(2))); + graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)), + List.of(graph.getVertex(5), graph.getVertex(3), graph.getVertex(1), + graph.getVertex(0), graph.getVertex(2), graph.getVertex(4)), + List.of(graph.getVertex(3), graph.getVertex(5), graph.getVertex(1), + graph.getVertex(0), graph.getVertex(4), graph.getVertex(2)), + List.of(graph.getVertex(5), graph.getVertex(3), graph.getVertex(1), + graph.getVertex(0), graph.getVertex(4), graph.getVertex(2))); } @Test diff --git a/src/test/java/algolib/graphs/algorithms/TreeDiameterTest.java b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameterTest.java similarity index 93% rename from src/test/java/algolib/graphs/algorithms/TreeDiameterTest.java rename to src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameterTest.java index 67b6292..a990784 100644 --- a/src/test/java/algolib/graphs/algorithms/TreeDiameterTest.java +++ b/src/test/java/com/github/refhumbold/algolib/graphs/algorithms/TreeDiameterTest.java @@ -1,10 +1,9 @@ -package algolib.graphs.algorithms; +package com.github.refhumbold.algolib.graphs.algorithms; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import algolib.graphs.TreeGraph; -import algolib.graphs.properties.Weighted; +import com.github.refhumbold.algolib.graphs.TreeGraph; +import com.github.refhumbold.algolib.graphs.properties.Weighted; // Tests: Algorithm for computing diameter of a tree. public class TreeDiameterTest diff --git a/src/test/java/algolib/maths/EquationSystemTest.java b/src/test/java/com/github/refhumbold/algolib/maths/EquationSystemTest.java similarity index 65% rename from src/test/java/algolib/maths/EquationSystemTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/EquationSystemTest.java index edc92d3..14996dc 100644 --- a/src/test/java/algolib/maths/EquationSystemTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/EquationSystemTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -10,9 +10,9 @@ public class EquationSystemTest public void toString_ThenStringRepresentation() { // given - var testObject = EquationSystem.of(Equation.of(new double[]{2.0, 3.0, -2.0}, 15), - Equation.of(new double[]{7.0, -1.0, 0.0}, 4), - Equation.of(new double[]{-1.0, 6.0, 4.0}, 9)); + var testObject = EquationSystem.of(Equation.of(new double[]{ 2.0, 3.0, -2.0 }, 15), + Equation.of(new double[]{ 7.0, -1.0, 0.0 }, 4), + Equation.of(new double[]{ -1.0, 6.0, 4.0 }, 9)); // when String result = testObject.toString(); @@ -20,7 +20,7 @@ public void toString_ThenStringRepresentation() // then Assertions.assertThat(result) .isEqualTo("{ 2 x_0 + 3 x_1 + -2 x_2 = 15 ; 7 x_0 + -1 x_1 = 4 ; " - + "-1 x_0 + 6 x_1 + 4 x_2 = 9 }"); + + "-1 x_0 + 6 x_1 + 4 x_2 = 9 }"); } @Test @@ -28,9 +28,8 @@ public void solve_WhenSingleSolution_ThenSolution() throws Exception { // given - var testObject = EquationSystem.of(Equation.of(new double[]{2, 3, -2}, 15), - Equation.of(new double[]{7, -1, 0}, 4), - Equation.of(new double[]{-1, 6, 4}, 9)); + var testObject = EquationSystem.of(Equation.of(new double[]{ 2, 3, -2 }, 15), + Equation.of(new double[]{ 7, -1, 0 }, 4), Equation.of(new double[]{ -1, 6, 4 }, 9)); // whens double[] result = testObject.solve(); @@ -38,45 +37,44 @@ public void solve_WhenSingleSolution_ThenSolution() // then Assertions.assertThat(result).containsExactly(1, 3, -2); Assertions.assertThat(testObject.hasSolution(result)).isTrue(); - Assertions.assertThat(testObject.hasSolution(new double[]{-2, -18, -36.5})).isFalse(); + Assertions.assertThat(testObject.hasSolution(new double[]{ -2, -18, -36.5 })).isFalse(); } @Test public void solve_WhenNoSolution_ThenNoSolutionException() { // given - var testObject = EquationSystem.of(Equation.of(new double[]{2, 3, -2}, 15), - Equation.of(new double[]{7, -1, 0}, 4), - Equation.of(new double[]{-1, -1.5, 1}, -1)); + var testObject = EquationSystem.of(Equation.of(new double[]{ 2, 3, -2 }, 15), + Equation.of(new double[]{ 7, -1, 0 }, 4), + Equation.of(new double[]{ -1, -1.5, 1 }, -1)); // then Assertions.assertThatThrownBy(testObject::solve).isInstanceOf(NoSolutionException.class); - Assertions.assertThat(testObject.hasSolution(new double[]{1, 3, -2})).isFalse(); - Assertions.assertThat(testObject.hasSolution(new double[]{-2, -18, -36.5})).isFalse(); + Assertions.assertThat(testObject.hasSolution(new double[]{ 1, 3, -2 })).isFalse(); + Assertions.assertThat(testObject.hasSolution(new double[]{ -2, -18, -36.5 })).isFalse(); } @Test public void solve_WhenInfiniteSolutions_ThenInfiniteSolutionsException() { // given - var testObject = EquationSystem.of(Equation.of(new double[]{2, 3, -2}, 15), - Equation.of(new double[]{7, -1, 0}, 4), - Equation.of(new double[]{4, 6, -4}, 30)); + var testObject = EquationSystem.of(Equation.of(new double[]{ 2, 3, -2 }, 15), + Equation.of(new double[]{ 7, -1, 0 }, 4), + Equation.of(new double[]{ 4, 6, -4 }, 30)); // then Assertions.assertThatThrownBy(testObject::solve) .isInstanceOf(InfiniteSolutionsException.class); - Assertions.assertThat(testObject.hasSolution(new double[]{1, 3, -2})).isTrue(); - Assertions.assertThat(testObject.hasSolution(new double[]{-2, -18, -36.5})).isTrue(); + Assertions.assertThat(testObject.hasSolution(new double[]{ 1, 3, -2 })).isTrue(); + Assertions.assertThat(testObject.hasSolution(new double[]{ -2, -18, -36.5 })).isTrue(); } @Test public void swap_ThenEquationsSwapped() { // given - var testObject = EquationSystem.of(Equation.of(new double[]{2, 3, -2}, 15), - Equation.of(new double[]{7, -1, 0}, 4), - Equation.of(new double[]{-1, 6, 4}, 9)); + var testObject = EquationSystem.of(Equation.of(new double[]{ 2, 3, -2 }, 15), + Equation.of(new double[]{ 7, -1, 0 }, 4), Equation.of(new double[]{ -1, 6, 4 }, 9)); // when testObject.swap(0, 2); diff --git a/src/test/java/algolib/maths/EquationTest.java b/src/test/java/com/github/refhumbold/algolib/maths/EquationTest.java similarity index 91% rename from src/test/java/algolib/maths/EquationTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/EquationTest.java index 54a18b0..7d4b2f5 100644 --- a/src/test/java/algolib/maths/EquationTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/EquationTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; @@ -13,7 +13,7 @@ public class EquationTest @BeforeEach public void setUp() { - testObject = Equation.of(new double[]{2, 3, 0, -2.5}, 15); + testObject = Equation.of(new double[]{ 2, 3, 0, -2.5 }, 15); } @AfterEach @@ -39,7 +39,7 @@ public void negate_ThenNegated() public void add_ThenAddingEquations() { // when - Equation result = testObject.add(Equation.of(new double[]{1, -1, 4, 10}, 5)); + Equation result = testObject.add(Equation.of(new double[]{ 1, -1, 4, 10 }, 5)); // then Assertions.assertThat(result.getCoefficients()) @@ -52,7 +52,7 @@ public void add_ThenAddingEquations() public void subtract_ThenSubtractingEquations() { // when - Equation result = testObject.subtract(Equation.of(new double[]{1, -1, 4, 10}, 5)); + Equation result = testObject.subtract(Equation.of(new double[]{ 1, -1, 4, 10 }, 5)); // then Assertions.assertThat(result.getCoefficients()) @@ -115,7 +115,7 @@ public void toString_ThenStringRepresentation() public void hasSolution_WhenSolution_ThenTrue() { // when - boolean result = testObject.hasSolution(new double[]{10, 10, -29, 14}); + boolean result = testObject.hasSolution(new double[]{ 10, 10, -29, 14 }); // then Assertions.assertThat(result).isTrue(); @@ -125,7 +125,7 @@ public void hasSolution_WhenSolution_ThenTrue() public void hasSolution_WhenNotSolution_ThenFalse() { // when - boolean result = testObject.hasSolution(new double[]{10, 6, -17, 14}); + boolean result = testObject.hasSolution(new double[]{ 10, 6, -17, 14 }); // then Assertions.assertThat(result).isFalse(); diff --git a/src/test/java/algolib/maths/FractionTest.java b/src/test/java/com/github/refhumbold/algolib/maths/FractionTest.java similarity index 99% rename from src/test/java/algolib/maths/FractionTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/FractionTest.java index 159520c..89b8307 100644 --- a/src/test/java/algolib/maths/FractionTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/FractionTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/algolib/maths/IntegersTest.java b/src/test/java/com/github/refhumbold/algolib/maths/IntegersTest.java similarity index 99% rename from src/test/java/algolib/maths/IntegersTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/IntegersTest.java index 6413de2..95eefbc 100644 --- a/src/test/java/algolib/maths/IntegersTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/IntegersTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/algolib/maths/PrimesSearchingTest.java b/src/test/java/com/github/refhumbold/algolib/maths/PrimesSearchingTest.java similarity index 70% rename from src/test/java/algolib/maths/PrimesSearchingTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/PrimesSearchingTest.java index 510fcfa..c72be53 100644 --- a/src/test/java/algolib/maths/PrimesSearchingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/PrimesSearchingTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import java.util.Arrays; import java.util.Collection; @@ -15,15 +15,16 @@ public class PrimesSearchingTest { private static final int[] Primes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, - 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, - 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, - 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, - 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, - 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, - 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, - 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, - 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, - 941, 947, 953, 967, 971, 977, 983, 991, 997 }; + 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, + 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, + 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, + 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, + 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, + 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, + 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, + 991, 997 }; @Test public void findPrimes_WhenSingleArgument_ThenMinIsZero() diff --git a/src/test/java/algolib/maths/PrimesTestingTest.java b/src/test/java/com/github/refhumbold/algolib/maths/PrimesTestingTest.java similarity index 98% rename from src/test/java/algolib/maths/PrimesTestingTest.java rename to src/test/java/com/github/refhumbold/algolib/maths/PrimesTestingTest.java index a1d3467..8906d5a 100644 --- a/src/test/java/algolib/maths/PrimesTestingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/maths/PrimesTestingTest.java @@ -1,4 +1,4 @@ -package algolib.maths; +package com.github.refhumbold.algolib.maths; import org.assertj.core.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/algolib/sequences/LongestCommonSubsequenceTest.java b/src/test/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequenceTest.java similarity index 91% rename from src/test/java/algolib/sequences/LongestCommonSubsequenceTest.java rename to src/test/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequenceTest.java index 5a31601..faf5014 100644 --- a/src/test/java/algolib/sequences/LongestCommonSubsequenceTest.java +++ b/src/test/java/com/github/refhumbold/algolib/sequences/LongestCommonSubsequenceTest.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.Collections; import java.util.List; @@ -94,9 +94,7 @@ public void countLcsLength_WhenSameElementSequence_ThenShorterLength() // when int result = LongestCommonSubsequence.countLcsLength(sequence, - Stream.concat(sequence.stream(), - sequence.stream()) - .collect(Collectors.toList())); + Stream.concat(sequence.stream(), sequence.stream()).collect(Collectors.toList())); // then Assertions.assertThat(result).isEqualTo(sequence.size()); diff --git a/src/test/java/algolib/sequences/LongestIncreasingSubsequenceTest.java b/src/test/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequenceTest.java similarity index 87% rename from src/test/java/algolib/sequences/LongestIncreasingSubsequenceTest.java rename to src/test/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequenceTest.java index 2713353..b295a8e 100644 --- a/src/test/java/algolib/sequences/LongestIncreasingSubsequenceTest.java +++ b/src/test/java/com/github/refhumbold/algolib/sequences/LongestIncreasingSubsequenceTest.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.Collection; import java.util.List; @@ -28,7 +28,7 @@ public void findLis_WhenDecreasing_ThenLastElementOnly() // when Collection result = LongestIncreasingSubsequence.findLis(List.of(12, 10, 8, 6, 4, 2), - Integer::compareTo); + Integer::compareTo); // then Assertions.assertThat(result).containsExactly(2); @@ -40,7 +40,7 @@ public void findLis_WhenMultipleSubsequences_ThenLeastLexicographically() // when Collection result = LongestIncreasingSubsequence.findLis(List.of(2, 1, 4, 3, 6, 5, 8, 7, 10), - Integer::compareTo); + Integer::compareTo); // then Assertions.assertThat(result).containsExactly(1, 3, 5, 7, 10); @@ -52,7 +52,7 @@ public void findLis_WhenSearchInMiddle_ThenLeastLexicographically() // when Collection result = LongestIncreasingSubsequence.findLis(List.of(0, 2, 4, 6, 8, 3, 5, 7, 8), - Integer::compareTo); + Integer::compareTo); // then Assertions.assertThat(result).containsExactly(0, 2, 3, 5, 7, 8); @@ -64,7 +64,7 @@ public void findLis_WhenIncreasingAndReversedComparator_ThenLastElementOnly() // when Collection result = LongestIncreasingSubsequence.findLis(List.of(1, 3, 5, 7, 9, 11, 13, 15), - (i1, i2) -> i2.compareTo(i1)); + (i1, i2) -> i2.compareTo(i1)); // then Assertions.assertThat(result).containsExactly(15); diff --git a/src/test/java/algolib/sequences/MaximumSubarrayTest.java b/src/test/java/com/github/refhumbold/algolib/sequences/MaximumSubarrayTest.java similarity index 98% rename from src/test/java/algolib/sequences/MaximumSubarrayTest.java rename to src/test/java/com/github/refhumbold/algolib/sequences/MaximumSubarrayTest.java index d01d341..f21c2dc 100644 --- a/src/test/java/algolib/sequences/MaximumSubarrayTest.java +++ b/src/test/java/com/github/refhumbold/algolib/sequences/MaximumSubarrayTest.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.List; import org.assertj.core.api.Assertions; diff --git a/src/test/java/algolib/sequences/SortingTest.java b/src/test/java/com/github/refhumbold/algolib/sequences/SortingTest.java similarity index 97% rename from src/test/java/algolib/sequences/SortingTest.java rename to src/test/java/com/github/refhumbold/algolib/sequences/SortingTest.java index e2c32b3..4b304e0 100644 --- a/src/test/java/algolib/sequences/SortingTest.java +++ b/src/test/java/com/github/refhumbold/algolib/sequences/SortingTest.java @@ -1,4 +1,4 @@ -package algolib.sequences; +package com.github.refhumbold.algolib.sequences; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/algolib/structures/AvlTreeTest.java b/src/test/java/com/github/refhumbold/algolib/structures/AvlTreeTest.java similarity index 99% rename from src/test/java/algolib/structures/AvlTreeTest.java rename to src/test/java/com/github/refhumbold/algolib/structures/AvlTreeTest.java index 784c5e5..060de47 100644 --- a/src/test/java/algolib/structures/AvlTreeTest.java +++ b/src/test/java/com/github/refhumbold/algolib/structures/AvlTreeTest.java @@ -1,4 +1,4 @@ -package algolib.structures; +package com.github.refhumbold.algolib.structures; import java.util.*; import java.util.stream.Collectors; diff --git a/src/test/java/algolib/structures/DisjointSetsTest.java b/src/test/java/com/github/refhumbold/algolib/structures/DisjointSetsTest.java similarity index 99% rename from src/test/java/algolib/structures/DisjointSetsTest.java rename to src/test/java/com/github/refhumbold/algolib/structures/DisjointSetsTest.java index ff5e877..a9fe800 100644 --- a/src/test/java/algolib/structures/DisjointSetsTest.java +++ b/src/test/java/com/github/refhumbold/algolib/structures/DisjointSetsTest.java @@ -1,4 +1,4 @@ -package algolib.structures; +package com.github.refhumbold.algolib.structures; import java.util.List; import java.util.NoSuchElementException; @@ -384,12 +384,10 @@ public void unionSet_WhenDifferentSetsInChain_ThenSameRepresent() int first = present.get(0); int last = present.get(present.size() - 1); - // when for(int i = 1; i < present.size(); ++i) testObject.unionSet(present.get(i - 1), present.get(i)); - // then Assertions.assertThat(testObject.isSameSet(first, last)).isTrue(); Assertions.assertThat(testObject.findSet(last)).isEqualTo(testObject.findSet(first)); diff --git a/src/test/java/algolib/structures/heaps/DoubleHeapTest.java b/src/test/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeapTest.java similarity index 99% rename from src/test/java/algolib/structures/heaps/DoubleHeapTest.java rename to src/test/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeapTest.java index e05b93a..42f1f09 100644 --- a/src/test/java/algolib/structures/heaps/DoubleHeapTest.java +++ b/src/test/java/com/github/refhumbold/algolib/structures/heaps/DoubleHeapTest.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.*; import org.assertj.core.api.Assertions; diff --git a/src/test/java/algolib/structures/heaps/LeftistHeapTest.java b/src/test/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeapTest.java similarity index 99% rename from src/test/java/algolib/structures/heaps/LeftistHeapTest.java rename to src/test/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeapTest.java index 85bd3ad..31ee020 100644 --- a/src/test/java/algolib/structures/heaps/LeftistHeapTest.java +++ b/src/test/java/com/github/refhumbold/algolib/structures/heaps/LeftistHeapTest.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/test/java/algolib/structures/heaps/PairingHeapTest.java b/src/test/java/com/github/refhumbold/algolib/structures/heaps/PairingHeapTest.java similarity index 99% rename from src/test/java/algolib/structures/heaps/PairingHeapTest.java rename to src/test/java/com/github/refhumbold/algolib/structures/heaps/PairingHeapTest.java index 12b1714..0947a6b 100644 --- a/src/test/java/algolib/structures/heaps/PairingHeapTest.java +++ b/src/test/java/com/github/refhumbold/algolib/structures/heaps/PairingHeapTest.java @@ -1,4 +1,4 @@ -package algolib.structures.heaps; +package com.github.refhumbold.algolib.structures.heaps; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/test/java/algolib/text/BaseWordsMapTest.java b/src/test/java/com/github/refhumbold/algolib/text/BaseWordsMapTest.java similarity index 97% rename from src/test/java/algolib/text/BaseWordsMapTest.java rename to src/test/java/com/github/refhumbold/algolib/text/BaseWordsMapTest.java index 92be66b..168466a 100644 --- a/src/test/java/algolib/text/BaseWordsMapTest.java +++ b/src/test/java/com/github/refhumbold/algolib/text/BaseWordsMapTest.java @@ -1,10 +1,9 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import algolib.tuples.Pair; +import com.github.refhumbold.algolib.tuples.Pair; // Tests: Structure of base words map using Karp-Miller-Rosenberg algorithm. public class BaseWordsMapTest diff --git a/src/test/java/algolib/text/EditDistanceTest.java b/src/test/java/com/github/refhumbold/algolib/text/EditDistanceTest.java similarity index 99% rename from src/test/java/algolib/text/EditDistanceTest.java rename to src/test/java/com/github/refhumbold/algolib/text/EditDistanceTest.java index ce7249e..f2e2503 100644 --- a/src/test/java/algolib/text/EditDistanceTest.java +++ b/src/test/java/com/github/refhumbold/algolib/text/EditDistanceTest.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import org.assertj.core.api.Assertions; import org.assertj.core.data.Offset; diff --git a/src/test/java/algolib/text/KnuthMorrisPrattTest.java b/src/test/java/com/github/refhumbold/algolib/text/KnuthMorrisPrattTest.java similarity index 98% rename from src/test/java/algolib/text/KnuthMorrisPrattTest.java rename to src/test/java/com/github/refhumbold/algolib/text/KnuthMorrisPrattTest.java index 41a27d7..eb82884 100644 --- a/src/test/java/algolib/text/KnuthMorrisPrattTest.java +++ b/src/test/java/com/github/refhumbold/algolib/text/KnuthMorrisPrattTest.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.List; import org.assertj.core.api.Assertions; diff --git a/src/test/java/algolib/text/SuffixArrayTest.java b/src/test/java/com/github/refhumbold/algolib/text/SuffixArrayTest.java similarity index 98% rename from src/test/java/algolib/text/SuffixArrayTest.java rename to src/test/java/com/github/refhumbold/algolib/text/SuffixArrayTest.java index b6583c0..14919bd 100644 --- a/src/test/java/algolib/text/SuffixArrayTest.java +++ b/src/test/java/com/github/refhumbold/algolib/text/SuffixArrayTest.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/algolib/text/TrieTest.java b/src/test/java/com/github/refhumbold/algolib/text/TrieTest.java similarity index 99% rename from src/test/java/algolib/text/TrieTest.java rename to src/test/java/com/github/refhumbold/algolib/text/TrieTest.java index de163fc..96c2d00 100644 --- a/src/test/java/algolib/text/TrieTest.java +++ b/src/test/java/com/github/refhumbold/algolib/text/TrieTest.java @@ -1,4 +1,4 @@ -package algolib.text; +package com.github.refhumbold.algolib.text; import java.util.List; import java.util.stream.Stream; diff --git a/src/test/java/algolib/tuples/ComparablePairTest.java b/src/test/java/com/github/refhumbold/algolib/tuples/ComparablePairTest.java similarity index 98% rename from src/test/java/algolib/tuples/ComparablePairTest.java rename to src/test/java/com/github/refhumbold/algolib/tuples/ComparablePairTest.java index af05228..5c20615 100644 --- a/src/test/java/algolib/tuples/ComparablePairTest.java +++ b/src/test/java/com/github/refhumbold/algolib/tuples/ComparablePairTest.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/algolib/tuples/ComparableTripleTest.java b/src/test/java/com/github/refhumbold/algolib/tuples/ComparableTripleTest.java similarity index 98% rename from src/test/java/algolib/tuples/ComparableTripleTest.java rename to src/test/java/com/github/refhumbold/algolib/tuples/ComparableTripleTest.java index cc2ebcd..fac39e7 100644 --- a/src/test/java/algolib/tuples/ComparableTripleTest.java +++ b/src/test/java/com/github/refhumbold/algolib/tuples/ComparableTripleTest.java @@ -1,4 +1,4 @@ -package algolib.tuples; +package com.github.refhumbold.algolib.tuples; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; From c4f305799df50f1018592f186ca1af13a61aba0b Mon Sep 17 00:00:00 2001 From: "R. Kaleta" Date: Sun, 2 Nov 2025 01:30:02 +0100 Subject: [PATCH 4/4] Update gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 12 +++++++----- gradlew.bat | 6 ++++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 34753 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%0AF=STgWRWL+V z@>1pgp>m&9VHTw)vU3U^!!mReblgs;Yv>raFqN3!U17;V;>6w4i%S7O_Er!%;r#$U zI6Wf+)@?f&2>p2E`5Dwy z-Zi+aub*}-7VmbprAl?;>FJb{di4X~zt5UM87k$hP$P;aHc(+~YWm>H#f6R_(NGr) z&hdEcM%AUjz==_5K}2ZfI;e^;=0kDT;;l+?K;bv)sY(`*h7H=-or*vHYY3^tB0G%b z5ar>y@ZG>`{L?f2`Gv6M;@)|KvSq(&L6uGzmYB?}V(tWy)XG9xt3W)eV zWhmOY?CJUR-96SBoH-04_qS;^W;cdO9+X!T2wTh$u`bKOh5m0|)p~<|7t2 z`7JcV%Fx5BtDf4<$&tC$q|0s=*yQiQ0jH?ks32dY1&S4sT!rHoEgA?3ZqYbhwJcW= zOIILCepk|QfL2lwAh(K-K`t-gXP63i%_?d88#_)wUcFskVgjUPZ7Km7k5N*|@qtEy zs)xmA2rtOmxK4}ivC@%u^Lxl+0@QRPV<5GS)C_EfEyO54J&GgSyXLK{3kT^B)YCn}W6)yiyf?l(Ov%1p3EXzZGz?iV^2uabYl&~(VCc2jFE zE^}rmoZm|0{RHG6q&vtBM?f}NzFnXp>7PcZk<90)By!e3jc8zSw$!tDkxRW~6l1i00WYC_mIKUiSP&?H=8AonYZ^x-R)?V>CZyQ@O z=F`#D(Syvntf~9k+3(it_1Fq`?iqMae(22W;Jjttw*&09tMDdIB;zgr7Fo07>qtub zd!b>ErohUi^u8jBGs6Q+n8(0JbN=ZCMII(Z7(`-PtVHz6enI*{2+BV>&qH> zRl4@TmLW1Tr@LI1P+2DZ%IaAhYL(*}QBgc%)osE==lE=uZvydx+vJ*Kf=B1vIQtT_ z)ws$eC8l2;f(B9reEY8HVD%kaJlB|iqRZ?gE;W2NM4zz_T*a{ zlT&3d5EFVqVjESmPI4%TJcymM_DowIeOeg0gKbp*WYHt;5k5ayvFvi8vU98{h@K`4 z&eE|;WRXqft}ULLhSNLZ6;9>Z5z)zdQcA2$$l%bkDIap9Xlmb5Rq6<=OI;18IRs%r0)OE;@U|-)YwxuJyzX~7$e{635}lGa{xUdrO~Q0ukElvNrw9G|Z)O_5~VZWw-meSfR5 zeW?zWG;%q0g|1o$KMYHUhCzb}ypf&8Dm0p9vW$pv0chwr@37-TVLN-X?P^)6JI~yQ zmWUNUW>8loWc2*qtyUX*c6;^e!o%^yNJ1#Tm$og#b<)yzH6k>z*={iVm7I8ir!WLG z`FqRR+=~)Tl>|pxmz5Q&4r#j85{qAgAX9F58ni`|6>O3j)5e8tL+SFyoKivS?qaRM zhO8)=4-i%KGkr@+$4k}FNCsbIeW8x(iE<8;o6p?%lbD&GKxx>EzokDabD9eD=aOdE zy^+>m{)j`S^VS<525CiYaK!PhS;a|%h0dFj9v^+#UeV8t-62xhqgpM{E9w%O0bF>P zchG+kc(;>O5lpvlBDw7860OK+U?|+OTQ$cO2b@~UO{198{oUiltu+Fv058EaUpsP~ zu9nW23p1iATUH#{LpNTj7>T;YDT+n?{p~DGi_bH|7b*5Tcts4a2dSMnTD@iz8Lb@^ zwt3|`is%q&8GU6*B{ZHng*#p`cQkMxApCXOsXQ+XSWwW1jsZ29wWo$M6t0oj=f`aYQ* zede3V)o1ClN;h~FXE99;)#YtmI%qu;Zm0G>vAohO0c%aZO-q=u+FnIeEWf_99<*_f zC=2w&64d!UDY8@Sr>1q$ZNA5*OcjP8@A|F|1qsM}e+a$-j}oW~wO2iT&-T6v%e z?7=X#XO@gze2EU=Ulbn{SD;ztr%y(XtfldJ2=}7KXhUmzCTu+5^NLB$o01hG1Dnq8 zdOjZ?N!5IQ)KE!s0>!SAi6U!pR30I`39}thf7#X2*VOi5hCCeJ0ni!iXD&aknmO~@ zeF^q;0~dJ#3c@qhPQl^$F=!fmQZgX1`dfmtUaZ~U;?Uk5=N85+S*52vv&ViJk6_nk z6gQ^~c-2nvsT31?9n&-sv*T7191zLkmD>>Ut^KF9?Zg_~EN9YJI*^su<~ja^-x5i{ zU~a?>)VrtcN`enM@E(ljT!m2?d&Vhu9Ev`E7_X7vv*&=b-Pd8NpNk!<=?jhiMW`@W zc6MT(HGUGMyOH7L+A-D2X*D=-dj5g`IrQ*FUh9@|D?6#y$-wx*h|U!e8a!upE+Su! z?}c2(DT#g<6atCUHO6Rf>a`h>SybDp*iQz9vU{Z5eoF}k#NAjv*XF%!i|FnAY_&bk z$Uyc>&?qYiQ?PcGh*?z+O4ZBDoW|B|weqrlj0iVQASVwSOS)c@S-`!PGxu^onhsaC z1}pNMMv%+kGO?V7q+$|FVwovF$gAj-m}i$;5lz2|wo)n5ly%3&;1WS)Ic)4CtS79A zSX+c{Kd9*iB6!PNZ_A#{X-$-87>-aJl*T|)V#nCpNlfdAF%&(gJG19y_AL${sBgLT zRju|o>*F%Or#M*E$h`4t%kqhZE1N)Rc zF=V3f3YSh26RR{yL!s)^N|pxZSIGBcuvz4HFxb6-LrRhqYh!GVX00_CQ_=Uf>d_ss zO-W%Avh*Far)XQ^E@)b zUa50{%#PUc1Y_{_Lgn{L@>k)2-<2Yn>@P4sO{}NvWox&hBYN#8A3T4WJR%)!Lw(W+ zksTGE@@`0yJGmRE^94ZUr<@7NDj4m4w-#Q)6DdnRDL_j}W}ojtlgI6k5K=92)E2<8 zR<=Boz?+jTHV~r>W(k=?;kH0J4%U7uaP0jH2u;y9q9#UDoluFcSBm7zxn{`AI^YdX z8iK?_@CByf!C)+x%r5YUX(~E#R0KzhfsE0aCy{kaglWu%9$0JAiI zk5E+Hl4wBax>S*HG@~qo-%Uj1!07nVb+~=E$HO#In&O=r6o6VZKg2&JVUTOzvrYpE zAaw051XL(=5#*vu0-J=hvBmFy$^0co$%LXGzF>F;OWl$l5qH&@SuP{dx|yOJnh2^2L)kx!1&Fuo*Ik;O^3hf+cGdvcY=BQj`QllJRgxG>heXSL-1!>;OM@L}2 ztwpp%l49m_P675s}bq4KoK>>Lnab8&=?*XhqyfFs&)05vH zdLvJHaPJzlSsc0!Gah7l&x%nZD&%P-u@R@JT#%+rMkf7Q9~|v~hipbfKqvbH1>N)` zEKTZ7#2BN^UVzJsp~5HF%vfHL&f~i@rRKpSmEFO5K~kE8KhG@pud#Sp08>smmbs?^ATecsG0!fmPAyZZXCG>mmONp=AC z+qZV~|33Fsy~K#LHEj5{JX&CK+Ufs(6C3&=goY+0bi=%rZC|(sHrA{kme}rv2N=r# zx!v9E^gM1hbrg|0xoQ>KsO}KLv5=n7Ee^*lC91cVOl%y?#Ix$k6X}b-9A4hClCdkl zGLOfcm{bXtXhmml=FpzZIGXY4sAPj}Ch3A~NfMl{>t(o$t5rfdzLNyTSWIz?V=$}2{(!v9PtiKLg`tp7QSj{kEOk@ztD`xvYR$JpOp!_P3ORCdsHgEU-e7br4 zHtpVhpM5V7J5%d>p12Zj345Fd(C6^DTaF~siFh3)8JX#{>o5<{UD9Fm2$&za&NNn= zZcpQ+xkqK?cR*rDxN)RovoV)$3UAw;;xD_@%xyEXCrqB3NU4~bUQgR^H=BL$oQ@g) z+!dw|g?3j}upgeS6PKM}#9hGYyRaH?a>6)rceTA-ji1CR)yaWDX0Zwce)f%FA*OK! zS~XopxyEpMv0J$2I6c%e4V+%I=qk({1{_#u`zZ@lyC1pQ6y5jEN|EeCl*g3QTf|0T zAuMF5Mt@K>wI)&}HO**p>C7-!R}Qsybiyq!4X?@8{K+Uy*5^x)+HHSxmC-15U0(0B z=z~YnaIdxcM;0lOFlm_uZc@0Hw0XQws3!WVYZ(g0-&zaeV)+H4IiQXX! z2w0qHH-- zdD}SBA(ah14J#ui%4G=^en9Ahez2=FiqhYB%q!t>YTw764w(|-E}3)c)7`Mm z)b!F<4y2$0iXmeN5)lYMO&z_zI?5&4}d}r$w5@sZy2yWl=1itur*j#CE(Su+x&=#Aut&I=D%96 z?_VGR5v|J|ZAl$v=7z`(Rlm5yus1#5YIz5~%EGn5*8iZVjI8SgbD>qt08T9PH{?|B z!G8DSDq>lU5ufdyGL+L!@T|XNW-+T8|bpN=g`Pgv!YY{V@RT0>W_g@!2kYj*IL14J=tV&7Xu=-yQtDJt^~B4@1BXLI3-} zEBwRrAnG*wXQQ@nGn*~d z62&Au@y1|Ypt;lN16JZEgM{Of>6Etotq&Q4`xc!JFXxO#rb)*6O8-cwxTra-5Mf4M z)d1a7$P_Dhc5XV=(w!12KgYz2|79w)PDMJ@?ETX$6@~*9j_86;N@rW9Jnj|y?j}3^ z?MJXs+k{@zxgcEC`*UYcAiR)+I}h~Hc5(7wzxR`uuKORI;t2fUW|$ipyd^+fn3NDI5v(Jc#A;ya#N1}sJP;R*kN0A-Sux0rq>Ae$o3Fl z^h8YZDV*~uy6{T&AVeeMyeTR6KSTr#TAVDc$(4um?rD0}sPvZLtPjM{$3k?eHUeZr z@8qvs8U*V3WDRLouQ34x(w`W<>V+#OEr+JAN^UPIWeu(8*Ga}tu#%kU6b~37p=1RJ zXq^?4Z{D&kY8_UOXV*3lWVbS=!@rl{%q&0r#SMxCL>)?`Cm*QsQR-Fg7S!ljIuQQw z1F`^d&4-Fd@v^_rD@*Ss+&C)SCxEF8@tM_4Eub()Zwkl>DGAeImKYQnpagxQzc%uB z#7$IWRAUtoz5W>c6$aIlbdB_ZhgvBA1$Nc`2aH^DC+_DUKJ)?ySkwh1$`(~1?UUV8;g$;3y2R)MA4&Z zrtG@mb1l|_+CUEyh;BD@&hxl& z)43R+i?|A_AInL;a9Pi_K8YXV$rQ@A>@k*=&}?|Eqc-n>oi#W?Gn3sgNys7WJHzix zspd8}Zwv!f^T#|o)8p{M4k#zwfea&lk)f-Xo*^V%1tlTLLoyNv4uUupr4GO!7%YUs(A#qe8- z4R3GxUp|C_b@T_(I9sPk+1`mKLW&GQ4jgQAk_!x2i<9m?7KI_sC?H_MQ;JYnwhD0| zc7^DYz;l+bLSYRtO+~;rwHqtNGo0xeIl2miEsf2mbM*bbc^*Z1p<*?FX@)207@yNc zG<$b z31yGbcC>7GG9O3+08E5CqId-%|10@mkR3=62;X$C?9sDbwSzkk&eFgp$oh?U{B*Bh zzyEDv`YSY#@LFW5vXR{5)B~c$0S%K)^|;f$)?@!0!J>yi4_>-$`x9qjhmy0u9ns5xv+6A?V17fo!X5Kva zj?TmVpC=yJOJLFd0vQ3PAO>%SCJsIk_&BZN-V0PQfWmw?^ea;9uWw()*3EsMwkA$H z6RxhvUfF-s407d5_o7dwyuiox^E8FC0gF8xJWL3Jq32uIGj#2g)+-?947HmM_25{e zG8QYteGr8$j0G}Wp;vUW^yWus*SX<-VB_~#7J}@M`fXSmfygyz%`dm-!%W6wxtk@G zkOs3tVA)8I_o?ksV+?3>@`!MLtBp^-dZZvf&4!;iRmr~+9Av=YN!-?dqGcl|0WomV zi_gjW)pQCrh}Dd+`@McXA)|6Cla2r)^&dbI3d z5jr9%Z#yrblcoD(ByNnZ`#t0|DI)kx6f=|QFa73tbOX! zuifp?U%zJN_O9Op+rroQln!_gXtfHw?rwtKG_Uqx&(Z9Fh{-OPz@+-)efmy(@(IZa zFm$Ox(q|MmM7N|C?!VZ$vSn{Wu|UH7jh+)f)f~Q$}v8P#m zF%?(AIT2UgxqVmAWwLoI%{iq8bh=q@v}A)_ZvkJ;xda2&XRy`5Gvb4oS~c6Sw!CpH zDAY@phn3WYxBXKZG~^;Oc~(E)ginm`AR#zk_yU)Q*T5iRo@x<5^_yIQ^)nMN{pmLYhuU8CY~Z~B@)`+(p6q7`nQ(`kE9job!3e@0XnBX zcMMMv)E&2i(Mt^vmH2D*9z8MO>I#8%@Xx!iShqt*PdAO~PO%v1B@Bd-Xc@(&ds5;)NkY$H0{cC{{m(1K#ajPZx z>kdK{zj!3482_~4B()43@lMNsdV!1xVRP=k9v0m{{?iLwBI$uQ`F|LO;hy*jVX72o zR9ecKmgc%DF*zJ-S-5a$slZ{JsCSMnK3mL3<;MUfar~fC#lp1bP{cnX*fX=lq>V-t zJRL4aZ`lsy7DqEX20b8EeQ2Eg++HdlMI6OV3jWo#=gT$S1v>dVKl##I|3?Rw!;Kv! z!A4bRHnr8HYXBbi7i0ha)jJ((ENHHiJOn{G6$PZ8gzMcpr*PE*fzJbwwym4>+l zr9cE_7+Rnr`K*iG0F|*;n4ZoVy8W(;rfxZPYxBZJvkm9W=tWSA|DYd}FrTNaQF|qoD_h&0yDUD*Jv>LMg5#TPYmh9Do>4i?qz7!%_)F#r`$ z7gsYoMP~;`GiO&TGZ#rCdsAC8XL=J`BNrDnRfuo@_Ww(1tID`6sH1(_?~B&hN=tqR zX+blwJWJgp7d+>lg<@r;_ngI&6eD=h?oJUi9U~comMxL}g4A-INJ-}XliqMr6M6Oe zRs-GwlHjjw#6_?w{W?xdrQPh`h;yyewG&%dWroZ2YUK3NYZ9t8 zHg9WN>@vUg^fghT1e<8bAmtpU1=T>$l>YwCAg`Z6Yt2@l@=66WoTt9o3|NF^rqE$E z)L3B1#;({ZX+C*Wl649n))Rys+0Bp<)ddNR;3<2<5W@{1zThydZZg5jEQR)eM}uRE z${^-E8FD1z+xgwR8Nh2x{+q5DY=VB$si(eIhXsxT!5>C7B)>An1R|Fau88GnFKj<8 z0&Cki>}f=mQMM$dM-MK28;CUlFQk_LLpm_lHS6t3#aV2uD~@v=tNK&>G7rTgfCD`% zzY&3aM`q6s9lCP>sa{XtgtN*Y-9`SLJDV)fgSc2C*l44JIzV5@Ux=uiEG zR|PA27fe<~3;|@ZA-l|%q$DlXNo?I$5*wUeO$wLCvg4ms0hypuQPDW;r6VgXYVVBy z(KeGN54zH?x2xBn9&|mY{$V%GxgvMh1wD6Eo&lEn(EFWGgf|Wm$Kx?9@imSI9+=TPUfQy&sAz=^tcl$s z(>|-r#o%@hv~M5vghRiG|xKA|9&Xnf8J=9vm;Of{O z8PuJ&@?Z;PA(DmY#3cF(L5^*2X7C4PKqcv9p9IpEX>fA135g@e{-b#A$&q$2)r$&c zZ<#>{IGPr{(+HxECl)n3Tw8W%JHDSmBD>hDq`x}Tt2$YOBJqOS34Ue*pK(+47JDIc z#5gb8$0hf=hBmDe(z1xV9{cg!_LQ;&KYI@k_x@kqo>!IpP1ZkNi9F>0m!vThdn=$4 zzYt?WUXESt?kfqF2Z7JnKKbF%;SBHJ{3!QrujOUDSIIek z^L*`GTuolp?g;pS3PLu2_i68(G!qDe(B`$sAgu`-O5mixs7%f%P*y3o9+Orx=B#B& zRthw#lZ`g5pNu#b?=lXfA*;Z#m9H8bgQ+G1&~rqzljdd8L9PE*4Wyn`M4*bNlP_?Z zW>i^5oko!F+XkLO)&$?Ly#&A5DjUP!79xHJ0lKwUA}`tsm_g?%=u1trrKx4~P8!us zyw0-CS}L@q;?KQoX7q26zURzA%9X1os=NiWsIzv>DhS4*4J;-LXPcfrPQ8PgGLSR z*$?5eZw?mL+uOa@@ieK;P2($>ZzvIO&;}9~I;YX;v9mB(5|E`#J&b2ZEu#M%B^6=u;!YNmXi;It z2S*>g9%R7VKuKyi(Cw*siseI-kcchM##LHr9qOhou}&d4Z4nx!@>zC@w6_HPVxz&BeVfyHdPMN!<9lyvMGrvcuoI0*$2MJ0t> zU=p7Fu7xqOhpy4Aa_K+dV7YCxJE>^qa>8He;C{cM<$$_!k0R(IKAO%`A*5aCxR;6 z@5CZvqczPg(O~VYmz-pL)NJ8N$bdreB?^8?rtCx_EGEx6AO%RnRaRo;^X>`DQgal( zd2djaP^x>+1+c-n!08*s=XcjD>nz&gEk{z@=7A@gjq{wqdER^<=yWYcum3YZE~Em+ z&N7L{$`wUGfsa!f!f7{~Jn1mR-p6a#)3IkuiC?x~#hS3-J2BK`9eWt8K-7!*un&=Y5|#R5&ALF( zdPtx#(bjm&QhZvF;vzaWUes+>=>l7nq3rkLI!2?r8eCLZ5MO&>LHJa}-X^*p1>fEk zb-n>Z^|0VR{ZlUbw`gl<%1Dl2lft4ch2xTB{YnG}J0BonX~o$X8dQgin6!*t`Jo~t z94=icj9P{}fYPu@LFKH>{8FT{7f3%1`~$L_W5OHJ-1R>r?M7KS#jtyFh3td+1vJW# zolI4di~T;=3^>j*|H~`VDmOth_NyWtWX=*a_zHuvX-`mkrNLi~CQ6MCKda{CMqX*l zBmPxGdI9*Ipylg;dy(ctqbk6_u#e85-(Lxr|FvWE#@x-;?xlVLNbEtEPXWgt4h6^!%4B~X(b^1GGNQ$lv}d#%7+>83lC5}b!8MsYd$!sy-91jU^C+`_d+2o||zdUnVs!oS8D zcvqsu9okc(ZMym6sT&bQd|NKiA3Snf7Yq!`!y3Kn+87n~Btz=-OVIL~=TG%SiYs7< zd%tJ1oeezMK+qNCueg;rzd|G+weOx#=B^C!oryz9r$Kgj8hMuzm7_ zxvreK8|`czfE^e6$$ImgWW06X*C+uyG6g_v$N)S{1P*rdO%9wdGg*&cVRHX`0h#%4 zwm9VhYqQP3MwA+gLRSH>LV@|J(um8<85oRF6bVcYnC~xxxT=|f!3IVCnkdi^W#HB4 zDq!1?Z??2WQCKDkR`@|u6|4|(Eg`yzhZMjH9TXuZBJOx&U_dpoQ5mFgk_yB?_?FjYn+yz&D5{*CL8?S18!U5|MI125z+i%+ z>aiP473bs>Perhq$VcHQqNvXGf~n@1EWKP_7Je!V(4DABR67Ksa<085$V?XSQ6F~8 z#h69HAQF({TV%l&B386BFleDz7#IOlZ6J$S2*bdjgraI=F4S2oG-Tn+Ie<>mMNxIO z5~hk{a&eV3*k;6F83Tg?it5?bFxBjnzpRj#MT~$jFvz2*oY)0X+0_kBu(I&s51#q`HUOow8D5M7lF&Mez W(m*lz*HoBlEiM*bU{am~Dx&}eeNGnu diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a80b22c..d4081da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -211,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 25da30d..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -68,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell