function [ accuracies, F1s, corrs, ccc, rms, classes ] = evaluate_au_prediction_results( labels, ground_truth )
%EVALUATE_CLASSIFICATION_RESULTS Summary of this function goes here
%   Detailed explanation goes here

    classes = sort(unique(ground_truth));
    accuracies = zeros(numel(classes),1);
    F1s = zeros(numel(classes),1);
    
    corrs = corr(labels, ground_truth);
    
    rms = sqrt(mean((labels-ground_truth).^2));
        
    std_g = std(ground_truth);
    std_p = std(labels);
    
    ccc = 2 * corrs * std_g * std_p / (std_g^2 + std_p^2 + (mean(labels) - mean(ground_truth))^2);
    
    % the label is taken to belong to a class it is closest to
    label_dists = zeros(numel(labels), numel(classes));
    
    for i=1:numel(classes)
        label_dists(:,i) = abs(labels - classes(i));
    end
    
    [~, labels] = min(label_dists');
    labels = labels';
    
    for i=1:numel(classes)
       labels(labels==i) = classes(i); 
    end
    
    for i=1:numel(classes)
        
        pos_samples = ground_truth == classes(i);
        neg_samples = ground_truth ~= classes(i);
        
        pos_labels = labels == classes(i);
        neg_labels = labels ~= classes(i);
        
        TPs = sum(pos_samples & pos_labels);
        TNs = sum(neg_samples & neg_labels);
        
        FPs = sum(pos_labels & neg_samples);
        FNs = sum(neg_labels & pos_samples);
        
        accuracies(i) = (TPs + TNs) / numel(pos_samples);
               
        F1s(i) = 2 * TPs / (2*TPs + FNs + FPs);
        
    end
    
    
end