/** Executa a simulação, em Loop. */
  public void run() {
    while (!confidenceNotAcceptable()) {
      setFirstEvents();

      // Os dados desta fase são subtraídos das estatísticas finais.
      TransientPhaseData transientPhaseData = transientPhase();

      for (int i = 0; i < SimulationProperties.getEventsInARow(); i++) {
        // Usado no cenário 1.
        mapCurrentTimePerCwndMSS.put(
            currentTime,
            getSystem().getTxs().get(0).getCongestionWindow()
                / SimulationProperties.getMSS().doubleValue());
        // Armazena dados de vazão ao longo do tempo, para cada Tx.
        populateFlowPerTx();
        handleEvents();
      }

      for (int i = 0; i < getSystem().getRxs().size(); i++) {
        double a =
            getSystem().getRxs().get(i).getNextExpectedByte()
                - transientPhaseData.getExpectedBytes().get(i);
        double b = currentTime - transientPhaseData.getTransientPhaseEndingTime();
        statisticsPerTx.get(i).addSample((a * 8) / (b * 1E-3));
      }
    }
  }
  /**
   * Executa a fase transiente.
   *
   * @return Tempo de término da fase e a sequência de bytes esperados nos receptores.
   */
  public TransientPhaseData transientPhase() {
    for (int i = 0; i < SimulationProperties.getTransientPhaseEvents(); i++) handleEvents();

    double transientPhaseEndingTime = currentTime;
    ArrayList<Long> expectedBytes = new ArrayList<Long>();

    for (Rx rx : getSystem().getRxs()) expectedBytes.add(rx.getNextExpectedByte());

    return new TransientPhaseData(transientPhaseEndingTime, expectedBytes);
  }