0

あるコンポーネントの勾配が必然的に別のコンポーネントで計算される状況があります。私がやろうとしたことは、勾配を最初のコンポーネントからの出力と2番目のコンポーネントへの入力にすることです。他の計算に影響を与えないように、pass_by_obj に設定しました。これが最善の方法であるかどうかについての推奨事項をいただければ幸いです。それにもかかわらず、check_partial_derivatives() を使用するとエラーが発生します。pass_by_obj として指定された任意の出力に対してエラーになるようです。以下は単純なケースです。

import numpy as np
from openmdao.api import Group, Problem, Component, ScipyGMRES, ExecComp, IndepVarComp

class Comp1(Component):
    def __init__(self):
        super(Comp1, self).__init__()
        self.add_param('x', shape=1)

        self.add_output('y', shape=1)
        self.add_output('dz_dy', shape=1, pass_by_obj=True)

    def solve_nonlinear(self, params, unknowns, resids):

        x = params['x']

        unknowns['y'] = 4.0*x + 1.0
        unknowns['dz_dy'] = 2.0*x

    def linearize(self, params, unknowns, resids):

        J = {}
        J['y', 'x'] = 4.0
        return J

class Comp2(Component):
    def __init__(self):
        super(Comp2, self).__init__()
        self.add_param('y', shape=1)
        self.add_param('dz_dy', shape=1, pass_by_obj=True)

        self.add_output('z', shape=1)

    def solve_nonlinear(self, params, unknowns, resids):
        y = params['y']
        unknowns['z'] = y*2.0

    def linearize(self, params, unknowns, resids):
        J = {}
        J['z', 'y'] = params['dz_dy']
        return J

class TestGroup(Group):
    def __init__(self):
        super(TestGroup, self).__init__()
        self.add('x', IndepVarComp('x', 0.0), promotes=['*'])
        self.add('c1', Comp1(), promotes=['*'])
        self.add('c2', Comp2(), promotes=['*'])

p = Problem()
p.root = TestGroup()
p.setup(check=False)

p['x'] = 2.0

p.run()

print p['z']
print 'gradients'
test_grad = open('partial_gradients_test.txt', 'w')
partial = p.check_partial_derivatives(out_stream=test_grad)

次のエラー メッセージが表示されます。

partial = p.check_partial_derivatives(out_stream=test_grad)
  File "/usr/local/lib/python2.7/site-packages/openmdao/core/problem.py", line 1699, in check_partial_derivatives
    dresids._dat[u_name].val[idx] = 1.0
TypeError: '_ByObjWrapper' object does not support item assignment

前に、check_partial_derivatives() で pass_by_obj のパラメーターがチェックされていることについて尋ねましたが、単純に pass_by_obj の未知数もチェックするだけかもしれません。

4

1 に答える 1

0

あなたが得ているエラーは、check_partial_derivatives 関数に関連する別のバグです。簡単に修正できるはずですが、当面は pass_by_obj 設定を削除してください。あるコンポーネントで値を計算して別のコンポーネントに渡すため、 pass_by_obj を実行する必要はまったくありません (実行しない方が効率的です)。

「他の計算に影響を与えないように」とおっしゃっていましたが、その意味がよくわかりません。solve_nonlinear メソッドで使用しない限り、何にも影響しません。

于 2015-12-29T22:08:37.567 に答える