/*
 *  quantili.h
 *  sort_quantili
 *
 *  Created by Claudio Sartori on Thu May 20 2004.
 *  Copyright (c) 2004 __University of Bologna__. All rights reserved.
 *
 */

void quantili(coppia *c, // array di coppie <modalita,valore> ordinato per modalita'
              int n,     // numero di coppie
              int NQ,    // numero di quantili prodotto
              int *e     // etichette di quantili
              );
/*
 *  quantili.c
 *  sort_quantili
 *
 *  Created by Claudio Sartori on Thu May 20 2004.
 *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
 *
 * A partire da un array ordinato di n coppie <modalita,valore> produce un array
 * di n etichette specificando per ogni coppia il relativo quantile
 * devono essere definiti esternamente:
 * coppia - struttura dati della coppia di valori, contenente l'attributo numerico "valore"
 * NMAX   - numero massimo di coppie
 *
 * Algoritmo:
 * - calcola la frequenza relativa cumulata frc per ogni coppia, interpretando i valori come
 *   frequenze assolute
 * - calcola l'ampiezza q di ciascun quantile
 * - inizializza etichetta a 1
 * - ripeti per ogni coppia i
 *   - finche' frc[i] e' maggiore del prodotto etichetta*q
 *     - incrementa etichetta (cambio quantile, ripetuto piu' volte nel caso di quantili vuoti)
 *   - attribuisci etichetta corrente alla coppia i
 *
 */

#include "sort_quantili.h"

void quantili(coppia *c, // array di coppie <modalita,valore> ordinato per modalita'
              int n,     // numero di coppie
              int NQ,    // numero di quantili prodotto
              int *e     // etichette di quantili
              ){
    double frc[NMAX],    // frequenze relative cumulate
        q,               // ampiezza quantile
        tot;             // ausiliare per freq cumulata
    int etichetta, i;
    
    tot=0;
    for (i=0;i<n;i++) 
        tot+=c[i].valore; // calcola totale rilevazioni
    
    frc[0]=c[0].valore/tot;
    for (i=1;i<n;i++) 
        frc[i]=frc[i-1]+c[i].valore/tot; // calcola cumulate
    
    q=(double)1/NQ;
    etichetta=1;
    for (i=0;i<n;i++){
        while (frc[i]>etichetta*q) 
            etichetta++;
        e[i]=etichetta;
    } // for
    
} // quantili - fine *************************************************************