Impostare programmaticamente le distribuzioni del simulatore del profilerSto cercando di creare un Profiler con le opzioni del simulatore attivate e alcuni degli input hanno distribuzioni casuali. Il tipo di distribuzione e i parametri di quella distribuzione vengono salvati come variabili di tabella da interrogare secondo necessità. Ma il JSL all'interno della funzione Profiler () non sembra riconoscere le istruzioni.
Ad esempio, questo codice funziona correttamente
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( :dist_p1, :dist_p2 ) )
),
Resimulate
)
)
)ma questo codice non carica le informazioni di distribuzione per "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
)
)
)
Re: imposta programmaticamente le distribuzioni del simulatore del profilerHo pensato brevemente a questo approccio, ma nel mio file reale duplicherebbe oltre 100 righe di codice 9 volte (3 variabili casuali, 3 tipi di distribuzione). Diventa ingestibile molto rapidamente.
EDIT: Questo è in relazione a David_Burnham. Sto ancora imparando come usare questi forum ...
Re: imposta programmaticamente le distribuzioni del simulatore del profilerOk, se torno alla funzione di livello più alto (Profiler in questo caso) e lo avvolgo con Eval, Substitute ed Expr, posso ottenere il comportamento che voglio. Mi confondeva perché pensavo che il se dovesse essere valutato prima, poi usato come argomento della funzione in cui si trovava, ma ora capisco perché non funzionerebbe.
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 ))" )
)
)
)Re: imposta programmaticamente le distribuzioni del simulatore del profilerProfiler è una funzione. Ogni funzione all'interno della funzione dovrebbe essere argomenti di funzione richiesti per la funzione da eseguire. Quindi non puoi semplicemente inserire codice JSL arbitrario al suo interno. È necessario spostare la logica condizionale all'esterno:
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
)
)
)
);