%Riceve un vettore di 1 e 0 utilizzato per selezionare o meno le features.
%Può lavorare sull'elenco di 20 geni di ferdinando (in original_dagta.mat)
%o su quello con 3slicesx19geni (in slices3.mat). C'è una penalità per
%quelle combinazioni che non selezionano neanche un gene per una qualunque
%delle 6 zone. La fitness è il silhouette index (cambiato di segno perché
%il GA deve minimizzare il problema.

function sil = computeSilhouette(x, data, labels, class, n_parts)
    persistent this_data;
    persistent this_labels;
    persistent this_class;
    persistent this_numberparts;
    if nargin > 1
        this_data = data;
        this_labels = labels;
        this_class = labels == class;
        this_numberparts = n_parts;
    else
        sil=0;
        if sum(x) < this_numberparts
            sil = sil + sum(x);
        end
        sil_all = silhouette(this_data(:,find(x)),this_labels);
        sil = sil-mean(sil_all(this_class));
    end
end