public static double getCloudDataMonetaryCost(long bytes, long count, double interactionCost) {
    if (bytes == 0 || count == 0) return 0.0;

    double dataCost =
        CostConversionSingleton.getInstance().interactionConvert(bytes, count) * interactionCost;

    return dataCost;
  }
  /**
   * The return value for the method will always be in Milliseconds
   *
   * @param bytes amount of bytes of data transferred
   * @param count Number of times data exchange happened
   * @param bandwidth The communication bandwidth
   * @param handshakeCost The cost of handshake
   * @param liftingLoweringCost The cost of data lifting and lowering
   * @param latency The latency for data transfer
   * @return The return value for the transmission time will always be in milliseconds
   */
  public static double getTransmissionTime(
      long bytes,
      long count,
      double bandwidth,
      double handshakeCost,
      double liftingLoweringCost,
      double latency) {
    if (bytes == 0) return 0.0;

    double poissonQueueingDelay =
        ((bytes * BYTE_2_BIT_RATE) / bandwidth)
            / (Math.pow(bandwidth / count, 2) + ((bandwidth * bytes) / (Math.pow(count, 2))));

    return Math.ceil(
        poissonQueueingDelay
            + CostConversionSingleton.getInstance()
                .interactionConvert(
                    (liftingLoweringCost * bytes
                        + handshakeCost
                        + ((bytes * BYTE_2_BIT_RATE) / bandwidth)
                        + latency),
                    count));
  }