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:
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