OpenMDAO 1.x.x: Ошибка запуска с подзадачей, вложенной в группу без полномочий root, вызывает ошибку - PullRequest
0 голосов
/ 06 ноября 2018

При добавлении подзадачи в группу, которая сама была добавлена ​​в другую группу, произошла ошибка (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? Может ли мое решение вызвать другие проблемы?

Большое спасибо!

С наилучшими пожеланиями, Джером

1 Ответ

0 голосов
/ 06 ноября 2018

OpenMDAO 1.X больше не поддерживается активно, и в любом случае подзадачи всегда были чем-то вроде экспериментальной функции. Если ваше исправление работает для вас, все должно быть в порядке.

...