"""Laboratorio de la semana 11: las cuentas con las que se leen las mediciones.

Completen cada función y borren los TODO. `make test` prueba este archivo cuando ya no
queda ninguno. Las unidades están en cada docstring: la mayoría de los errores aquí son de
unidades (bits y bytes, ms y s, % y fracción).
"""


def bdp_packets(rate_mbps, rtt_ms, packet_bytes=1500):
    """Producto ancho de banda por retardo, en paquetes de packet_bytes bytes."""
    # TODO
    raise NotImplementedError


def queue_delay_ms(buffer_bytes, rate_mbps):
    """Retardo que agrega un buffer lleno de buffer_bytes bytes a un enlace de rate_mbps."""
    # TODO
    raise NotImplementedError


def mathis_mbps(mss_bytes, rtt_ms, loss_fraction):
    """Throughput de Reno según la fórmula de la pérdida, en Mbit/s.

    loss_fraction es una fracción: 1 % se escribe 0.01.
    """
    # TODO
    raise NotImplementedError


def decrease_ratios(rows):
    """Cuánto reduce la ventana el algoritmo en cada evento de congestión.

    rows es una lista de filas (t, cwnd, ssthresh, rtt), como las del CSV de bench.py, donde
    ssthresh es None mientras no ha habido pérdidas. Cada vez que ssthresh cambia de valor
    hubo un evento: devuelvan ssthresh_nuevo / cwnd_máximo, donde cwnd_máximo es el cwnd más
    alto visto desde el evento anterior (o desde el inicio), contando la fila actual. Al
    pasar un evento, el máximo vuelve a empezar desde el cwnd de esa fila.
    """
    # TODO
    raise NotImplementedError
