Допустим, у меня есть этот явный компонент с разреженным частичным объявлением. Есть ли способ изменить частичные индексы после того, как я настрою проблему и начну оптимизацию. Размер партиалов не изменится (скажем, всегда (4,1)), но расположение (строки/столбцы) изменится. Возможно ли это, может быть, есть хитрость?
import numpy as np
import openmdao.api as om
class SparsePartialComp(om.ExplicitComponent):
def setup(self):
self.add_input('x', shape=(4,))
self.add_output('f', shape=(2,))
self.declare_partials(of='f', wrt='x',
rows=[0, 1, 1, 1],
cols=[0, 1, 2, 3])
def compute_partials(self, inputs, partials):
# Corresponds to the [(0,0), (1,1), (1,2), (1,3)] entries.
partials['f', 'x'] = [1., 2., 3., 4.]
model = om.Group()
comp = om.IndepVarComp()
comp.add_output('x', np.ones(4))
model.add_subsystem('input', comp)
model.add_subsystem('example', SparsePartialComp())
model.connect('input.x', 'example.x')
problem = om.Problem(model=model)
problem.setup()
problem.run_model()
totals = problem.compute_totals(['example.f'], ['input.x'])
print(totals['example.f', 'input.x'])
Как и в случае с OpenMDAO V2.8, изменение шаблона разреженности на лету не допускается. Вы должны выяснить все записи, которые могут быть ненулевыми, и объявить их все.
Возможно, мы снимем это ограничение в будущем, хотя это не входит в планы на следующий год. Но даже если бы мы его добавили, это потребовало бы значительных накладных расходов для такого переключения «на лету», и было бы нецелесообразно делать это часто во время исполнения. Накладные расходы на настройку поглотили бы все остальное, если бы экономия на разреженности не была огромной --- 4x1 НЕ огромна :)
помимо размера (это большой ввод...) OpenMDAO необходимо знать полный шаблон разреженности, а не только конкретные индексы, которые не равны нулю для этой конкретной входной структуры. Скорее ему нужно знать все индексы, которые могут быть ненулевыми при любых условиях. Надеюсь, не все записи 25e6 для каждого входа будут ненулевыми!
Спасибо за ответ. Просто для ясности мой фактический компонент имеет 6 входов размером примерно 5000 на 5000 jacobian, поэтому я и спросил :=). Но я думаю, что лучше всего попытаться переформулировать мою проблему более эффективно.