Я работаю над простым моделированием сети нелинейных систем.В частности, у меня есть N узлов, каждый из которых состоит из m блоков.Функция вывода каждого блока зависит как от его активности, так и от активности других блоков в том же узле.
Я реализовал симуляцию в scipy + jitcode.
Первая версия, которую я реализовал, была в соответствии с распределением softmax, поэтому я реализовал эту простую функцию для вычисления выходных данных каждого блока.
def soft_max(node_activities):
"""
This function computes the output of all the mini-columns
:param nodes_activities: Activities of the minicolumns grouped in nested lists
:return: One unique list with all the outputs
"""
G = 10
act = []
for node in nodes_activities:
sum_hc = 0
for unit in node:
sum_hc += symengine.exp(unit * G)
for unit in node:
act.append(symengine.exp(unit * G)/sum_hc)
return act
Теперь я хотел бы заменить функциювыше с простым, который для каждого узла выводит 1 для блока с самой высокой активностью и 0 в других единицах.Короче говоря, для каждого узла есть один и только один модуль, выводящий 1.
Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, как сделать это с symengine, чтобы он мог использоваться jitcode.Функция, которую я реализую ниже, не работает по очевидной причине.Думаю, условие if не очень символично.
def soft_max(node_activities):
"""
This function computes the output of all the mini-columns
:param nodes_activities: Activities of the minicolumns grouped in nested lists
:return: One unique list with all the outputs
"""
G = 10
act = []
for node in nodes_activities:
max_act = symengine.Max(*node)
for unit in node:
if unit >= max_act:
act.append(1)
else:
act.append(0)
return act
Я не нашел ни функции symengine.argmax (), ни какого-либо разумного альтернативного решения.Есть ли у вас какие-либо предложения?
ОБНОВЛЕНИЯ
def max_activation(activities):
act = []
for hc in activities:
sum_hc = 0
max_act = symengine.Max(*hc)
for mc in hc:
act.append(symengine.GreaterThan(mc, max_act))
print(act)
return act
Проверка этой функции:
max_activation([[y(1), y(2)], [y(3), y(4)]])
Я получаю следующий вывод, который как-то обещает,Я обновлю, как только у меня будут некоторые тесты.
[max (y (2), y (1)) <= y (1), max (y (2), y (1)) <= y (2)] </p>
[max (y (4), y (3)) <= y (3), max (y (4), y (3)) <= y (4)] </p>