pp1.KNNPositioner.java Source code

Java tutorial

Introduction

Here is the source code for pp1.KNNPositioner.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pp1;

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.pi4.locutil.GeoPosition;
import org.pi4.locutil.PositioningError;
import org.pi4.locutil.Random;
import org.pi4.locutil.Statistics;
import org.pi4.locutil.trace.TraceEntry;
import com.google.common.collect.MinMaxPriorityQueue;
import com.google.common.collect.Ordering;

/**
 *
 * @author Kris
 */
public class KNNPositioner implements Positioner {

    int k;

    public KNNPositioner(int k) {
        this.k = k;
    }

    @Override
    public List<PositioningError> getPositions(List<TraceEntry> offline, List<TraceEntry> online,
            Distancer distancer) {
        List<PositioningError> results = new ArrayList<>();

        /*online.stream().forEach((trace) -> {
         List<GeoPosition> bestTargets = offline.stream()
         .sorted((TraceEntry t1, TraceEntry t2) -> distancer.compareByDistance(t1, t2, trace))
         .limit(k).map(TraceEntry::getGeoPosition).collect(Collectors.toList());
         results.add(new PositioningError(trace.getGeoPosition(), Statistics.avgPosition(bestTargets) ));
         });*/ //Soooooo sloooow
        online.stream().forEach((TraceEntry trace) -> {
            //define ordering of TraceEntries by distance
            Ordering<TraceEntry> O = new Ordering<TraceEntry>() {
                public int compare(TraceEntry t1, TraceEntry t2) {
                    return distancer.compareByDistance(t1, t2, trace);
                }
            };

            //find closest TraceEntries as a stream
            Stream<TraceEntry> leastDistanceTraceEntryStream = O.leastOf(offline, k).stream();
            //convert result of stream to a list of GeoPositions
            List<GeoPosition> leastDistancePositionsList = leastDistanceTraceEntryStream
                    .map(TraceEntry::getGeoPosition).collect(Collectors.toList());
            //find average position
            GeoPosition avgPosition = Statistics.avgPosition(leastDistancePositionsList);
            //add to resultset
            results.add(new PositioningError(trace.getGeoPosition(), avgPosition));
        });

        return results;
    }

}