我无法管理 record/access 衍生品 2

i can not manage to record/access derivatives 2

作为这个 question 的延续,我添加了一个虚拟代码,我无法使用它访问衍生品。 我还添加了 comp 变量。这只是一个转换问题的标志 具有显式组件或包含显式组件的组。

from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, SqliteRecorder, CaseReader
from openmdao.api import Group
from openmdao.api import ExplicitComponent
comp=True
class Exp(ExplicitComponent):    

    def setup(self):          
        self.add_input('des1',val=1)  
        self.add_input('des2',val=1)  
        self.add_output('out',val=1)                                          
        self.add_output('con',val=1)                                          
        self.declare_partials('*', '*',method='fd',step=0.001)

    def compute(self, inputs, outputs):
        outputs['out']=inputs['des1']**2+inputs['des2']
        outputs['con']=inputs['des1']

class AERO(Group):
    def setup(self):        
        self.add_subsystem('Exp',Exp(),promotes=['*'])


infodict={'desvar':{'des1':{"fdstep": 0.1,"init": 1.0,"max": 1.3,"min": 0.8},
                    'des2':{"fdstep": 0.1,"init": 2.0,"max": 1.3,"min": 0.8}}}

prob = Problem()
probname = prob.model = Group()
recordername='recorder1.sql'
GLOBAL_DESIGN_VAR = IndepVarComp()
probname.add_subsystem('GLOBAL_DESIGN_VAR', GLOBAL_DESIGN_VAR,promotes=['*'])

if comp:
    probname.add_subsystem('Exp', Exp(),promotes=['*']) 
else:
    probname.add_subsystem('AERO', AERO(),promotes=['*']) 


for key,val in infodict['desvar'].items():
    GLOBAL_DESIGN_VAR.add_output(key, val['init'])   
    probname.add_design_var(key,lower=val['min'], upper=val['max'])   

probname.add_objective('out')
probname.add_constraint('con',upper=0.1)

prob.driver=ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.driver.options['disp'] = True
prob.driver.options['tol'] = 1e-9

recorder = SqliteRecorder(recordername)
prob.driver.add_recorder(recorder)
#prob.driver.recording_options['includes'] = []
#prob.driver.recording_options['record_inputs'] = True
#        prob.driver.recording_options['record_outputs'] = True
#prob.driver.recording_options['record_objectives'] = True
#prob.driver.recording_options['record_constraints'] = True
#prob.driver.recording_options['record_desvars'] = True
prob.driver.recording_options['record_derivatives'] = True

prob.setup(check=True)

prob.run_driver()

prob.cleanup()

cr = CaseReader(recordername)

# driver_cases = cr.list_cases('driver')

# Get derivatives associated with the last iteration.
case = cr.get_case(-1)
print(case)

# check that derivatives have been recorded.
print(case.jacobian.keys())

我稍微清理了你的脚本,但除了 des2 上的初始条件不好(2.0 超出了你给定的范围)优化 运行 没问题。由于最初的猜测很糟糕,它命中了 maxiter 并给出了 NAN。不管怎样,衍生物都被记录下来了。

from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, SqliteRecorder, CaseReader
from openmdao.api import Group
from openmdao.api import ExplicitComponent

class Exp(ExplicitComponent):    

    def setup(self):          
        self.add_input('des1',val=1)  
        self.add_input('des2',val=1)  
        self.add_output('out',val=1)                                          
        self.add_output('con',val=1)                                          
        self.declare_partials('*', '*',method='fd',step=0.001)

    def compute(self, inputs, outputs):
        outputs['out']=inputs['des1']**2+inputs['des2']
        outputs['con']=inputs['des1']


prob = Problem()

dvs = IndepVarComp()
prob.model.add_subsystem('dvs', dvs, promotes=['*'])

prob.model.add_subsystem('Exp', Exp(),promotes=['*']) 

dvs.add_output('des1', 1.0)   
prob.model.add_design_var('des1',lower=0.8, upper=1.3)   

# dvs.add_output('des2', 2.0) # BAD INITIAL GUESS!!!!!  
dvs.add_output('des2', 1.0)   
prob.model.add_design_var('des2',lower=0.8, upper=1.3)   

prob.model.add_objective('out')
prob.model.add_constraint('con',upper=0.1)

prob.driver=ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.driver.options['disp'] = True
prob.driver.options['tol'] = 1e-9


RECORDER_NAME = 'recorder1.sql'
recorder = SqliteRecorder(RECORDER_NAME)

prob.driver.add_recorder(recorder)

#prob.driver.recording_options['includes'] = []
#prob.driver.recording_options['record_inputs'] = True
#        prob.driver.recording_options['record_outputs'] = True
#prob.driver.recording_options['record_objectives'] = True
#prob.driver.recording_options['record_constraints'] = True
#prob.driver.recording_options['record_desvars'] = True

prob.driver.recording_options['record_derivatives'] = True

prob.setup(check=True)

prob.run_driver()

prob.cleanup()

cr = CaseReader(RECORDER_NAME)

cases = cr.get_cases()
for c in cases: 
    print(c.outputs['des1'], c.outputs['des2'])
    if c.jacobian is not None: 
        print(c.jacobian)
    print()

当 运行 这给出:

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 1.4400000000000002
            Iterations: 7
            Function evaluations: 3
            Gradient evaluations: 3
Optimization Complete
-----------------------------------
[1.] [1.]

[1.] [1.]

[0.8] [0.8]
{('out', 'des1'): array([[2.001]]), ('out', 'des2'): array([[1.]]), ('con', 'des1'): array([[1.]]), ('con', 'des2'): array([[-0.]])}

[0.8] [0.8]
{('out', 'des1'): array([[1.601]]), ('out', 'des2'): array([[1.]]), ('con', 'des1'): array([[1.]]), ('con', 'des2'): array([[-0.]])}

请注意,并非每个案例都有与之相关的衍生品。在不重新计算导数的情况下采取线搜索步骤,因此记录了 none。在您的原始测试脚本中,最后一个案例没有衍生品,但前面的一些案例有(尽管所有案例都将填充 NAN )。