MassEdit.Clustering = new Object();

MassEdit.Clustering.extractFirstCluster = function(valueStructures) {
    //valueStructures.sort(function(c1, c2) { return c2.values[0].length - c1.values[0].length; });
    
    var firstStructure = valueStructures[0].typicalStructure;
    for (var i = 1; i < valueStructures.length; i++) {
        var vs = valueStructures[i];
        vs.cost = MassEdit.Parsing.computeEditingCost(firstStructure, vs.typicalStructure);
    }
    valueStructures[0].cost = valueStructures[1].cost;
    
    valueStructures.sort(function(s1, s2) { return s1.cost - s2.cost; });
    
    var smallestGap = 0.001;
    var logdiffs = [];
    for (var i = 1; i < valueStructures.length; i++) {
        logdiffs.push(Math.log(
            Math.max(
                smallestGap,
                valueStructures[i].cost - valueStructures[i - 1].cost
            )
        ));
    }
    logdiffs.unshift(logdiffs[0]);
    
    var d = 10;
    var k = Math.log(17);
    for (var i = 1; i < logdiffs.length; i++) {
        var from = Math.max(0, i - d);
        var to = Math.min(logdiffs.length, i + d);
        
        var avg = 0;
        for (var j = from; j < to; j++) {
            avg += logdiffs[j];
        }
        avg = k + avg / (to - from + 1);
        
        if (logdiffs[i] > avg) {
            var results = valueStructures.slice(0, i);
            valueStructures.splice(0, i);
            
            return results;
        }
    }
    
    var results = [].concat(valueStructures);
    valueStructures.splice(0, valueStructures.length);
    
    return results;
};