Commit a8f31cdb authored by Daniel Schramm's avatar Daniel Schramm
Browse files

Computation of prioritized Hausdorff distance parallelized

parent 9c459182
Loading
Loading
Loading
Loading
+38 −9
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.vecmath.Point3d;

/**
@@ -91,21 +97,35 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor {
        final FeaturePoint featurePoint = humanFace.getFeaturePoints().get(featurePointType.getType());
        final Point3d featurePointPosition = featurePoint.getPosition();
        
        final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        
        for (final MeshFacet comparedFacet: humanFace.getMeshModel().getFacets()) {
            comparedFacet.accept(distanceVisitor);
            
            final List<MeshPoint> vertices = comparedFacet.getVertices();
            final List<Double> prioritiesList = new ArrayList<>();
            for (int i = 0; i < vertices.size(); i++) {
                final double distance = featurePointPosition.distance(vertices.get(i).getPosition());
                final double priority;
                if (distance > sphereRadius) {
                    priority = 0;
            
            final List<Future<Double>> results = new ArrayList<>(vertices.size());
            final List<Double> prioritiesList = new ArrayList<>(vertices.size());
            
            for (int i = 0; i < vertices.size(); i++) { // Taking vertices in the same order as 'distanceVisitor' does
                final Point3d vertexPosition = vertices.get(i).getPosition();
                if (inParallel() && isThreadSafe()) {
                    results.add(executor.submit(() -> computePriority(featurePointPosition, vertexPosition)));
                } else {
                    priority = 1 - distance / sphereRadius;
                    prioritiesList.add(computePriority(featurePointPosition, vertexPosition));
                }
            }
            
                prioritiesList.add(priority);
            if (inParallel() && isThreadSafe()) {
                executor.shutdown();
                while (!executor.isTerminated()){}
                try {
                    for (final Future<Double> priority: results) {
                        prioritiesList.add(priority.get());
                    }
                } catch (final InterruptedException | ExecutionException ex) {
                    Logger.getLogger(HausdorffDistancePrioritized.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            
            synchronized (this) {
@@ -113,4 +133,13 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor {
            }
        }
    }
    
    protected double computePriority(Point3d featurePointPosition, Point3d vertexPosition) {
        final double distance = featurePointPosition.distance(vertexPosition);
        if (distance > sphereRadius) {
            return 0;
        }
        
        return 1 - distance / sphereRadius;
    }
}