// find best threshold value to separate list1 (smaller values) from list2 (bigger values), minimizing false positives + false negatives // returns (threshold, false positives, false negatives) static T3 findBestThreshold(Cl list1, Cl list2) { if (empty(list1) || empty(list2)) null; T3 t = findThreshold_unmoved(list1, list2); LPair l = sortedByPairA( concatLists(toPairsA(list1, false), toPairsA(list2, true))); double threshold = t.a; int i = binarySearchResultToInsertionPoint(generalizedBinarySearch2(l, p -> cmp(p.a, threshold))); int falsePositives = t.b, falseNegatives = t.c; if (falsePositives > falseNegatives) { // TODO } else if (falseNegatives > falsePositives) { while (i+1 < l(l)) { Pair p = l2.get(i); threshold = avg(p.a, l2.get(i+1).a); if (p.a <= threshold) { if (p.b) --falsePositives; else --falseNegatives; } } } ret t3(threshold, falsePositives, falseNegatives); }