接続コマンドを分割する最良の方法を知りたいです。モジュール化したい 2 つのグループがあります。内側のグループと外側のグループです。内側のグループを、外側のグループのすべての接続を変更することなく、内側のグループを切り替えたり変更したりできる一種のブラック ボックスにしたいと考えています。外側のグループが内側のグループの入力と出力を知る必要があるだけです。例:
import numpy as np
from openmdao.api import Group, Problem, Component, IndepVarComp, ExecComp
class C(Component):
def __init__(self, n):
super(C, self).__init__()
self.add_param('array_element', shape=1)
self.add_output('new_element', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
unknowns['new_element'] = params['array_element']*2.0
class MUX(Component):
def __init__(self, n):
super(MUX, self).__init__()
for i in range(n):
self.add_param('new_element' + str(i), shape=1)
self.add_output('new_array', shape=n)
self.n = n
def solve_nonlinear(self, params, unknowns, resids):
new_array = np.zeros(n)
for i in range(n):
new_array[i] = params['new_element' + str(i)]
unknowns['new_array'] = new_array
class GroupInner(Group):
def __init__(self, n):
super(GroupInner, self).__init__()
for i in range(n):
self.add('c'+str(i), C(n))
self.connect('array', 'c'+str(i) + '.array_element', src_indices=[i])
self.connect('c'+str(i)+'.new_element', 'new_element'+str(i))
self.add('mux', MUX(n), promotes=['*'])
class GroupOuter(Group):
def __init__(self, n):
super(GroupOuter, self).__init__()
self.add('array', IndepVarComp('array', np.zeros(n)), promotes=['*'])
self.add('inner', GroupInner(n), promotes=['new_array'])
for i in range(n):
# self.connect('array', 'inner.c'+str(i) + '.array_element', src_indices=[i])
self.connect('array', 'inner.array', src_indices=[i])
n = 3
p = Problem()
p.root = GroupOuter(n)
p.setup(check=False)
p['array'] = np.ones(n)
p.run()
print p['new_array']
コードを実行すると、次のエラーが表示されます。
NameError: Source 'array' cannot be connected to target 'c0.array_element': 'array' does not exist.
これを解決するために、'array' を GroupInner グループの IndepVarComp にしました。ただし、これを行うと、エラーが発生します。
NameError: Source 'array' cannot be connected to target 'inner.array': Target must be a parameter but 'inner.array' is an unknown.
私は完全な接続を確立するだけでよいことを知っています: しかし、私が言ったように、GroupInner は、その中にどのグループやコンポーネントがあるかわからないブラック ボックスのようなものにしたいと考えています。array_elements が異なるため、すべてを昇格させることもできません。これを行うことは可能ですか、それとも接続全体を 1 つのコマンドで行う必要がありますか?