При добавлении подзадачи в группу, которая сама была добавлена в другую группу, произошла ошибка (Python3, OpenMDAO 1.7.3). Я решил это, перегрузив метод _get_relname_map(self, parent_proms)
в SubProblem. Только pkey = '.'.join((self.name, key))
было изменено на pkey = '.'.join((self.pathname, key))
:
from openmdao.api import Problem, Group, Component, IndepVarComp, ExecComp, \
ScipyOptimizer, SubProblem
from collections import OrderedDict
class MySubProblem(SubProblem):
def __init__(self, problem, params=(), unknowns=()):
super().__init__(problem, params, unknowns)
def _get_relname_map(self, parent_proms):
umap = OrderedDict()
for key in self._prob_unknowns:
pkey = '.'.join((self.pathname, key)) # self.name -> self.pathname
if pkey in parent_proms:
umap[parent_proms[pkey]] = key
return umap
def setup_sub():
# create subproblem example
sub = Problem(root=Group())
sub.root.add('indep', IndepVarComp([
('x', 0.0), ('y', 2.0)]))
# here's the actual function we're minimizing
sub.root.add("comp", ExecComp("fx = cos(x)-y"))
sub.driver = ScipyOptimizer()
sub.driver.options['optimizer'] = 'COBYLA'
sub.driver.add_desvar("indep.x", lower=-3, upper=3)
sub.driver.add_objective("comp.fx")
sub.root.connect("indep.x", "comp.x")
sub.root.connect("indep.y", "comp.y")
return sub
###
### Subproblem added to 'root'-Group -> working
prob0 = Problem(root=Group())
sp = prob0.root.add(
"subprob",
MySubProblem(
setup_sub(),
params=['indep.x', 'indep.y'],
unknowns=['comp.fx']))
prob0.setup(check=False)
prob0.run()
print("prob0 done")
###
### Subproblem added to Group which is added to 'root'-Group -> not working
prob1 = Problem(root=Group())
prob1.root.add('main', Group())
sp = prob1.root.main.add(
"subprob",
MySubProblem(
setup_sub(),
params=['indep.x', 'indep.y'],
unknowns=['comp.fx']))
prob1.setup(check=False)
prob1.run()
print("prob1 done")
Приведенный выше пример работает, но когда вы комментируете определение _get_relname_map в MySubProblem, возникает ошибка при prob1.run()
.
Мой вопрос сейчас: есть ли причина использовать self.name вместо self.pathname? Может ли мое решение вызвать другие проблемы?
Большое спасибо!
С наилучшими пожеланиями,
Джером