Skip to content
Snippets Groups Projects
analyzer.hpp 3.05 KiB
Newer Older
david's avatar
david committed
#ifndef __ANALYZER_HPP__
#define __ANALYZER_HPP__

#include<cmath>
#include <vector>
#include <iostream>

/**
   Classe utilisée pour faire des statistiques élémentaires
   sur une séquence d'opérations.
*/
class Analyzer{
public:
  /**
   Constructeur de la classe analyse
   Complexité en temps/espace, pire et meilleur cas : O(1)  
 */
  Analyzer():cumulative_square(0){}
  
  /**
     Ajoute un coût, une valeur à l'analyse.
     Complexité en temps/espace, pire cas : O(size)
     Complexité en temps/espace, meilleur cas : O(1)
     Complexité amortie : O(1)
     @param x est la valeur que l'on souhaite ajouter à l'analyse.
  */
  void append(const double & x);
david's avatar
david committed

  /**
     Renvoie la somme des coûts enregistrés dans cette analyse.
     Complexité en temps/espace, meilleur cas : O(1)
     @returns la somme des coûts enregistrés dans cette analyse.
  */
david's avatar
david committed
  long double get_total_cost(){
david's avatar
david committed
    return cumulative_cost.back();
  }

  /**
     Renvoie le coût amorti d'une opération.
     Complexité en temps/espace, meilleur cas : O(1)
     @param pos est l'indice de l'opération pour laquelle on veut connaître le coût amorti.
     @returns le coût amorti d'une opération.
  */
david's avatar
david committed
  long double get_amortized_cost(size_t pos){
david's avatar
david committed
    return (pos)? cumulative_cost.at(pos)/pos : cumulative_cost.at(pos); 
  }

  /**
     Renvoie la moyenne des coûts de toutes les opérations enregistrées dans l'analyse.
     Complexité en temps/espace, meilleur cas : O(1)
     @returns la moyenne des coûts de toutes les opérations enregistrées dans l'analyse.
  */
david's avatar
david committed
  long double get_average_cost();
david's avatar
david committed

  /**
     Renvoie la variance des coûts de toutes les opérations enregistrées dans l'analyse.
     Complexité en temps/espace, meilleur cas : O(1)
     @returns la variance des coûts de toutes les opérations enregistrées dans l'analyse.
  */
david's avatar
david committed
  long double get_variance();
david's avatar
david committed

  /**
     Renvoie l'écart-type des coûts de toutes les opérations enregistrées dans l'analyse.
     Complexité en temps/espace, meilleur cas : O(1)
     @returns l'écart-type des coûts de toutes les opérations enregistrées dans l'analyse.
  */
david's avatar
david committed
  long double get_standard_deviation(){
david's avatar
david committed
    return std::sqrt(get_variance());
  }

  /**
     Sauvegarde la liste des coûts et des coûts amortis dans un fichier.
     Complexité en temps, meilleur/pire cas : O(size)
     @param path est le chemin du fichier dans lequel la sauvegarde est faite.
  */
  void save_values(const std::string & path);
david's avatar
david committed
  /**
     Affiche la liste des coûts et des coûts amortis sur la sortie standard.
     Complexité en temps, meilleur/pire cas : O(size)
  */
  void plot_values();
david's avatar
david committed

private:
  // Coût de chaque opération. Peut représenter du temps ou une autre mesure.
  std::vector<double> cost;
  // Coût cumulatif. La case i contient la somme des coûts des i premières opérations.
  // Permet de calculer le coût amorti d'une opération.
david's avatar
david committed
  std::vector<long double> cumulative_cost;
david's avatar
david committed
  // Carré du coût cumulatif. Sert à calculer la variance. On ne garde que la dernière valeur.
david's avatar
david committed
  long double cumulative_square;