Skip to content
Snippets Groups Projects
Commit 406b65bb authored by Daniel Schramm's avatar Daniel Schramm
Browse files

Wrong computation of weighted Hausdorff distance on FPs reverted

parent f7d8911e
No related branches found
No related tags found
No related merge requests found
......@@ -21,9 +21,7 @@ import javax.vecmath.Point3d;
* from {@link PrioritySphere#sphereCenterPosition} have priority equal to 0.</li>
* </ul>
* <p>
* The visitor also pairs the absolute distances along with their priorities
* and computes the total sum of weighted distances of all mesh facet's vertices
* from {@link PrioritySphere#sphereCenterPosition}.
* The visitor returns all mesh facets together with priorities of all their vertices.
* </p>
* <p>
* This visitor is thread-safe.
......@@ -37,7 +35,6 @@ public class PrioritySphere extends MeshVisitor {
private final double sphereRadius;
private final Map<MeshFacet, List<Double>> priorities = new HashMap<>();
private final Map<MeshFacet, Double> weightedDistances = new HashMap<>();
/**
* Constructor.
......@@ -67,23 +64,11 @@ public class PrioritySphere extends MeshVisitor {
return Collections.unmodifiableMap(priorities);
}
/**
* Returns a map of visited mesh facets together with the total sum of weighted distances
* of all their vertices from the center of the priority sphere.
*
* @return map of visited mesh facets and sum of weighted distances of their vertices
* from the center of the priority sphere
*/
public Map<MeshFacet, Double> getWeightedDistances() {
return Collections.unmodifiableMap(weightedDistances);
}
@Override
public void visitMeshFacet(MeshFacet facet) {
final List<MeshPoint> vertices = facet.getVertices();
final List<Double> prioritiesList = new ArrayList<>(vertices.size());
double aggregatedDistance = 0;
for (int i = 0; i < vertices.size(); i++) { // for each vertex of visited facet
final double distance = sphereCenterPosition.distance(vertices.get(i).getPosition());
......@@ -92,7 +77,6 @@ public class PrioritySphere extends MeshVisitor {
priority = 0;
} else {
priority = 1 - distance / sphereRadius;
aggregatedDistance += priority * distance;
}
prioritiesList.add(priority);
......@@ -100,7 +84,6 @@ public class PrioritySphere extends MeshVisitor {
synchronized(this) {
priorities.put(facet, prioritiesList);
weightedDistances.put(facet, aggregatedDistance);
}
}
}
......@@ -5,9 +5,10 @@ import cz.fidentis.analyst.mesh.core.MeshFacet;
import cz.fidentis.analyst.mesh.core.MeshFacetImpl;
import cz.fidentis.analyst.mesh.core.MeshModel;
import cz.fidentis.analyst.mesh.core.MeshPointImpl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import javax.vecmath.Point3d;
......@@ -18,7 +19,7 @@ import org.junit.jupiter.api.Test;
public class PrioritySphereTest {
private static final double DELTA = 1e-11;
private static final double DELTA = 1e-15;
protected MeshFacet getTrivialFacet(int count, double xSpace, double ySpace, double zSpace, int offset) {
final MeshFacet facet = new MeshFacetImpl();
......@@ -32,15 +33,12 @@ public class PrioritySphereTest {
return facet;
}
protected void performTest(List<MeshFacet> facets,
List<List<Double>> expectedPriorities,
List<Double> expectedWeightedDistances,
protected void performTest(Map<MeshFacet, List<Double>> facetsWithExpectedPriorities,
PrioritySphere visitor,
boolean concurrently) {
assertEquals(facets.size(), expectedPriorities.size());
assertEquals(facets.size(), expectedWeightedDistances.size());
final Set<MeshFacet> facets = facetsWithExpectedPriorities.keySet();
MeshModel model = new MeshModel();
// model.addFacets(new HashSet<>(facets));
for (final MeshFacet facet: facets) {
......@@ -50,144 +48,76 @@ public class PrioritySphereTest {
model.compute(visitor, concurrently);
final Map<MeshFacet, List<Double>> priorities = visitor.getPriorities();
final Map<MeshFacet, Double> weightedDistances = visitor.getWeightedDistances();
assertEquals(facets.size(), priorities.size());
assertEquals(facets.size(), weightedDistances.size());
assertEquals(facetsWithExpectedPriorities.size(), priorities.size());
for (int i = 0; i < facets.size(); i++) {
final MeshFacet facet = facets.get(i);
for (final MeshFacet facet: facets) {
assertTrue(priorities.containsKey(facet));
final List<Double> expectedPrioritiesList = expectedPriorities.get(i);
final List<Double> actualPrioritiesList = priorities.get(facet);
assertEquals(expectedPrioritiesList.size(), actualPrioritiesList.size());
final List<Double> expectedPriorities = facetsWithExpectedPriorities.get(facet);
final List<Double> actualPriorities = priorities.get(facet);
assertEquals(expectedPriorities.size(), actualPriorities.size());
for (int j = 0; j < expectedPrioritiesList.size(); j++) {
assertEquals(expectedPrioritiesList.get(j), actualPrioritiesList.get(j), DELTA);
for (int i = 0; i < expectedPriorities.size(); i++) {
assertEquals(expectedPriorities.get(i), actualPriorities.get(i), DELTA);
}
assertTrue(weightedDistances.containsKey(facet));
final double expectedWeightedDistance = expectedWeightedDistances.get(i);
final double actualWeightedDistance = weightedDistances.get(facet);
assertEquals(expectedWeightedDistance, actualWeightedDistance, DELTA);
}
}
@Test
public void variousPrioritiesTest() {
final List<Double> prioritiesList = List.of(1d, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0d, 0d);
final double weightedDistance = 0 + 0.9 + 1.6 + 2.1 + 2.4 + 2.5 + 2.4 + 2.1 + 1.6 + 0.9 + 0 + 0;
final List<MeshFacet> facets = new ArrayList<>();
final List<List<Double>> expectedPriorities = new ArrayList<>();
final List<Double> expectedWeightedDistances = new ArrayList<>();
facets.add(getTrivialFacet(12, 1, 0, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, -1, 0, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 1, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, -1, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 0, 1, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 0, -1, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
final List<Double> priorities = List.of(1d, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0d, 0d);
final Map<MeshFacet, List<Double>> expected = new HashMap<>();
expected.put(getTrivialFacet(12, 1, 0, 0, 0), priorities);
expected.put(getTrivialFacet(12, -1, 0, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, 1, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, -1, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, 0, 1, 0), priorities);
expected.put(getTrivialFacet(12, 0, 0, -1, 0), priorities);
final PrioritySphere visitor = new PrioritySphere(new Point3d(0, 0, 0), 10);
performTest(facets, expectedPriorities, expectedWeightedDistances, visitor, false);
performTest(expected, visitor, false);
}
@Test
public void allZeroPrioritiesTest() {
final List<MeshFacet> facets = new ArrayList<>();
final List<List<Double>> expectedPriorities = new ArrayList<>();
final List<Double> expectedWeightedDistances = new ArrayList<>();
facets.add(getTrivialFacet(1, 3, 0, 0, 1));
expectedPriorities.add(List.of(0d));
expectedWeightedDistances.add(0d);
facets.add(getTrivialFacet(5, 0, 3, 0, 1));
expectedPriorities.add(List.of(0d, 0d, 0d, 0d, 0d));
expectedWeightedDistances.add(0d);
facets.add(getTrivialFacet(3, -3, -3, -3, 1));
expectedPriorities.add(List.of(0d, 0d, 0d));
expectedWeightedDistances.add(0d);
final Map<MeshFacet, List<Double>> expected = new HashMap<>();
expected.put(getTrivialFacet(1, 3, 0, 0, 1), List.of(0d));
expected.put(getTrivialFacet(5, 0, 3, 0, 1), List.of(0d, 0d, 0d, 0d, 0d));
expected.put(getTrivialFacet(3, -3, -3, -3, 1), List.of(0d, 0d, 0d));
final PrioritySphere visitor = new PrioritySphere(new Point3d(0, 0, 0), 3);
performTest(facets, expectedPriorities, expectedWeightedDistances, visitor, false);
performTest(expected, visitor, false);
}
@Test
public void noZeroPriorityTest() {
final List<MeshFacet> facets = new ArrayList<>();
final List<List<Double>> expectedPriorities = new ArrayList<>();
final List<Double> expectedWeightedDistances = new ArrayList<>();
facets.add(getTrivialFacet(1, 10, 0, 0, 1));
expectedPriorities.add(List.of(0.9));
expectedWeightedDistances.add(9d);
facets.add(getTrivialFacet(5, 0, -20, 0, 0));
expectedPriorities.add(List.of(1d, 0.8, 0.6, 0.4, 0.2));
expectedWeightedDistances.add(0d + 16d + 24d + 24d + 16d);
facets.add(getTrivialFacet(100, 0, 0, -1, 0));
final List<Double> priorities = DoubleStream.iterate(1, d -> d > 0d, d -> d - 0.01)
final Map<MeshFacet, List<Double>> expected = new HashMap<>();
expected.put(getTrivialFacet(1, 10, 0, 0, 1), List.of(0.9));
expected.put(getTrivialFacet(5, 0, -20, 0, 0), List.of(1d, 0.8, 0.6, 0.4, 0.2));
expected.put(getTrivialFacet(100, 0, 0, -1, 0), DoubleStream.iterate(1, d -> d > 0d, d -> d - 0.01)
.boxed()
.collect(Collectors.toList());
double weightedDistance = 0;
for (int i = 0; i < 100; i++) {
weightedDistance += i * priorities.get(i);
}
expectedPriorities.add(priorities);
expectedWeightedDistances.add(weightedDistance);
.collect(Collectors.toList()));
final PrioritySphere visitor = new PrioritySphere(new Point3d(0, 0, 0), 100);
performTest(facets, expectedPriorities, expectedWeightedDistances, visitor, false);
performTest(expected, visitor, false);
}
@Test
public void concurrencyTest() {
final List<Double> prioritiesList = List.of(1d, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0d, 0d);
final double weightedDistance = 0 + 0.9 + 1.6 + 2.1 + 2.4 + 2.5 + 2.4 + 2.1 + 1.6 + 0.9 + 0 + 0;
final List<MeshFacet> facets = new ArrayList<>();
final List<List<Double>> expectedPriorities = new ArrayList<>();
final List<Double> expectedWeightedDistances = new ArrayList<>();
facets.add(getTrivialFacet(12, 1, 0, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, -1, 0, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 1, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, -1, 0, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 0, 1, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
facets.add(getTrivialFacet(12, 0, 0, -1, 0));
expectedPriorities.add(prioritiesList);
expectedWeightedDistances.add(weightedDistance);
final List<Double> priorities = List.of(1d, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0d, 0d);
final Map<MeshFacet, List<Double>> expected = new HashMap<>();
expected.put(getTrivialFacet(12, 1, 0, 0, 0), priorities);
expected.put(getTrivialFacet(12, -1, 0, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, 1, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, -1, 0, 0), priorities);
expected.put(getTrivialFacet(12, 0, 0, 1, 0), priorities);
expected.put(getTrivialFacet(12, 0, 0, -1, 0), priorities);
final PrioritySphere visitor = new PrioritySphere(new Point3d(0, 0, 0), 10);
performTest(facets, expectedPriorities, expectedWeightedDistances, visitor, true);
performTest(expected, visitor, true);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment