Programar programáticamente las distribuciones del simulador de perfiles.Estoy tratando de hacer un Profiler con las opciones de simulador activadas y algunas de las entradas tienen distribuciones aleatorias. El tipo de distribución y los parámetros de esa distribución se guardan como variables de tabla para ser ordenados según sea necesario. Pero la JSL dentro de la función Profiler () no parece reconocer si hay sentencias.
Por ejemplo, este código funciona bien.
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( :dist_p1, :dist_p2 ) )
),
Resimulate
)
)
)pero este código no carga la información de distribución para "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: Programar programáticamente las distribuciones del simulador de perfiles.Pensé en este enfoque brevemente, pero en mi archivo real estaría duplicando más de 100 líneas de código 9 veces (3 variables aleatorias, 3 tipos de distribución). Se vuelve inmanejable muy rápidamente.
EDITAR: Esto es en respuesta a David_Burnham. Sigo aprendiendo a usar estos foros ...
Re: Programar programáticamente las distribuciones del simulador de perfiles.Bien, si vuelvo a la función de nivel más alto (Perfilador en este caso) y la envuelvo con Eval, Substitute y Expr, puedo obtener el comportamiento que quiero. Fue confuso para mí porque pensé que el "si" debería evaluarse primero, luego se usaría como el argumento de la función dentro de la cual estaba dentro, pero ahora puedo entender por qué eso no funcionaría.
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: Programar programáticamente las distribuciones del simulador de perfiles.El perfilador es una función. Todo dentro de la función debe ser argumentos de la función necesarios para que la función se ejecute. Así que no puedes simplemente pegar código JSL arbitrario dentro de él. Necesitas mover la lógica condicional hacia afuera:
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
)
)
)
);