16.12.3 语义

ExpansionRegion在对其所输入的一组或多组值的每个值上执行它所包含的ActivityNodes和ActivityEdges。如果计算过程产生结果,它们会被收集到输出集合。输出集合的数目可以根据输入集合数目而不同。

ExpansionNode是一个用于指示跨ExpansionRegion边界的(对象)流的ObjectNode。从区域(region)外看,这些节点的值体现为集合。从区域内看,这些值体现为集合的元素。此处的集合是一个执行引擎所支持的任意结构,它们可以被当作一个整体,也可以被当作一个一组定义良好的元素值。

执行引擎可以定义不同种类的集合类型(集合、包等等),它们的实例可以从元素值来构造,之后通过它们来获得这些元素值。这样的一个集合实例被作为一个单一值放在一个单一的token上。执行引擎还可以非显式化的支持把在一组tokens中的值集合一起放在一个ExpansionNode上。

如果一个ExpansionRegion有多个输入ExpansionNodes,那么每一个必须处理相同种类的集合(set,bag等等),尽管不同集合中元素的类型可能不同。如果集合的种类由一个集合类型所表示,那么这用作ExpansionNodes的type。否则,ExpansionNodes的type由集合中元素的type来反映。

ExpansionRegion按照Action(参见16.2.3)的一般规则来执行。此外,如果ExpansionRegion的输入ExpansionNodes有集合类型,那么在ExpansionRegion开始执行前,一个集合实例必须被放置在每个ExpansionNode上。否则,对于任意的输入ExpansionNode是否包含tokens则没有约束(没有token的ExpansionNode被视为空集合)。当ExpansionRegion开始执行时,它把输入ExpansionNodes的所有tokens都移除。

然后,对于输入集合的每个元素,ExpansionRegion包含的AcitivityNodes和ActivityEdges都会执行一次。这被称作ExpansionRegion的expansion executions。如果集合具有不同的元素个数,那么expansion executions的数目等于最小集合的规模(mode=stream的情形除外,此种情形下只有一个expansion execution,如下所述)。每个expansion execution都按照一般的StructuredActivityNode的执行语义独立执行,除了如下的特定规则:

  • 在每个expansion execution中,一个单一的token会提交给每一个以一个输入ExpansionNode作为sourcetarget在ExpansionRegion的ActivityEdge。这个token包含着输入ExpansionNode上集合作为独立元素的值。对于这样一个输入ExpansionNode上的每一个集合,会有一个不同的元素被提交以用于每一次的expansion execution。如果集合不是一个set(非唯一),重复的值会被认为是不同的元素。如果集合是有序的,那么每个集合中的元素都按序排好用于每一次的执行(一个执行从所有输入集合的第一个位置获得所有的元素,下一个执行从位置2获得所有的元素,依次类推),直到执行的数目(这为expansion executions提供了一个有效的次序)。如果集合不是有序的,那么集合中的哪个元素提交给哪个执行时未定义的(除了至多可以提供一次执行所需的元素的情形)。
  • 每一次expansion execution都可能产生tokens,并交付给一个source在ExpansionRegion内部、target是一个输出ExpansionNode的ActivityEdge。这些tokens会立即被ExpansionNode所接受并把他们插入到相应的输出集合中。如果输入和输出集合都是有序的,那么每一次执行所提供的值会按照输入集合所引入的次序连接起来。如果每次执行都产生一个单值,那么输出集合就会与最小的输入集合拥有相同数目的元素,并且,如果输出集合是有序的,它会在与输入集合相对应的每个位置上有一个输出。另一方面,如果每次执行可能会或者不会产生一个值,那么输出集合会比输入集合的元素少,并且ExpansionRegion将会充当一种过滤器。最后,如果每次执行都产生多个值,那么输出集合的元素数会比输入集合的多。
  • 放置于ExpansionRegion的InputPins的tokens会在每次执行时拷贝一份交付给由InputPins流出的ActivityEdges。这样,每次expansion execution所消费的tokens不会对下次从InputPins获取tokens产生影响(因此,InutPin上的tokens在不同执行看来就如同常量)。类似的,从ExapansionRegion外部穿入的ActivityEdges上交付的tokens也是每次执行都复制一份(在每次执行中ActivityEdge的target都会收到tokens的一份拷贝)。
  • ExpansionRegion还可以有OutputPins和穿出的ActivityEdges。然而,在ExpansionRegion的每一次exapansion execution中向这些OutputPins或者ActivityEdges提交tokens的语义是未定义的。

当ExpansionRegion执行完所有的exapansion execution,它把输出ExpansionNodes上的输出集合交付给从输出ExapansionNodes流出的任意ActivityEdges(在ExpansaionRegion的执行中不会交付)。如果ExpansionRegion直接包含一个ActivityFinalNode,那么如果这个ActivityFinalNode在任意的一次expansionRegion中接受一个token,所有当前正在进行的expansion executions被终止,ExpansionRegion整体执行结束。此种情形下,输出集合仍旧从输出ExpansionNodes提交,尽管集合可能只有部分有值。

ExpansionRegion的mode控制expansion executions如何执行。

  • 如果值为parallel,expansion executions并发执行。这允许执行引擎并行的运行它们或者时间上是重叠的,但这不是必须的。然而,如果它们顺序执行,执行次序是未定义的。
  • 如果值为iterative,expansion executions必须以迭代次序执行,一个结束后另一个才能开始。第一个exapansion execution会在ExpansionRegion启动执行时立即开始。如果输入集合是有序的,那么expansion executions会以输入集合引入的顺序执行。否则,expansion executions的次序是未定义的。
  • 如果值为stream,那么就只有一个expansion execution,来自每个集合的元素值以流的方式交付给这个执行。即,输入ElementNode上的集合的每个元素以独立token的形式一个一个地提交给流出的ActivityEdges(直到最小输入集合规模的数目)。如果输入集合是有序的,那么交付序列与集合中元素序列同序;否则次序是未定的。在单个expansion execution执行过程中,每个输出ExpansionNode可能会接受多个tokens来构造输出集合。如果输出集合石有序的,那么集合的元素按照ExpansionNode接收tokens的次序来排序。

results matching ""

    No results matching ""