You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2022/11/03 16:43:56 UTC

[commons-math] branch master updated: MATH-1651: Ensure neuron distances are returned in a consistent order

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git


The following commit(s) were added to refs/heads/master by this push:
     new 3e72f1ea3 MATH-1651: Ensure neuron distances are returned in a consistent order
3e72f1ea3 is described below

commit 3e72f1ea31f4b0ed43e6cb48381f86b95c15f36c
Author: aherbert <ah...@apache.org>
AuthorDate: Thu Nov 3 16:42:53 2022 +0000

    MATH-1651: Ensure neuron distances are returned in a consistent order
    
    Use of the iterator order should be avoided as the underlying collection
    uses an unspecified iteration order.
---
 .../neuralnet/sofm/KohonenUpdateActionTest.java    | 31 +++++++++++++++-------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/sofm/KohonenUpdateActionTest.java b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/sofm/KohonenUpdateActionTest.java
index a445bad43..aaefa130d 100644
--- a/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/sofm/KohonenUpdateActionTest.java
+++ b/commons-math-neuralnet/src/test/java/org/apache/commons/math4/neuralnet/sofm/KohonenUpdateActionTest.java
@@ -68,11 +68,7 @@ public class KohonenUpdateActionTest {
         //    all neuron's features get closer to the input's features.
 
         final double[] features = new double[] {0.3};
-        final double[] distancesBefore = new double[netSize];
-        int count = 0;
-        for (Neuron n : net) {
-            distancesBefore[count++] = dist.applyAsDouble(n.getFeatures(), features);
-        }
+        final double[] distancesBefore = getDistances(net, dist, features);
         final Neuron bestBefore = rank.rank(features, 1).get(0);
 
         // Initial distance from the best match is larger than zero.
@@ -80,11 +76,7 @@ public class KohonenUpdateActionTest {
 
         update.update(net, features);
 
-        final double[] distancesAfter = new double[netSize];
-        count = 0;
-        for (Neuron n : net) {
-            distancesAfter[count++] = dist.applyAsDouble(n.getFeatures(), features);
-        }
+        final double[] distancesAfter = getDistances(net, dist, features);
         final Neuron bestAfter = rank.rank(features, 1).get(0);
 
         Assert.assertEquals(bestBefore, bestAfter);
@@ -96,4 +88,23 @@ public class KohonenUpdateActionTest {
             Assert.assertTrue(distancesAfter[i] < distancesBefore[i]);
         }
     }
+
+    /**
+     * Gets the distance of each Neuron to the specified features.
+     * Distances are returned ordered by the Neuron ID.
+     *
+     * @param net Network
+     * @param dist Distance measure
+     * @param features Feature vector
+     * @return the distances
+     */
+    private static double[] getDistances(Network net,
+                                         DistanceMeasure dist,
+                                         double[] features) {
+        return net.getNeurons()
+                  .stream()
+                  .sorted((a, b) -> Long.compare(a.getIdentifier(), b.getIdentifier()))
+                  .mapToDouble(n -> dist.applyAsDouble(n.getFeatures(), features))
+                  .toArray();
+    }
 }