OpenMDAO 1.x.x: 运行 嵌套在非根组中的 SubProblem 问题导致错误
OpenMDAO 1.x.x: Running problem with SubProblem nested in non-root Group causes error
将子问题添加到一个组时,该组本身已添加到另一个组,发生错误(Python3,OpenMDAO 1.7.3)。我通过重载 SubProblem 的 _get_relname_map(self, parent_proms)
方法解决了这个问题。仅 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")
上面的示例有效,但是当您在 MySubProblem 中注释 _get_relname_map 定义时,会在 prob1.run()
.
时引发错误
我现在的问题是:是否有任何理由使用 self.name 而不是 self.pathname?我的解决方案会导致任何其他问题吗?
非常感谢!
此致,
杰罗姆
OpenMDAO 1.X 不再受到积极支持,无论如何,子问题始终是其中的一个实验性功能。如果您的修复对您有用,那应该没问题。
将子问题添加到一个组时,该组本身已添加到另一个组,发生错误(Python3,OpenMDAO 1.7.3)。我通过重载 SubProblem 的 _get_relname_map(self, parent_proms)
方法解决了这个问题。仅 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")
上面的示例有效,但是当您在 MySubProblem 中注释 _get_relname_map 定义时,会在 prob1.run()
.
我现在的问题是:是否有任何理由使用 self.name 而不是 self.pathname?我的解决方案会导致任何其他问题吗?
非常感谢!
此致, 杰罗姆
OpenMDAO 1.X 不再受到积极支持,无论如何,子问题始终是其中的一个实验性功能。如果您的修复对您有用,那应该没问题。