プログラムでプロファイラーシミュレーターの分布を設定するシミュレータオプションをオンにしてプロファイラーを作成しようとしていますが、入力の一部にランダムな分布があります。分布の種類とその分布のパラメータはテーブル変数として保存され、必要に応じて照会されます。しかし、Profiler()関数内のJSLはifステートメントを認識していないようです。
例えば、このコードはうまくいきます
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( :dist_p1, :dist_p2 ) )
),
Resimulate
)
)
)しかし、このコードは "d"の配布情報をロードしません。
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
if(
dist_type == "Normal", d << Random( Normal( :dist_p1, :dist_p2 ) ),
dist_type == "Weibull", d << Random( Weibull( :dist_p1, :dist_p2 ) )
)
),
Resimulate
)
)
)
再:プログラム的にプロファイラシミュレータの分布を設定するこのアプローチについて簡単に考えましたが、私の実際のファイルでは100行以上のコードを9回複製します(3つの確率変数、3つの分布型)。非常に早く手に負えないものになります。
編集:これはDavid_Burnhamに頼っている。まだこれらのフォーラムの使い方を学んでいます...
再:プログラム的にプロファイラシミュレータの分布を設定するさて、もし私が最高レベルの関数(この場合はProfiler)に戻ってそれをEval、Substitute、そしてExprでラップすれば私が望む振る舞いを得ることができます。 ifは最初に評価され、それが内部にある関数の引数として使用されるべきだと思ったので、私にとって混乱していましたが、それがなぜうまくいかないのか理解できます。
Eval(
Substitute(
Expr(
Profiler(
Y( :a, :b ),
Simulator(
Factors(
c << Fixed( 3.5 ),
d_
),
Resimulate
)
)
),
Expr( _d_ ),
if (:dist_type == "Normal", Parse( "d << Random( Normal( :dist_p1, :dist_p2 ))" ),
:dist_type == "Weibull", Parse( "d << Random( Weibull( :dist_p2, :dist_p1 ))" )
)
)
)再:プログラム的にプロファイラシミュレータの分布を設定するプロファイラーは関数です。 関数内のすべてのものは、関数が実行されるために必要な関数引数であるべきです。 だからあなたはただその中に任意のJSLコードを貼り付けることはできません。 条件付きロジックを外部に移動する必要があります。
type = "Normal";
p1 = 3.0;
p2 = 0.5;
If (type == "Normal",
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( p1, p2 ) ),
),
Resimulate
)
)
)
);