有没有办法获取或列出OpenMDAO组内未连接的输入?

3

考虑以下问题

import openmdao.api as om


class Sys(om.Group):

    def setup(self):

        self.add_subsystem('sys1', om.ExecComp('v1 = a + b'), promotes=['*'])

        self.add_subsystem('sys2', om.ExecComp('v2 = v1 + c'), promotes=['*'])


if __name__ == '__main__':

    prob = om.Problem()
    model = prob.model

    comp = model.add_subsystem('comp', Sys(), promotes=['*'])

    prob.setup()
    prob.run_model()

    comp.list_inputs()

list_inputs 命令的输出如下:

4 Input(s) in 'comp'

varname  val
-------  ----
sys1
  a      [1.]
  b      [1.]
sys2
  c      [1.]
  v1     [2.]

但是我们可以清楚地看到,v1是系统中的“内部”输入。如果将其连接到IndepVarComp或另一个系统,则无需提供v1,因为它已经内部连接。

是否有一种函数可以列出未连接或必须提供给组的输入?


1
我通常使用 view_connections 工具 来完成此操作,该工具显示了自动_ivc输入的来源,并且您可以对其进行过滤。另一个选项是使用 N2图 并查找橙色变量,这意味着它们尚未连接到任何东西。我是在评论而不是回答,因为这可能不是您需要的确切内容,但可能会有所帮助。 - John Jasa
2个回答

2

通常情况下,我更喜欢依靠可视化工具,比如N2

然而,在某些情况下,我会使用一种可编程的解决方案。需要提醒的是,它需要使用系统的一个非公开属性...但这就是我的做法:

import openmdao.api as om


class Sys(om.Group):

    def setup(self):

        self.add_subsystem('sub_sys1', om.ExecComp('v1 = a + b'), promotes=['*'])

        self.add_subsystem('sub_sys2', om.ExecComp('v2 = v1 + c'), promotes=['*'])

if __name__ == '__main__':

    prob = om.Problem()
    model = prob.model

    comp = model.add_subsystem('comp', Sys(), promotes=['*'])

    prob.setup()
    prob.run_model()

    comp_inputs = prob.model.list_inputs(out_stream=None, prom_name=True)


    # filter the inputs into connected and unconnected sets
    connect_dict = comp._conn_global_abs_in2out
    unconnected_inputs = set()
    connected_inputs = set()
    for abs_name, in_data in comp_inputs:
        if abs_name in connect_dict and (not 'auto_ivc' in connect_dict[abs_name]):
            connected_inputs.add(in_data['prom_name'])
        else:
            unconnected_inputs.add(in_data['prom_name'])

    print(connected_inputs)
    print(unconnected_inputs)

2
下一个OpenMDAO版本(3.22.0)将提供一个“输入报告”(inputs.html),默认情况下会在您执行模型的报告子目录中生成。其中一列允许您切换显示以过滤掉连接到IndepVarComp(默认值)的输入,未连接到IndepVarComp的输入或显示所有变量。这在OpenMDAO的开发分支上目前已经生效。

inputs.html

我们的待办清单上有一个更简单的以编程方式获取此信息的方法,但将以下代码附加到您的示例应该可以工作。 该代码首先获取所有标记为openmdao:indep_var的输出(这是OpenMDAO应用于IVC输出的特殊标记)。 然后,它递归地遍历模型的子系统。 在每个子系统中,它查看连接信息,并查看连接源是否是先前检测到的IVC输出之一。

    unconnected_inputs = []
    ivc_meta = prob.model.get_io_metadata(iotypes='output', tags='openmdao:indep_var', get_remote=True)
    for sys in prob.model.system_iter(include_self=True, recurse=True):
        if isinstance(sys, om.Group):
            for input, src in sys._conn_abs_in2out.items():
                if src in ivc_meta:
                    unconnected_inputs.append(input)
    print(unconnected_inputs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接