2016-04-08 4 views
1

Я выполняю имитацию белково-белковых взаимодействий. Я использую Python для кодирования логических ворот как функций моделирования взаимодействия белков. Моя модель в основном представляет собой группу групп (g0 - g4), содержащую логические ворота (см. Изображение). Первоначально я установил list, содержащий мои группы, а затем для каждой группы dict, который содержит белки (узлы) с их начальными значениями (их так называемые seedValues, которые являются начальными параметрами для сети на t=0).Выполнение последовательности логических логических групп

Мой вопрос заключается в следующем: есть ли какой-то способ переборе моих групп (и их функции логика ворот), который начинается в группе 0 (g0 в образе) в t, и что в t=t+1 выполняет группы g0 и g1, затем выполняет три группы g0, g1 и g2 по адресу t=t+2 и т. д. до t=m, где m - количество итераций, которые хотели?

Уточнение: Возможно, я не знаю. Моя проблема заключается в следующем: скажем, что я пишу функцию, которая проходит через мои группы, по одному за раз. Она начинается в g0 в момент времени t=0 и выполняет, хранит и выводит все ворота в этой группе, а также все ворота «вперед» по себе (g1 к g4). Когда это будет сделано, функция отметит время на один шаг вперед (t=t+1) и отправится в g1 и снова выдает результаты, включая вывод групп g2 в g4. Теперь возникает ошибка: для точной модели мне нужно выполнить g0 в тоже время t=t+1, до шаг программы g2. Как я могу сделать вывод своей программы такими последовательными «волнами» исполнения? Я думаю, мне, возможно, придется использовать ретрансляцию , но я не знаю, как это сделать.

См. Пример изображения того, что я имею в виду под «группами» here. заметки Изображение: и B переключатели (программа должна изменить их, как способ изучения возмущений), C постоянная (не изменяется). J - выход (главным образом для шоу). D и F построены таким образом, чтобы колебаться, когда = 0.

Я искал для этого на Stack бирже и переполнение стека; в то время как я вижу много вопросов, которые касаются моей области интереса (1, 2), я не вижу никаких определений, которые я определяю конкретно для решения моих проблем. Спасибо за ваше время.

+0

Возможно, что-то здесь отсутствует. Единственная веская причина для создания многопоточной/многопроцессорной программы - это производительность. Если вы еще не написали программу, как вы знаете, что она недостаточно быстро? Просто потому, что компоненты схемы работают параллельно, не означает, что внутренняя структура вашей программы должна выполнять вычисления параллельно. Важно то, что программа создает точную модель того, что делает цепь (белок). Зачем усложнять задачу, написав многопоточную программу? –

+0

Я обновил свой вопрос, чтобы лучше отразить то, что я ищу. Пожалуйста, ознакомьтесь с моим уточнением в исходном вопросе. –

ответ

0

Кажется, что ваша проблема сводится к паре вложенных циклов. Если вы поместите все группы в список с именем gx, и вы увеличиваете время t в шагах от 0 до некоторого значения tmax, это похоже на это в Python ...

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

Каждый раз, когда вы увеличиваете t, еще одна группы получает выполняются в дополнении ко всем предыдущим. Извиняюсь, если я еще не понял.

+0

Это прекрасно, спасибо. У меня был очень близорукий взгляд на мою проблему по сравнению с ее решением. –

0

Для цифрового моделирования, управляемого событиями, или discrete event simulation, в качестве базовой структуры данных часто используется «временное колесо» или «колесо синхронизации». Колесо в основном представляет собой массив, в котором каждый элемент указывает на список или динамический вектор имитируемых событий, которые имеют одинаковое значение для «колесо в режиме времени».

Timewheel, как показано here: enter image description here

timewheel является более эффективным, чем priority queue, который также может быть использован для обработки событий моделирования в порядке возрастания их временных меток.

Псевдо-код событийного логического моделирования:

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

Для обработки группировки ворота, вы могли бы рассматривать каждую группу в качестве супер-ворот с несколькими выходами. Возможно, потребуется смоделировать различные задержки задержки в данной группе ворот.

Вместо того, чтобы писать свой собственный симулятор, вы можете описать свою схему в Hardware Description Language, например Verilog, и использовать ready-made simulator.

+0

Это похоже на отличный подход к моему вопросу. Как и ваш отличный ответ, я решил моделировать свои ворота в серии групп, где одна группа выполняется за каждый шаг времени. Я описываю это графически! [Как это] (http://i.imgur.com/4dCtTqm.jpg), что очень хорошо соответствует структурам данных, созданным событиями, которые вы предложили. Спасибо за ваш вклад! –

Смежные вопросы