*Subject: *Re: Petit rappel - Réunion : Point sur les fitters - demain 14h *From: *Herve Beust *Date: *09/01/14 16:10 *To: *Isabelle Tallon-Bosc *CC: *"jmmc-tech-group@ujf-grenoble.fr" , Michel Tallon Re-bonjour, Comme promis, voici l'état de mon travail sur l'algorithme génétique pour LITpro. Je vous laisse ici le fichier LITpro_fitter_genfit.i (oui, en totalité), mais je donne tout un paquet de commentaires ici. J'ai essayé de bâtir ce code en restant au plus proche de ce qui a été fait avec LITpro_fitter_trfiit.i, et d'en exploiter au maximum la compatibilité. C'est d'ailleurs toute la difficulté de l'entreprise. La structure du fichier est la suivante : =========================== func lpf_genfit_go(world, keywords=, verbose=, itmax=, plot=, tol_degen=, tol_gradient=, tol_step=, nsol=, ntrstep=, nelit=, mutproba=) La routine d'initialisation et d'entrée. func lpf_genfit_show(world) Routine de visualisation. !!!!! Pas encore écrite. Pour l'instant c'est un copier-coller de lpf_trfit_show. C'est la prochaine étape. func lpf_genfit_step(ws, quiet=) La routine centrale qui fait un pas d'algorithme génétique. Appelée par lpf_genfit_go. func _lpf_genfit_Log2(in) func _lpf_genfit_Dec2Bin(dec) func _lpf_genfit_Double2Bin(in) func _lpf_genfit_Bin2Double(bit) func _lpf_genfit_crossover_and_mute(parent1,parent2,mutproba) Tout un ensemble de routines privées destinées à faire la combinaison génétique de deux parents. La routine _lpf_genfit_crossover_and_mute est appelée par lpf_genfit_go. Pour ces routines, je me suis fortement inspiré du fragment de code que m'avait passé Florentin (en changeant quelques petites choses). Ces routines ont été testées (ce sont les seules). ============================== Voici maintenant comment ça fonctionne. La grosse différence avec un trfit standard, c'est qu'on ne suit pas UNE solution, mais en ensemble de solutions (ici, nsol, 100 par défaut) en parallèle qu'on va croiser et combiner à chaque génération. En conséquence, dans lpf_genfit_go, on rentre encore avec un world qui contient bien une seule solution (paramètres a), mais le ws créé un peu plus loin contient le paramètre a_tab qui contient les nsol solutions. Plus loin, on y rajoute les paramètres res_tab, chi2_tab. scale_tab. Dans la routine lpf_genfit_go, on trouve les lignes a_tab = array(0.0,nparam,nsol) for (i=1; i<=nsol; i++) { for (j=1; j<=nparam, j++) { a_tab(j,i) = ws.param(ws.names(j)).vmin +random()*(ws.param(ws.names(j)).vmax-ws.param(ws.names(j)).vmin) } Où on initialise une première génération de solutions en tirant les parmètres au hasard entre les bornes données au préalable (est-ce bien comme ça qu'il faut faire ?). Plus loin j'ai bâti la bouble (while (1)..) comme celle de lpf_trfit_go. Mais il y a une différence. En effet, le ws contient la table a_tab de toute la génération courante (classée par chi2 après un tour), mais un world ne contient a priori qu'une solution. Or pour calculer les residuals on utilise lpf_compute_residuals(wtemp) qui demande un world pas un workspace. En conséquence j'ai écrit les lignes suivantes for (i=1; i<=nsol; ++i) { wtemp = lpw_new_world(); wstemp = lpw_get_workspace(wtemp, "genfit", clean=1); hset, wstemp, a=ws.a_tab(i,), names=ws.names, constr=ws.constr, param=ws.param, nparam=ws.nparam, constr=ws.constr, n_res=ws.n_res, tol_gradient=ws.tol_gradient, tol_degen=ws.tol_degen, tol_step=ws.tol_step, itmax=ws.ntrstep, stage=LP_TRFIT_STAGE_INIT; lpf_set_fitted_parameters_values, wtemp, wstemp.a; res = lpf_compute_residuals(wtemp); hset, ws, res_tab(i,)=res; } où pour chaque solution je crée un world temporaire (wtemp) avec son ws (wstemp) qui ne contient que la solution en question pour aller utiliser lpf_compute_residuals. Je ne sais pas si ce tour de passe-passe est très règlo. Il y a peut-être mieux. Ensuite, dans la routine lpf_genfit_step(ws, quiet=), en gros il se passe les choses suivantes : 1/ On classe les solutions par chi2. 2/ On garde les NELIT premières pour la génération suivante (élitisme) 3/ Pour construire les NSOL-NELIT solutions restantes de la génération suivante, on choisit pour chacune d'entre elles des parents parmi la génération précédente avec une probabilité proportionnelle à 1/sqrt(i) (les premières solutions de la liste - les meilleures - ont une plus grande chance d'être choisis comme parents), et ensuite on fait la combinaison génétique et éventuellement la mutation en appelant la routine _lpf_genfit_crossover_and_mute le nombre de fois qu'il faut. 4/ Pour chaque solution ainsi créée, on se réserve le droit d'applique quelques pas (ntrstep) de trfit avant d'insérer dans la génération suivante. Là aussi j'ai eu quelques soucis de compatibilité. Je suis passé par le même tour de passe-passe que plus haut, et je ne suis pas certain que ce soit bien. Ensuite, j'applique test de convergence : soit la différence entre le chi2 maxi et le chi2 mini est plus petite qu'une tolérance fixée à l'avance (ws.tol_gen, défaut 1e-5) (à la fin toutes les solutions sont égales), soit j'ai atteint un nombre maxi d'itérations. Voilà pour l'instant. Il y a encore pas mal de boulot avant que ce soit opérationnel, mais ça avance.. Hervé Le 09/01/2014 09:39, Isabelle Tallon-Bosc a écrit : > Bonjour Hervé > > tout d'abord, bonne année à toi et à ton épouse qui je l'espère a > recouvré une bonne santé. > > Pour la réunion de demain, il serait plus concret d'avoir sous les > yeux des choses écrites qui guideraient la discussion. Pas le code de > LITpro_fiter_genfit.i dans sa totalité, mais peut-être ses grandes > lignes et les points durs qui subsistent. > > Peut-être pourra-t-on voir pdt la réunion des slides projetées chez > vous à l'IPAG, mais le mieux serait que tu envoies un fichier par mail > avt. Inutile qu'elles soient peaufinées et que tu y passes trop de > temps. > Qu'en penses-tu ? > > Cordialement > Isabelle > > cj rappel pour la connection: > > -------- Original Message -------- > Subject: Réunion : Point sur les fitters > Date: Thu, 19 Dec 2013 18:16:06 +0100 > From: Isabelle Tallon-Bosc > To: Herve Beust , > "jmmc-tech-group@ujf-grenoble.fr" , > "Michel Tallon" > > Bonsoir, > En tenant compte de M. Doodle et pour éviter le jour de la reprise ;), > la réunion est fixée au > > vendredi 10 janvier de 14h à 15h > > (dépassement jusqu'à 16h possible, mais pas plus pour cause de départ > à 16h) > > cj les indications > ---------------- POUR SE CONNECTER ---------------------- > > Numéro de la conférence : 8458 (terminer par #) > Mot de passe : 5569 (terminer par #) > > > Pour entrer en conférence depuis votre système : > IP : 193.48.95.82 > Téléphone ou RNIS : +33 (0)4 26 68 73 02 > GDS : +33 (0)4 26 68 73 02 8458 > SIP : sip:8458@ccmsem02.renater.fr > H.323 : h323:8458@ccmsem02.renater.fr > --------------------------------------------------------- > > En attendant, > bonnes fêtes de fin d'année, > cordialement > Isa > > . > > > >