Untitled

mail@pastecode.io avatar
unknown
python
a year ago
5.7 kB
4
Indexable
Never
import numpy as np
from classes import usuario

# hay que hacer una acumulador a partir de los tiempos de llegada para sacar
# HORA de llegada
def crear_usuarios(tipo: usuario, nUsuarios: int, tEspera: int) -> np.array:
    '''
    Crea una lista de nUsuarios usuarios según su media de tiempo entre 
    usuario, teniendo en cuenta el tiempo de descanso (tEspera) del servicio.
    '''
    tiempos_entre_usuarios: np.array = np.random.exponential(tipo.media,
                                              size=nUsuarios)
    tiempos_llegada: np.array = np.cumsum(tiempos_entre_usuarios)

    tiempos_servicio: np.array = tEspera + np.random.uniform(low=tipo.low,
                                                   high=tipo.high,
                                                   size=nUsuarios)
    
    usuarios: np.array = np.array([tipo(tiempo_llegada, tiempo_servicio) 
                          for tiempo_llegada, tiempo_servicio 
                          in zip(tiempos_llegada, tiempos_servicio)
                          ])

    return usuarios


def insertar_salida(user: usuario,
                    # t: int,
                    # previousnUsers: int,
                    previous_tSalida: int,
                    nUsers: int,
                    events: dict[str:np.array],
                    anyQueue: bool
                    ):
    '''
    Inserta salidas en el diccionario de eventos de salida.
    '''
    
                        # + tEspera
    # instante servicio será el mayor entre la hora de llegada del siguiente
    # usuario y previous_tSalida.
    # si len(cola = 0), entonces ponemos que user.instante_servicio = 0.
    #  sino, ponemos que es igual a previoustSalida
    user.instante_servicio = user.t_llegada if anyQueue else previous_tSalida
    # insert exit time
    # events['hour'] = np.insert(events['hour'], -1,
    #                             previous_tSalida)

    # events['hour'] = np.append(events['hour'], previous_tSalida
    #                             + user.t_servicio)
    events['hour'] = np.append(events['hour'], user.instante_servicio + user.t_servicio)

    # habrá que quitar tantos usuarios en cola de los eventos de entrada como 
    # eventos de salida haya habido previamente, pues enter_events acumulativo
    # sin tener en cuenta las salidas.
    # n: int = i - len(events['nUsers']) - 1
    # insert nUsers
    # events['nUsers'] = np.insert(events['nUsers'], -1, n)
    events['nUsers'] = np.append(events['nUsers'], nUsers)
    return events

def insertar_entrada(user: usuario, events: dict[str:np.array]):
    '''
    Inserta entradas en el diccionario de eventos de entrada.
    '''
    events['hour'] = np.append(events['hour'],
                                    user.t_llegada)
    previousnUsers: int = events['nUsers'][-1] if events['nUsers'].any() else 0
    events['nUsers'] = np.append(events['nUsers'],
                                    previousnUsers + 1)
    return events

# def calcular_meritos(usuarios: usuario, jornada_laboral: int):
#     # tiempos_llegada: np.array = np.fromiter(
#     #     (usuario.t_llegada for usuario in usuarios),
#     #     dtype=int
#     #     )
#     # instantes_servicio: np.array = np.fromiter(
#     #     (usuario.instante_servicio for usuario in usuarios),
#     #     dtype=int
#     #     )
    
#     # tiempos_espera: np.array = tiempos_llegada - instantes_servicio
#     # medi_espera: float = np.mean(tiempos_espera)

#     tiempos_servicio: np.array = np.fromiter(
#         (usuario.t_servicio for usuario in usuarios),
#         dtype=int
#     )

#     porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \
#                                  * 100
    
    
def calc_tmean_jornada(usuarios: usuario, jornada_laboral: int) -> float:
    '''
    Calcula el tiempo medio de espera en ola de un usuario promediado en una
    jornada diaria.
    '''
    # ESTO VA A DAR ERROR: NO TODOS LOS USUARIOS HAN SIDO SERVIDOR, POR LO QUE
    # NO TODOS TENDRÁN EL ATRIBUTO instante_servicio
    # ## error solucionado ##
    tiempos_llegada: np.array = np.fromiter(
        (usuario.t_llegada for usuario in usuarios),
        dtype=int
        )
    instantes_servicio: np.array = np.fromiter(
        (usuario.instante_servicio for usuario in usuarios),
        dtype=int
        )
    
    tiempos_espera: np.array = instantes_servicio - tiempos_llegada
    medi_espera: float = np.mean(tiempos_espera)

    return medi_espera


def calc_pct_ocupation(usuarios: usuario, jornada_laboral: int) -> float:
    '''
    Calcula el tanto por ciento de ocupación del servidor.
    '''
    tiempos_servicio: np.array = np.fromiter(
        (usuario.t_servicio for usuario in usuarios),
        dtype=int
    )

    # porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \
    #                              * 100
    porcentaje_servido: float = (np.sum(tiempos_servicio[:-1]) / jornada_laboral) \
                                 * 100
    pc_ocupation2: float = (np.sum(tiempos_servicio) / jornada_laboral) \
                                 * 100

    return porcentaje_servido, pc_ocupation2

def calc_meanUsers(events: dict, jornada_laboral: int) -> float:
    '''
    Calcula el número medio de usuarios en la cola en una jornada diaria.
    '''
    time_increments: np.array = np.diff(events['hour'])
    out_mean: np.array = np.sum(np.multiply(
        events['nUsers'][:-1],
        time_increments)
        ) / jornada_laboral

    return out_mean