Аналогичный вопрос / ответ на Проблемы, связанные с установкой ограничения через пакет mystic .
Упрощение с неравенствами занимает много времени, поскольку оно циклически повторяет все возможные перестановки знаков и предполагает наихудший случай для выделения одной переменной в левой части каждого уравнения. Выполнение следующих действий приведет к выделению одного уравнения за один раз, которое затем можно (теоретически) связать с ключевым словом ограничений «соединение», или, как показано ниже:
>>> import mystic
>>> import numpy as np
>>> G = np.random.random((16,30)) * 100
>>> h = np.random.random((16,)) * 1000
>>> c = mystic.symbolic.linear_symbolic(np.ones(30),[1.],G,h)
>>> c = c.strip().split('\n')
>>> cs = '\n'.join(mystic.symbolic.simplify(ci, target='x{i}'.format(i=i)) for i,ci in enumerate(c))
>>> cons = mystic.symbolic.generate_constraint(mystic.symbolic.generate_solvers(cs))
Проблема, по-видимому, заключается в том, что, хотя решение для 30 переменных работает в целом, переход к 100 на строку слишком большой нагрузкой на память используемого компьютера. Таким образом, буквально проблема заключается в том, что код для упрощения неравенств не так эффективен, как это может быть для простых случаев, и становится медленным, как только он начинает привязывать память. Мне придется посмотреть на уменьшение объема памяти ... но вы можете обойти его для своего случая, выполнив еще одно ручное упрощение (все, что нужно сделать, - это выделить одну переменную с каждой левой стороны. каждого уравнения).
В приведенном выше случае это быстро для 10 переменных, но занимает около минуты или около того. Для случая, когда явно существует одна переменная, которая используется только один раз, и, следовательно, ее легко изолировать, это не должно занять много времени. , Я уверен, что с небольшой очисткой я могу уменьшить требования к памяти для функции. Я создал заявку на эту проблему: https://github.com/uqfoundation/mystic/issues/113.