public void send(Message mess) {
   mess.getSource().incrementerNbMessSend();
   if (mess.getSource().getMomentAvaiableToSend() > mess.getDate()) {
     mess.setDate(mess.getSource().getMomentAvaiableToSend());
   }
   mess.getSource()
       .setMomentAvaiableToSend(
           mess.getDate() + mess.getTaille() / mess.getSource().getCapacCarte());
   getSequencer().addMessToBuffer(mess);
 }
 public void sendMulticast(
     Machine source, List<Machine> destinations, double taille, double date) {
   source.incrementerNbMessSend();
   Message mess = new Message(source, destinations, TypeMessage.MULTICAST, taille, date);
   // Kiem tra may co ranh de cho gui hay khong
   if (source.getMomentAvaiableToSend() > mess.getDate()) { // ko ranh
     mess.setDate(source.getMomentAvaiableToSend());
   }
   source.setMomentAvaiableToSend(mess.getDate() + mess.getTaille() / source.getCapacCarte());
   getSequencer().addMessToBuffer(mess);
 }
  /* Calculer le debit du reseau
   * Debit Total = sum (debit sur chaque machine)
   */
  public void calculateDebit() {
    Map<Integer, Integer> nbMessEachSource = new HashMap<Integer, Integer>();
    Map<Integer, Double> sumEachSource = new HashMap<Integer, Double>();
    for (int i = 0; i < getNbMachines(); i++) {
      nbMessEachSource.put(i, 1);
      sumEachSource.put(i, 1.0);
    }

    for (Message m : getMessageArrives()) {
      int temp1 = nbMessEachSource.get(m.getSource().getId());
      double temps2 = sumEachSource.get(m.getSource().getId());
      temp1 += 1;
      temps2 +=
          (m.getDateMessDelivre() - m.getDate())
              / getUniteTemps(m.getSource().getId(), m.getSource().getCapacCarte());
      nbMessEachSource.put(m.getSource().getId(), temp1);
      sumEachSource.put(m.getSource().getId(), temps2);
    }

    double debit = 0;
    for (int i = 0; i < getNbMachines(); i++) {
      debit += nbMessEachSource.get(i) / sumEachSource.get(i);
    }
    setDebit(debit);
  }
 /* Supposons qu'on a un liste de messages arrives. Definissons:
  * dSi: le date qu'un message i est envoye'
  * dAi: la date qu'un message i est arrive'
  * latence = (sum[0->nbMessTotal](dAi-dSi)/uniteTemps(source qui envoie message i))/nbMessTotal
  */
 public void calculLatence() {
   double temp = 0;
   for (Message m : getMessageArrives()) {
     temp +=
         (m.getDateMessDelivre() - m.getDate())
             / getUniteTemps(m.getSource().getId(), m.getTaille());
   }
   setLatence(temp / (getSequencer().getBuffer().size()));
 }
 public void deliverAMessage(int nbSequence, int idDestinationMachine) {
   // Remove message from buffer
   Message m = this.machinesDefault[idDestinationMachine].removeMessFromBuffer(nbSequence);
   if (this.machinesDefault[idDestinationMachine].getMomentAvaiableToReceive()
       < (m.getDate() + getTempsPropa())) {
     this.machinesDefault[idDestinationMachine].setMomentAvaiableToReceive(
         getUniteTemps(m, this.machinesDefault[idDestinationMachine]));
   } else {
     this.machinesDefault[idDestinationMachine].setMomentAvaiableToReceive(
         getMachine(idDestinationMachine).getMomentAvaiableToReceive()
             + m.getTaille() / getMachine(idDestinationMachine).getCapacCarte());
   }
   m.setDateMessDelivre(getMachine(idDestinationMachine).getMomentAvaiableToReceive());
   System.out.println(
       "*****************Delivred a messages in destination machine "
           + idDestinationMachine
           + " ********************\n"
           + m.toString());
   this.messageArrives.add(m);
 }
 public double getUniteTemps(Message m, Machine machine) {
   return getTempsPropa() + m.getTaille() / machine.getCapacCarte() + m.getDate();
 }