public EstimateResult compare(IEnumerable<Vertex> vertices, SnifferWifiMeasurement measurement) { measurement = getNStrongestAPMeasurement(measurement, 7); if (vertices == null || measurement == null) return null; bcs = WifiPosEngine.BestCandidateSet; //new BCS(5); //bcs.clear(); double curDist; //distance of current vertice in search space EstimateResult result = new EstimateResult(null, double.MaxValue); foreach (Vertex curVertex in vertices) //sammenlign med hver Vertex { foreach (SnifferWifiMeasurement curFP in curVertex.SnifferWifiMeasurements) //sammenlign med hvert fingerprint (usually only one - otherwise use more intelligent approach) { curDist = 0; foreach (String mac in measurement.getMACs()) //all APs in sample if (curFP.containsMac(mac)) curDist += Math.Pow((measurement.getAvgDbM(mac) - curFP.getAvgDbM(mac)), 2); else curDist += Math.Pow((measurement.getAvgDbM(mac) - MISSING_MAC_PENALTY), 2); curDist = Math.Sqrt(curDist); if (curDist < result.getDistance()) { result.setDistance(curDist); result.setVertex(curVertex); } bcs.add(curVertex, curDist); //add to best candidate set - which will take care of only using the best estimates. } } //The following only yields a local error estimate within the primary- or secondary //vertices and may thus not be appropriate result.setErrorEstimate(Math.Ceiling(bcs.getMaxDistance())); return result; }
//Public visibility so we can test it (directly) via unit tests public static SnifferWifiMeasurement getNStrongestAPMeasurement(SnifferWifiMeasurement measurement, int n) { if (measurement.getMACs().Count < n) return measurement; SortedDictionary<double, String> strongestAPs = new SortedDictionary<double, String>(); //Find the n strongest macs // foreach (String mac in measurement.getMACs()) //all APs in sample { double curMacVal = measurement.getAvgDbM(mac); while (strongestAPs.ContainsKey(curMacVal)) curMacVal += 0.0001; strongestAPs.Add(curMacVal, mac); //NB: TreeMap sorts members in ascending order! //Thus, we remove from the head to keep the strongest values if (strongestAPs.Count > n) strongestAPs.Remove(strongestAPs.First().Key); } //Create new measurement containing n strongest macs SnifferWifiMeasurement result = new SnifferWifiMeasurement(); foreach (double d in strongestAPs.Keys) { SnifferHistogram h = new SnifferHistogram(); h.Mac = strongestAPs[d]; h.value = (int)d; h.count = 1; result.SnifferHistograms.Add(h); //result.addValue(strongestAPs.get(d), (int)d); } return result; }