v0.12.0 regression: evaluation time exponential in derived features referenced from untaken if branches
メンテナーはふだん 1 日以内に返信
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- go
- 領域
- performance
調査の方向性
Start by reviewing the v0.12.0 changelog entries about order-dependence marks and cycle detection, then trace evaluation of if operands declared as in expr in ControlFunctions. Reproduce with the supplied gen.py model and compare the expression-valued and plain-default feature timings. Done means untaken branches avoid exponential evaluation while preserving the reported results; linked pull request #1933 is already open.
索引モデルが issue の本文から書いたものです。
説明
Summary
In v0.12.0, evaluating a feature valued by an expression takes time exponential in the number of other expression-valued features referenced from untaken if branches. v0.11.0 evaluates the same model in constant time. The results are the same in both versions; only the time differs. No diagnostic is emitted, so a larger model just appears to hang.
Reproduction
gen.py writes N features a1..aN. Each ai picks another feature by an integer selector pi (default 0, so every branch is untaken):
import sys
n, target = int(sys.argv[1]), sys.argv[2] # target: "a" (expression-valued features) or "c" (plain defaults)
print(f"package R {{ private import ScalarValues::*; part def T {{")
for i in range(1, n + 1):
e = "false"
for j in range(n, 0, -1):
e = f"(if p{i} == {j} ? {target}{j} else {e})"
print(f" attribute p{i} : Integer default 0; attribute c{i} : Boolean default true;")
print(f" attribute a{i} : Boolean = {e};")
print("} part t : T; }")
python3 gen.py 9 a > r.sysml
sysml r.sysml -e '$::R::t.a1'
Timings (linux-amd64 release binaries, same machine)
| N | branches reference a_j — v0.11.0 |
branches reference a_j — v0.12.0 |
branches reference c_j — v0.12.0 |
|---|---|---|---|
| 7 | ~0.05 s | 0.17 s | 0.05 s |
| 8 | 0.05 s | 0.31 s | 0.05 s |
| 9 | 0.06 s | 2.71 s | 0.05 s |
| 10 | 0.07 s | 29.94 s | 0.05 s |
All runs print = false. Loading and validating r.sysml alone takes about 0.02 s, so the time is spent in evaluation.
Control experiments (N = 9, v0.12.0)
- Only
if, all branches untaken (the generator above): 2.8 s. This rules outor/andas the cause. - The same chain prefixed with
p1 == 0 or …, or withp1 != 0 and …: about 3 s each. - The same shape, but the branches reference plain
defaultfeaturesc_j, so there are no references between expression-valued features: 0.05 s. - A direct self-reference only (
a = true or a): 0.06 s.
So the slowdown needs untaken branches that reference other expression-valued features which, syntactically, form cycles. The cycles are never taken at run time.
Expected
ControlFunctions declares the branch operands of if, and, or and implies as in expr. Its doc describes these operands as "expressions whose evaluation is determined by another operand". An untaken branch should therefore not need to be evaluated. In any case, the cost should not grow exponentially with the size of the model, as it did not in v0.11.0.
Notes
The 0.12.0 changelog has two entries that may be related, though we have not confirmed either:
- expression-valued features now carry order-dependence marks "through features so valued in turn";
- "a cycle among such features is refused by the interpreter at the start".
We found this in a model with about 9 mutually referencing derived features. One evaluation went from 0.45 s in v0.11.0 to more than 90 s in v0.12.0, after which we stopped it. We have since rewritten that model with ref features, which v0.12.0 evaluates fast, so this is not blocking us. We are reporting it as a regression.
- 主要言語
- Go
- スター
- 56
- フォーク
- 17
- 平均マージ
- 12時間 38分
- マージ済み PR(30日)
- 903
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
Open-MBEE/OpenSysML のほかの issue
-
question
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
Open-MBEE/OpenSysML#1359 · コメント 4 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 20/100
Open-MBEE/OpenSysML#1938 · コメント 2 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Textual representation body is not reachable via api対応中かも @devin-ai-integration が 1 日前に担当しました。 オープンbug spec compliance
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
Open-MBEE/OpenSysML#1916 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
Open-MBEE/OpenSysML#1628 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
spec compliance
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
Open-MBEE/OpenSysML#1576 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
Open-MBEE/OpenSysML の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
blocked-needs-validation bug
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
projectcapsule/capsule#2280 ·
メンテナーはふだん 1 日以内に返信
-
bug ready-for-agent
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
kerti/balances-v2#801 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
[BUG] AdvancedCronJob validating webhook reports incorrect field paths for concurrencyPolicy and pod templates対応中かも @bhuvan-somisetty が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
openkruise/kruise#2650 ·
メンテナーはふだん 1 日以内に返信