2016-04-08 7 views
1

Ich mache eine Simulation von Protein-Protein-Interaktionen. Ich verwende Python, um logische Gatter als Funktionen zu modellieren, um Proteininteraktionen zu modellieren. Mein Modell ist im Grunde eine Reihe von Gruppen (g0 bis g4) mit Logikgattern (siehe Bild). Anfangs habe ich eine list mit meinen Gruppen eingerichtet, und dann für jede Gruppe eine dict, die Proteine ​​(Knoten) mit ihren Startwerten enthält (ihre sogenannten seedValues, die die Startparameter für das Netzwerk sind t=0).Durch eine Sequenz von gruppierten Logikgattern gehen

Meine Frage ist: Gibt es eine Möglichkeit, meine Gruppen von Iterieren durch (und ihre Funktionen Logikgatter), dass bei Gruppe bei t 0 (g0 im Bild) beginnt, und dass bei t=t+1 führt Gruppen g0 und g1, Führt dann die drei Gruppen g0, g1 und g2 bei t=t+2 aus, und so weiter bis t=m, wobei m die Anzahl der gewünschten Iterationen ist?

Erläuterung: Vielleicht bin ich unklar. Mein Problem ist das: Sagen Sie, dass ich eine Funktion schreibe, die nacheinander durch meine Gruppen geht. Es beginnt bei g0 zum Zeitpunkt t=0 und führt, speichert und gibt alle Gattern in dieser Gruppe, sowie alle Tore „ahead“ von selbst (g1 zu g4). Wenn dies erledigt ist, tickt die Funktion die Zeit um einen Schritt vorwärts (t=t+1) und geht zu und executes wieder einschließlich der Ausgabe Gruppen g2 zu g4. Jetzt schleicht sich ein Fehler ein: für ein genaues Modell muss ich g0 zur Zeit t=t+1 auch ausführen, vor die Programmschritte zu g2. Wie kann ich mein Programm so sequentielle "Wellen" der Ausführung ausgeben lassen? Ich stelle mir vor, ich müsste Rekursion verwenden, aber ich weiß nicht wie.

Siehe Beispiel Bild von was ich meine mit "Gruppen" here. Bild Anmerkungen: A und B sind Schalter (das Programm soll sie ändern, als eine Möglichkeit, Störungen des Studiums), C ist eine Konstante (nie geändert). J ist der Ausgang (meistens für Show). D und F sind so gebaut zu schwingen, sobald A = 0.

Ich habe dafür auf Stack Exchange und Stack-Überlauf gesucht; Während ich viele Fragen tangiere, die meinen Interessensbereich berühren (1, 2), sehe ich keine, die ich spezifisch bestimmt, um meine Probleme zu lösen. Vielen Dank für Ihre Zeit.

+0

Wahrscheinlich vermisse ich hier etwas. Der einzige gute Grund, ein Multithread-/Multiprocess-Programm zu erstellen, ist Performance. Wenn Sie das Programm noch nicht geschrieben haben, woher wissen Sie, dass es nicht schnell genug ist? Nur weil die Schaltungskomponenten parallel funktionieren, bedeutet dies nicht, dass die interne Struktur Ihres Programms die Berechnungen parallel durchführen muss. Was zählt, ist, dass das Programm ein genaues Modell dessen erzeugt, was die Schaltung (Protein) tut. Warum verkomplizieren Sie Ihre Aufgabe, indem Sie ein Multithread-Programm schreiben? –

+0

Ich habe meine Frage aktualisiert, um besser zu reflektieren, was ich tun möchte. Bitte beachten Sie meine Klarstellung in der Originalfrage. –

Antwort

0

Es scheint mir Ihr Problem reduziert sich auf ein paar verschachtelte Schleifen. Wenn Sie alle Gruppen in eine Liste mit dem Namen gx einfügen und die Zeit t in Schritten von 0 bis zu einem Wert von tmax erhöhen, sieht das in Python so aus ...

for t in range(tmax): 
    for i in range(t): 
     nodeExecute(gx[i]) 

Jedes Mal, wenn Sie t erhöhen, wird eine weitere Gruppe zusätzlich zu allen vorherigen ausgeführt. Entschuldigung, wenn ich es immer noch nicht verstanden habe.

+0

Das wird perfekt, vielen Dank. Ich hatte eine sehr kurzsichtige Sichtweise auf mein Problem gegenüber seiner Lösung. –

0

Für die ereignisgesteuerte digitale Simulation oder discrete event simulation wird oft ein "Zeitrad" oder "Zeitmessrad" als grundlegende Datenstruktur verwendet. Das Rad ist im Grunde ein Array, bei dem jedes Element auf eine Liste oder einen dynamischen Vektor simulierter Ereignisse zeigt, die den gleichen Wert für "time mod wheelsize" haben.

Zeitrad wie dargestellt here: enter image description here

Ein Zeitrad ist effizienter als ein priority queue, die auch verwendet werden, um die Simulation Ereignisse in ansteigender Reihenfolge ihrer Zeitstempel zu verarbeiten.

Pseudo-Code von ereignisgesteuerten Logiksimulation:

t = tStart 
While (t < tEnd) { 
    process all events scheduled for t and schedule follow-up events 
    schedule events from signal sources 
    t = t + 1 
} 

die Gruppierung von Gattern zu behandeln, könnten Sie jede Gruppe als ein Super-Tor mit mehreren Ausgängen behandeln. Es könnte notwendig sein, unterschiedliche Latenzverzögerungen innerhalb einer gegebenen Gruppe von Gattern zu modellieren.

Anstatt Ihren eigenen Simulator zu schreiben, könnten Sie Ihre Schaltung in einer Hardware Description Language wie Verilog beschreiben und eine ready-made simulator verwenden.

+0

Dies scheint eine gute Annäherung an meine Frage. Wie Ihre ausgezeichnete Antwort nahelegt, habe ich beschlossen, meine Tore in einer Reihe von Gruppen zu modellieren, wobei eine Gruppe pro Zeitschritt ausgeführt wird. Ich beschreibe es grafisch (so) (http://i.imgur.com/4dCtTqm.jpg), was ziemlich gut zu den von Ihnen vorgeschlagenen ereignisgesteuerten Datenstrukturen passt. Danke für deinen Beitrag! –