Аргакс в сименгине или эквивалентной альтернативе - PullRequest
1 голос
/ 11 апреля 2019

Я работаю над простым моделированием сети нелинейных систем.В частности, у меня есть 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>

...