グループの複数のレイヤーを介して暗黙的にリンクされている変数へのアクセスに問題があります。ドキュメントによると:
新しい OpenMDAO では、グループはコンポーネントではなく、独自の変数を持ちません。変数は、promotes 引数を add 呼び出しに渡すことでグループ レベルに昇格できます。
group = Group() group.add('comp1', Times2(), promotes=['x'])
これにより、comp1 に属する変数 x に group.params['x'] を介してアクセスできるようになります。
ただし、サブサブグループの変数にアクセスしようとすると、エラーが発生します。動作する例と動作しない例を示す以下の例を参照してください。
from openmdao.api import Component, Group, Problem
import numpy as np
class Times2(Component):
def __init__(self):
super(Times2, self).__init__()
self.add_param('x', 1.0, desc='my var x')
self.add_output('y', 2.0, desc='my var y')
def solve_nonlinear(self, params, unknowns, resids):
unknowns['y'] = params['x'] * 2.0
def linearize(self, params, unknowns, resids):
J = {}
J[('y', 'x')] = np.array([2.0])
return J
class PassGroup1(Group):
def __init__(self):
super(PassGroup1, self).__init__()
self.add('t1', Times2(), promotes=['*'])
class PassGroup2(Group):
def __init__(self):
super(PassGroup2, self).__init__()
self.add('g1', PassGroup1(), promotes=['*'])
prob = Problem(root=Group())
prob.root.add('comp', PassGroup2(), promotes=['*'])
prob.setup()
prob.run()
# this works
print prob.root.comp.g1.t1.params['x']
# this does not
print prob.root.params['x']
これが機能しない理由と、下位レベルのグループの知識がなくても変数をトップレベルで使用できるようにする方法を説明していただけますか?