Cara comunità JMP,
È possibile mettere in pausa un ciclo FOR e riprenderlo più tardi? Sto pensando di avere una finestra popup con un pulsante "pausa" e un pulsante "riprendi". L'idea sarebbe che nello script quando si preme il pulsante di pausa, il calcolo finirebbe, il numero di iterazione ancora in memoria rimarrebbe in modo che quando si premesse il pulsante di ripresa, il calcolo riprendesse dall'iterazione data.
Se non è possibile, faccelo sapere e smetterò di provare a perseguire questo obiettivo da solo.
Grazie!,
DS
CIAO @cwillden ,
Grazie per il tuo contributo, è un'ottima soluzione! Funziona con il mio script di test che mostra un indicatore di avanzamento per l'avanzamento generale della modellazione quando eseguo una tabella di ottimizzazione di grandi dimensioni.
Il mio obiettivo finale è inserire la chiamata per adattare i dati nella porzione loop_expr in modo da poter mettere in pausa il processo di modellazione complessivo e riprenderlo in un secondo momento. Penso che questo potrebbe richiedere un po' più di perizia. Lo sto testando con lo script (di Mark Bailey) da questo post Qui utilizzando la piattaforma SVM.
Ecco la barra di avanzamento/script di iterazione che ho e che vorrei utilizzare per "controllare" l'avanzamento potendo mettere in pausa e riprendere in un secondo momento.
Names Default To Here( 1 );
i = 1;
imax = 100;
dlgStatus = New Window( "Overall Modeling Progress",
V List Box(
Text Box( " Overall Modeling Progress ", <<SET font="" size=""></SET>
Ecco lo script SVM che Mark ha scritto:
Names Default To Here( 1 );
// use a small example
data = Open( "$SAMPLE_DATA/Big Class.jmp" );
// launch SVM platform
svm = data << Support Vector Machines( Y( :age ), X( :height, :weight ) );
// iterate over a range of hyper-parameters
For( cost = 0.1, cost <= 5, cost += 0.05,
For( gamma = 0.1, gamma <= 1, gamma += 0.1,
svm << Fit(
Kernel Function( "Radial Basis Function" ),
Gamma( gamma ),
Cost( cost ),
Validation Method( "None" )
)
)
);
// separate parameters and performance in a new table
results = Report( svm )["Model Comparison"][Table Box( 1 )] << Make Into Data Table;
// fit interpolator for profiling
results << Neural(
Y( :Training Misclassification Rate ),
X( :Cost, :Gamma ),
Informative Missing( 0 ),
Validation Method( "Holdback", 0.3333 ),
Fit(
NTanH( 3 ),
Profiler(
1,
Confidence Intervals( 1 ),
Term Value( Cost( 2.75, Lock( 0 ), Show( 1 ) ), Gamma( 1, Lock( 0 ), Show( 1 ) ) )
),
Plot Actual by Predicted( 1 ),
Plot Residual by Predicted( 1 )
)
);
Qualsiasi suggerimento su come farlo sarebbe fantastico!
Grazie!,
DS
Ecco un'illustrazione di un approccio.Fondamentalmente, esiste una variabile, iter, che tiene traccia delle iterazioni separate dalla variabile di iterazione del ciclo For, "i" in questo caso.Quando metti in pausa e riavvii, il ciclo For inizia da iter+1 e continua.Senza la funzione wait(), ciò non funzionerebbe perché lo script del pulsante di arresto non verrebbe eseguito fino alla fine del ciclo.0,5 secondi sono un'attesa molto più lunga del necessario.In effetti, questo esempio funziona con wait(0).
New Window( "Test Pause Loop",
V List Box(
tb1 = Text Box( "Iteration: 0" ),
H List Box(
start_btn = Button Box( "Start", On Start ),
stop_btn = Button Box( "Stop", On Stop )
)
)
);
pause_state = 1;
iter = 0;
loop_expr = Expr(
for(i = iter+1, i<=1000, i++,
iter = i;
tb1 << Set Text("Iteration: "||char(iter));
wait(0.5);
show(iter, pause_state);
if(pause_state == 1, break());
)
);
On Start = Expr(
pause_state = 0;
start_btn << Enable(0);
loop_expr();
);
On Stop = Expr(
pause_state=1;
start_btn << Enable(1);
);