53 lines
1.4 KiB
Python
53 lines
1.4 KiB
Python
from modele.matrice import Matrice
|
|
|
|
|
|
class Cocosim(object):
|
|
def __init__(self, conf, graphe, scenario, observateur):
|
|
self.conf = conf
|
|
self.graphe = graphe
|
|
self.scenario = scenario
|
|
if 'max' in self.scenario:
|
|
self.max_cycles = self.scenario['max']
|
|
else:
|
|
self.max_cycles = None
|
|
self.n_cycle = 0
|
|
self.matrice = Matrice(self.graphe)
|
|
self.observatoire = {}
|
|
self.observateur = observateur
|
|
for k,_,_ in self.observateur:
|
|
self.observatoire[k] = []
|
|
|
|
def cycle(self):
|
|
"""
|
|
Un cycle se fait en deux passes plus la mise à jour des composants.
|
|
"""
|
|
if self.n_cycle in self.scenario:
|
|
[f(self.graphe[x]) for x, f in self.scenario[self.n_cycle]]
|
|
|
|
self.graphe.init_cycle()
|
|
|
|
# Passe 1
|
|
self.matrice.init_mat()
|
|
xvect = self.matrice.solve()
|
|
self.graphe.passe_calcul(xvect)
|
|
|
|
# Passe 2 (pour les diodes)
|
|
self.matrice.init_mat()
|
|
xvect = self.matrice.solve()
|
|
self.graphe.passe_calcul(xvect)
|
|
|
|
# Mise à jour des états
|
|
self.graphe.update()
|
|
self.graphe.coherence()
|
|
|
|
for k, obj, fun in self.observateur:
|
|
self.observatoire[k].append(fun(self.graphe[obj]))
|
|
|
|
self.n_cycle += 1
|
|
|
|
def run(self):
|
|
for cycle in range(self.max_cycles):
|
|
self.cycle()
|
|
|
|
|