star-gs

Literate program for a geometric sensitivity calculation
git clone git://git.meso-star.fr/star-gs.git
Log | Files | Refs | README | LICENSE

commit 53fea035dcea083b6e2e9cf1b6a7d1c16ac1b8a6
parent cc4ae794bd111203ebe82470780044590db1220b
Author: Lapeyre Paule <paule.lapeyre@yahoo.fr>
Date:   Wed,  4 Jan 2023 12:19:29 -0500

Merge remote-tracking branch 'origin/feature_trans_sensib' into feature_trans_sensib

Diffstat:
Msrc/sgs_compute_sensitivity_translation.nw | 82++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 69 insertions(+), 13 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -217,8 +217,6 @@ S_b = L^{eq}(T) \lbrack 1- \cos(2 \pi \frac{x}{Dx}) \rbrack \lbrack 1- \cos(2 \pi \frac{y}{Dy}) \rbrack \end{equation} - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Modèle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1021,14 +1019,14 @@ error: @ \paragraph{} Dans cette fonction on commence par exécuter l'intégration -Monte-Carlo. Cette étape consiste à invoquer notre fonction de -[[<<réalisation>>]] autant de fois que de nombre de réalisations demandées, et -à accumuler les poids qu'elle retourne. D'apparence triviale, cette simple -boucle s'avère plus compliquée pour qui souhaite paralléliser son calcul. Au -delà des questions propres à une exécution parallèle, d'aucun doit s'assurer -que chaque processus dispose d'une séquence de nombre aléatoires qui lui est -propre. C'est pourquoi nous utilisons ici la bibliothèque -\texttt{Star-MonteCarlo} en charge de cette intégration parallèle. Pour cela +Monte-Carlo. Cette étape consiste à invoquer notre fonction de réalisation +(voir [[<<réalisation>>]]) autant de fois que de nombre de réalisations +demandées, et à accumuler les poids qu'elle retourne. D'apparence triviale, +cette simple boucle s'avère plus compliquée pour qui souhaite paralléliser son +calcul. Au delà des questions propres à une exécution parallèle, d'aucun doit +s'assurer que chaque processus dispose d'une séquence de nombre aléatoires qui +lui est propre. C'est pourquoi nous utilisons ici la bibliothèque +\texttt{Star-MonteCarlo} en charge de cette intégration parallèle. Pour cela nous créons d'abord un système \texttt{Star-MonteCarlo}, c'est à dire une variable qui matérialise la bibliothèque à l'échelle de notre programme ([[smc]]). Et nous le configurons pour qu'il utilise le journal d'évènement @@ -1064,9 +1062,67 @@ res = smc_solve(smc, &integrator, &ctx, &estimator); if(res != RES_OK) goto error; @ -\paragraph{TODO} -Expliquer brièvement la variable [[ctx]] et la fonction [[run_realisation]] que -l'on défini dans la foulée dans un bloc [[<<fonctions utilitaires>>]] +\paragraph{} En sortie de l'intégration Monte-Carlo (fonction [[smc_solve]]) +nous disposons d'un estimateur de nos variables aléatoires, en l'occurrence la +sensibilité à la translation et la fraction de la luminance qui dépend du +paramètre {\PI}. Nous pouvons dès lors récupérer l'état de notre estimateur +pour afficher l'espérance et l'écart type de ces variables. + +<<afficher les résultats de l'estimation>>= +res = smc_estimator_get_status(estimator, &status); +if(res != RES_OK) goto error; + +printf("Sensibilité ~ %g +/- %g\n", + SMC_DOUBLEN(status.E)[0], /* Espérance */ + SMC_DOUBLEN(status.SE)[0]); /* Écart type */ +printf("Luminance ~ %g +/- %g\n", + SMC_DOUBLEN(status.E)[1], /* Espérance */ + SMC_DOUBLEN(status.SE)[1]); /* Écart type */ +@ + +\paragraph{} Ne reste plus qu'à déclarer les variables locales utilisés par +notre fonction de calcul + +<<variables locales au calcul de sensibilité>>= +/* Système */ +struct smc_device_create_args smc_args = SMC_DEVICE_CREATE_ARGS_DEFAULT; +struct smc_device* smc = NULL; + +/* Intégrateur */ +struct smc_integrator integrator = SMC_INTEGRATOR_NULL; +struct smc_doubleN_context ctx = SMC_DOUBLEN_CONTEXT_NULL; + +/* Résultat de l'estimatation */ +struct smc_estimator = NULL; +struct smc_estimator_status status = SMC_ESTIMATOR_STATUS_NULL; +@ + +\paragraph{} Le lecteur attentif aura remarqué que l'intégrateur utilise la +fonction [[run_realisation]] et non directement la fonction [[réalisation]] +développée dans ce document (voir [[<<exécuter l'intégration Monte Carlo>>]]). +[[run_réalisation]] est une fonction intermédiaire, qui ne fait qu'appeler la +fonction [[realisation]]. Une fonction parfaitement dispensable sauf à la +bibliothèque \texttt{Star-MonteCarlo} qui nous impose la signature de la +fonction à utiliser, c'est à dire le type des paramètres d'entrées et de +sorties. En d'autres termes, l'utilisation de cette fonction intermédiaire nous +permet de faciliter l'écriture et la lecture de la fonction [[realisation]] en +la libérant de contraintes fonctionnelles imposées par +\texttt{Star-MonteCarlo}. + +<<fonction utilitaire>>= +static res_T +run_realisation + (void* output, + struct ssp_rng* rng, + const unsigned ithread, + void* ctx) +{ + struct smc_doubleN_context* context = ctx; + ASSERT(ctx && output); + (void)ithread; /* Éviter l'avertissement de compilation "variable inutilisée" */ + return realisation(rng, ctx->integrand_data.sgs->scene, SMC_DOUBLEN(output)); +} +@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Annexe structure du C