class TestEstadoIncubandoSism(unittest.TestCase):
    grafo = nx.scale_free_graph(100)
    modelo = crear_modelo_SISM(grafo,
                               tiempo_incubacion=1,
                               tiempo_inf_mild=0,
                               tiempo_inf_grave=2,
                               probabilidad_de_estar_incubando=1,
                               probabilidad_deceso=1,
                               probabilidad_riesgo=0,
                               probabilidad_infecc_grave_riesgo=0,
                               probabilidad_infecc_grave=1,
                               probabilidad_deceso_riesgo=0)

    nodo = 0

    def test_el_estado_se_instancia_correctamente(self):
        estado = EstadoInfectadoMildSISM(tiempo_infeccion=5)

        self.assertEqual(estado.tiempo_infeccion, 5)
        self.assertEqual(estado.__class__.__name__, ESTADO_INFECTADO_MILD)

    def test_al_transicionar_el_tiempo_de_infeccion_se_reduce_una_unidad(self):
        estado = EstadoInfectadoMildSISM(tiempo_infeccion=5)

        self.grafo.nodes[self.nodo]['riesgo'] = False

        self.grafo.graph['prob_de_deceso'] = 0

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.tiempo_infeccion, 4)

    def test_al_transicionar_si_el_tiempo_de_infeccion_no_es_cero_el_estado_no_cambia(
            self):
        estado = EstadoInfectadoMildSISM(tiempo_infeccion=5)

        self.grafo.nodes[self.nodo]['riesgo'] = False

        self.grafo.graph['prob_de_deceso'] = 0

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__,
                         ESTADO_INFECTADO_MILD)

    def test_cuando_el_tiempo_de_infeccion_llega_a_cero_el_estado_pasa_a_susceptible(
            self):
        estado = EstadoInfectadoMildSISM(tiempo_infeccion=1)

        self.grafo.nodes[self.nodo]['riesgo'] = False

        self.grafo.graph['prob_de_deceso'] = 0

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__, ESTADO_SUSCEPTIBLE)
class TestEstadoIncubandoSism(unittest.TestCase):
    grafo = nx.scale_free_graph(10)
    modelo = crear_modelo_SISM(grafo,
                               tiempo_incubacion=1,
                               tiempo_inf_mild=0,
                               tiempo_inf_grave=2,
                               probabilidad_de_estar_incubando=1,
                               probabilidad_deceso=1,
                               probabilidad_riesgo=0,
                               probabilidad_infecc_grave_riesgo=0,
                               probabilidad_infecc_grave=1,
                               probabilidad_deceso_riesgo=0)

    nodo = 0

    def test_el_estado_se_instancia_correctamente(self):
        estado = EstadoSusceptibleSISM()

        self.assertEqual(estado.__class__.__name__, ESTADO_SUSCEPTIBLE)

    def test_al_transicionar_si_todos_los_vecinos_estan_incubando_el_nodo_se_contagia(
            self):
        self.grafo.nodes[self.nodo]['estado'] = EstadoSusceptibleSISM()
        estado = self.grafo.nodes[self.nodo]['estado']

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__, ESTADO_INCUBANDO)

    def test_al_transicionar_si_ninguno_de_los_vecinos_esta_incubando_el_nodo_no_se_contagia(
            self):
        self.grafo.nodes[self.nodo]['estado'] = EstadoSusceptibleSISM()
        estado = self.grafo.nodes[self.nodo]['estado']

        for vecino in self.grafo.neighbors(self.nodo):
            self.grafo.nodes[vecino]['estado'] = EstadoSusceptibleSISM()

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__, ESTADO_SUSCEPTIBLE)
예제 #3
0
class TestEstadoIncubandoSism(unittest.TestCase):
    grafo = nx.scale_free_graph(100)
    modelo = crear_modelo_SISM(grafo,
                               tiempo_incubacion=1,
                               tiempo_inf_mild=0,
                               tiempo_inf_grave=2,
                               probabilidad_de_estar_incubando=1,
                               probabilidad_deceso=1,
                               probabilidad_riesgo=0,
                               probabilidad_infecc_grave_riesgo=0,
                               probabilidad_infecc_grave=1,
                               probabilidad_deceso_riesgo=0)

    nodo = 0

    def test_el_estado_se_instancia_correctamente(self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=5)

        self.assertEqual(estado.tiempo_incubacion, 5)
        self.assertEqual(estado.__class__.__name__, ESTADO_INCUBANDO)

    def test_al_transicionar_el_tiempo_de_incubacion_se_reduce_una_unidad(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=5)
        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.tiempo_incubacion, 4)

    def test_al_transicionar_si_el_tiempo_de_incubacion_no_es_cero_el_estado_no_cambia(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=5)
        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__, ESTADO_INCUBANDO)

    def test_si_no_es_de_riesgo_y_se_infecta_gravemente_el_nuevo_estado_es_infectado_grave(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=1)

        self.grafo.nodes[self.nodo]['riesgo'] = False

        self.grafo.graph['prob_infec_grave_riesgo'] = 0
        self.grafo.graph['prob_infec_grave'] = 1

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__,
                         ESTADO_INFECTADO_GRAVE)

    def test_si_es_de_riesgo_y_se_infecta_gravemente_el_nuevo_estado_es_infectado_grave(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=1)

        self.grafo.nodes[self.nodo]['riesgo'] = True

        self.grafo.graph['prob_infec_grave_riesgo'] = 1
        self.grafo.graph['prob_infec_grave'] = 0

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__,
                         ESTADO_INFECTADO_GRAVE)

    def test_si_no_es_de_riesgo_y_no_se_infecta_gravemente_el_nuevo_estado_es_infectado_mild(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=1)

        self.grafo.nodes[self.nodo]['riesgo'] = False

        self.grafo.graph['prob_infec_grave_riesgo'] = 1
        self.grafo.graph['prob_infec_grave'] = 0

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__,
                         ESTADO_INFECTADO_MILD)

    def test_si_es_de_riesgo_y_no_se_infecta_gravemente_el_nuevo_estado_es_infectado_mild(
            self):
        estado = EstadoIncubandoSISM(tiempo_incubacion=1)

        self.grafo.nodes[self.nodo]['riesgo'] = True

        self.grafo.graph['prob_infec_grave_riesgo'] = 0
        self.grafo.graph['prob_infec_grave'] = 1

        nuevo_estado = estado.transicionar(self.nodo, self.grafo)

        self.assertEqual(nuevo_estado.__class__.__name__,
                         ESTADO_INFECTADO_MILD)
예제 #4
0
파일: simulador.py 프로젝트: tomyjara/tprse
def main():
    global grafo

    nombre_archivo_salida = input(
        "Ingrese el nombre del archivo en el que quiere los resultados \n")

    print("Cantidad de veces que corre: ")

    repeticiones = int(input("Numero: "))

    print("Elegí el modelo:\n" "[1] SIS\n" "[2] SIR\n" "[3] SIRS\n")

    input_modelo = input("Numero: ")

    print("Elegí el grafo:\n"
          "[1] Scale\n"
          "[2] Grid\n"
          "[3] Small World\n"
          "[4] Random\n"
          "[5] Tree Balanceado\n")
    num_grafo = input("Numero: ")

    # TODO: Random graph
    # TODO: No balanced tree
    try:
        if num_grafo == '1':
            cantidad_de_nodos = int(input("Cantidad de nodos: "))
            grafo = nx.scale_free_graph(cantidad_de_nodos)
            grafo.graph['tipo'] = "Scale Free"
        elif num_grafo == '2':
            cantidad_de_nodos_x = int(input("Cantidad nodos X: "))
            cantidad_de_nodos_y = int(input("Cantidad nodos Y: "))
            grafo = nx.grid_graph(
                dim=[cantidad_de_nodos_x, cantidad_de_nodos_y])
            grafo.graph['tipo'] = "Grid " + str(
                cantidad_de_nodos_x) + "x" + str(cantidad_de_nodos_y)
        elif num_grafo == '3':
            cantidad_de_nodos = int(input("Cantidad de nodos: "))
            vecinos_mas_cerca = int(input("Cantidad de vecinos: "))
            prob_de_rewiring_cada_eje = float(
                input("Probabilidad de rewiring [0,1]: "))

            if prob_de_rewiring_cada_eje > 1 or prob_de_rewiring_cada_eje < 0:
                print("Invalid probability")
                return

            grafo = nx.watts_strogatz_graph(cantidad_de_nodos,
                                            vecinos_mas_cerca,
                                            prob_de_rewiring_cada_eje)
            grafo.graph['tipo'] = "Small world"
        elif num_grafo == '4':
            grado_de_nodo = int(input("Grado de salida de los nodos: "))
            cantidad_de_nodos = int(input("Cantidad de nodos: "))
            seed = int(input("Seed: "))
            grafo = nx.random_regular_graph(grado_de_nodo, cantidad_de_nodos,
                                            seed)
            grafo.graph['tipo'] = "Random graph"
        elif num_grafo == '5':
            d = int(input("Grado de salida de los nodos: "))
            lamb = int(input("Distancia maxima entre nodos: "))
            grafo = nx.balanced_tree(d, lamb)
            grafo.graph['tipo'] = "Balanced Tree"
        else:
            raise Exception("Tipo de grafo invalido")

        probabilidad_de_estar_incubando = float(
            input("Probabilidad de estar infectado: "))
        cantidad_de_iteraciones = int(input("Numero de iteraciones: "))

        if probabilidad_de_estar_incubando > 1 or probabilidad_de_estar_incubando < 0:
            raise Exception("Probabilidad inválida")

        if input_modelo == '1':
            modelo = crear_modelo_SISM(
                un_grafo=grafo,
                probabilidad_de_estar_incubando=probabilidad_de_estar_incubando
            )
            correr_modelo_SISM(modelo, cantidad_de_iteraciones, repeticiones,
                               nombre_archivo_salida)
        elif input_modelo == '2':
            modelo = crear_modelo_SIRM(
                un_grafo=grafo,
                probabilidad_de_estar_incubando=probabilidad_de_estar_incubando
            )
            correr_modelo_SIRM(modelo, cantidad_de_iteraciones, repeticiones,
                               nombre_archivo_salida)
        elif input_modelo == '3':
            modelo = crear_modelo_SIRMS(
                un_grafo=grafo,
                probabilidad_de_estar_incubando=probabilidad_de_estar_incubando
            )
            correr_modelo_SIRMS(modelo, cantidad_de_iteraciones, repeticiones,
                                nombre_archivo_salida)
    except ValueError:
        raise Exception("Input numerico invalido")
예제 #5
0
def main():
    try:
        input_modelo = sys.argv[1]
        tipo_de_grafo = sys.argv[2]

        if tipo_de_grafo == "scale":
            check_parametros(7)
            cantidad_de_nodos = int(sys.argv[3])
            next_arg = 4
            grafo = nx.scale_free_graph(cantidad_de_nodos)
            grafo.graph['tipo'] = "Scale Free"

        elif tipo_de_grafo == "grid":
            check_parametros(9)
            cantidad_de_nodos_x = int(sys.argv[3])
            cantidad_de_nodos_y = int(sys.argv[4])
            next_arg = 5
            grafo = nx.grid_graph(
                dim=[cantidad_de_nodos_x, cantidad_de_nodos_y])
            grafo.graph['tipo'] = "Grid " + str(
                cantidad_de_nodos_x) + "x" + str(cantidad_de_nodos_y)

        elif tipo_de_grafo == "small_world":
            check_parametros(10)
            cantidad_de_nodos = int(sys.argv[3])
            vecinos_mas_cerca = int(sys.argv[4])
            prob_de_rewiring_cada_eje = float(sys.argv[5])
            next_arg = 6
            if prob_de_rewiring_cada_eje < 0 or prob_de_rewiring_cada_eje > 1:
                raise Exception("Probabilidad invalida")
            grafo = nx.watts_strogatz_graph(cantidad_de_nodos,
                                            vecinos_mas_cerca,
                                            prob_de_rewiring_cada_eje)
            grafo.graph['tipo'] = "Small world"

        elif tipo_de_grafo == "random":
            check_parametros(10)
            cantidad_de_nodos = int(sys.argv[3])
            grado_salida = int(sys.argv[4])
            seed = int(sys.argv[5])
            next_arg = 6
            grafo = nx.random_regular_graph(grado_salida, cantidad_de_nodos,
                                            seed)
            grafo.graph['tipo'] = "Random graph"

        elif tipo_de_grafo == "balanced_tree":
            check_parametros(9)
            d = int(sys.argv[3])  # Grado de salida de los nodos
            lamb = int(sys.argv[4])  # Distancia maxima entre par de nodos
            next_arg = 5
            grafo = nx.balanced_tree(d, lamb)
            grafo.graph['tipo'] = "Balanced Tree"

        else:
            raise Exception("Tipo de grafo invalido")

        probabilidad_de_estar_incubando = float(sys.argv[next_arg])
        next_arg += 1
        cantidad_de_iteraciones = int(sys.argv[next_arg])
        next_arg += 1

    except ValueError:
        raise Exception("Input numerico invalido")

    repeticiones = int(sys.argv[next_arg])
    next_arg += 1
    nombre_archivo_salida = sys.argv[next_arg]

    if input_modelo == 'SIS':
        modelo = crear_modelo_SISM(
            un_grafo=grafo,
            probabilidad_de_estar_incubando=probabilidad_de_estar_incubando)
        correr_modelo_SISM(modelo, cantidad_de_iteraciones, repeticiones,
                           nombre_archivo_salida)
    elif input_modelo == 'SIR':
        modelo = crear_modelo_SIRM(
            un_grafo=grafo,
            probabilidad_de_estar_incubando=probabilidad_de_estar_incubando)
        correr_modelo_SIRM(modelo, cantidad_de_iteraciones, repeticiones,
                           nombre_archivo_salida)
    elif input_modelo == 'SIRS':
        modelo = crear_modelo_SIRMS(
            un_grafo=grafo,
            probabilidad_de_estar_incubando=probabilidad_de_estar_incubando)
        correr_modelo_SIRMS(modelo, cantidad_de_iteraciones, repeticiones,
                            nombre_archivo_salida)