77 ClassImp(TMVA::MethodCFMlpANN_Utils);
79 const Int_t TMVA::MethodCFMlpANN_Utils::fg_max_nVar_ = max_nVar_;
80 const Int_t TMVA::MethodCFMlpANN_Utils::fg_max_nNodes_ = max_nNodes_;
81 const char*
const TMVA::MethodCFMlpANN_Utils::fg_MethodName =
"--- CFMlpANN ";
86 TMVA::MethodCFMlpANN_Utils::MethodCFMlpANN_Utils():fg_100(100),
91 for(i=0; i<max_nVar_;++i) fVarn_1.xmin[i] = 0;
96 for(i=0; i<max_nNodes_;++i) fDel_1.coef[i] = 0;
97 for(i=0; i<max_nLayers_*max_nNodes_;++i) fDel_1.del[i] = 0;
98 for(i=0; i<max_nLayers_*max_nNodes_*max_nNodes_;++i) fDel_1.delta[i] = 0;
99 for(i=0; i<max_nLayers_*max_nNodes_*max_nNodes_;++i) fDel_1.delw[i] = 0;
100 for(i=0; i<max_nLayers_*max_nNodes_;++i) fDel_1.delww[i] = 0;
104 for(i=0; i<max_nLayers_;++i) fDel_1.temp[i] = 0;
106 for(i=0; i<max_nNodes_;++i) fNeur_1.cut[i] = 0;
107 for(i=0; i<max_nLayers_*max_nNodes_;++i) fNeur_1.deltaww[i] = 0;
108 for(i=0; i<max_nLayers_;++i) fNeur_1.neuron[i] = 0;
109 for(i=0; i<max_nNodes_;++i) fNeur_1.o[i] = 0;
110 for(i=0; i<max_nLayers_*max_nNodes_*max_nNodes_;++i) fNeur_1.w[i] = 0;
111 for(i=0; i<max_nLayers_*max_nNodes_;++i) fNeur_1.ww[i] = 0;
112 for(i=0; i<max_nLayers_*max_nNodes_;++i) fNeur_1.x[i] = 0;
113 for(i=0; i<max_nLayers_*max_nNodes_;++i) fNeur_1.y[i] = 0;
123 fParam_1.nblearn = 0;
129 fParam_1.nunilec = 0;
130 fParam_1.nunishort = 0;
131 fParam_1.nunisor = 0;
135 for(i=0; i<max_Events_;++i) fVarn_1.mclass[i] = 0;
136 for(i=0; i<max_Events_;++i) fVarn_1.nclass[i] = 0;
137 for(i=0; i<max_nVar_;++i) fVarn_1.xmax[i] = 0;
145 TMVA::MethodCFMlpANN_Utils::~MethodCFMlpANN_Utils()
151 void TMVA::MethodCFMlpANN_Utils::Train_nn( Double_t *tin2, Double_t *tout2, Int_t *ntrain,
152 Int_t *ntest, Int_t *nvar2, Int_t *nlayer,
153 Int_t *nodes, Int_t *ncycle )
158 if (*ntrain + *ntest > max_Events_) {
159 printf(
"*** CFMlpANN_f2c: Warning in Train_nn: number of training + testing" \
160 " events exceeds hardcoded maximum - reset to maximum allowed number");
161 *ntrain = *ntrain*(max_Events_/(*ntrain + *ntest));
162 *ntest = *ntest *(max_Events_/(*ntrain + *ntest));
164 if (*nvar2 > max_nVar_) {
165 printf(
"*** CFMlpANN_f2c: ERROR in Train_nn: number of variables" \
166 " exceeds hardcoded maximum ==> abort");
169 if (*nlayer > max_nLayers_) {
170 printf(
"*** CFMlpANN_f2c: Warning in Train_nn: number of layers" \
171 " exceeds hardcoded maximum - reset to maximum allowed number");
172 *nlayer = max_nLayers_;
174 if (*nodes > max_nNodes_) {
175 printf(
"*** CFMlpANN_f2c: Warning in Train_nn: number of nodes" \
176 " exceeds hardcoded maximum - reset to maximum allowed number");
177 *nodes = max_nNodes_;
181 fVarn2_1.Create( *ntrain + *ntest, *nvar2 );
182 fVarn3_1.Create( *ntrain + *ntest, *nvar2 );
187 Entree_new(nvar2, det, ntrain, ntest, nlayer, nodes, ncycle, (Int_t)20);
188 if (fNeur_1.neuron[fParam_1.layerm - 1] == 1) {
194 fParam_1.lclass = fNeur_1.neuron[fParam_1.layerm - 1];
196 fParam_1.nvar = fNeur_1.neuron[0];
198 Innit(det, tout2, tin2, (Int_t)20);
207 void TMVA::MethodCFMlpANN_Utils::Entree_new( Int_t *,
char *, Int_t *ntrain,
208 Int_t *ntest, Int_t *numlayer, Int_t *nodes,
209 Int_t *numcycle, Int_t )
214 Int_t rewrite, i__, j, ncoef;
215 Int_t ntemp, num, retrain;
222 fCost_1.ancout = 1e30;
227 for (i__ = 1; i__ <= max_nNodes_; ++i__) {
228 fDel_1.coef[i__ - 1] = (Float_t)0.;
230 for (i__ = 1; i__ <= max_nLayers_; ++i__) {
231 fDel_1.temp[i__ - 1] = (Float_t)0.;
233 fParam_1.layerm = *numlayer;
234 if (fParam_1.layerm > max_nLayers_) {
235 printf(
"Error: number of layers exceeds maximum: %i, %i ==> abort",
236 fParam_1.layerm, max_nLayers_ );
237 Arret(
"modification of mlpl3_param_lim.inc is needed ");
239 fParam_1.nevl = *ntrain;
240 fParam_1.nevt = *ntest;
241 fParam_1.nblearn = *numcycle;
243 fParam_1.nunilec = 10;
244 fParam_1.epsmin = 1e-10;
245 fParam_1.epsmax = 1e-4;
247 fCost_1.tolcou = 1e-6;
249 fParam_1.nunisor = 30;
250 fParam_1.nunishort = 48;
253 ULog() << kINFO <<
"Total number of events for training: " << fParam_1.nevl << Endl;
254 ULog() << kINFO <<
"Total number of training cycles : " << fParam_1.nblearn << Endl;
255 if (fParam_1.nevl > max_Events_) {
256 printf(
"Error: number of learning events exceeds maximum: %i, %i ==> abort",
257 fParam_1.nevl, max_Events_ );
258 Arret(
"modification of mlpl3_param_lim.inc is needed ");
260 if (fParam_1.nevt > max_Events_) {
261 printf(
"Error: number of testing events exceeds maximum: %i, %i ==> abort",
262 fParam_1.nevt, max_Events_ );
263 Arret(
"modification of mlpl3_param_lim.inc is needed ");
265 i__1 = fParam_1.layerm;
266 for (j = 1; j <= i__1; ++j) {
271 if (j == fParam_1.layerm && num != 2) {
274 fNeur_1.neuron[j - 1] = num;
276 i__1 = fParam_1.layerm;
277 for (j = 1; j <= i__1; ++j) {
278 ULog() << kINFO <<
"Number of layers for neuron(" << j <<
"): " << fNeur_1.neuron[j - 1] << Endl;
280 if (fNeur_1.neuron[fParam_1.layerm - 1] != 2) {
281 printf(
"Error: wrong number of classes at output layer: %i != 2 ==> abort\n",
282 fNeur_1.neuron[fParam_1.layerm - 1]);
285 i__1 = fNeur_1.neuron[fParam_1.layerm - 1];
286 for (j = 1; j <= i__1; ++j) {
287 fDel_1.coef[j - 1] = 1.;
289 i__1 = fParam_1.layerm;
290 for (j = 1; j <= i__1; ++j) {
291 fDel_1.temp[j - 1] = 1.;
293 fParam_1.ichoi = retrain;
294 fParam_1.ndivis = rewrite;
296 if (! (fParam_1.ichoi == 0 || fParam_1.ichoi == 1)) {
297 printf(
"Big troubles !!! \n" );
298 Arret(
"new training or continued one !");
300 if (fParam_1.ichoi == 0) {
301 ULog() << kINFO <<
"New training will be performed" << Endl;
304 printf(
"%s: New training will be continued from a weight file\n", fg_MethodName);
308 for (i__ = 1; i__ <= max_nNodes_; ++i__) {
309 if (fDel_1.coef[i__ - 1] != (Float_t)0.) {
313 for (i__ = 1; i__ <= max_nLayers_; ++i__) {
314 if (fDel_1.temp[i__ - 1] != (Float_t)0.) {
318 if (ncoef != fNeur_1.neuron[fParam_1.layerm - 1]) {
319 Arret(
" entree error code 1 : need to reported");
321 if (ntemp != fParam_1.layerm) {
322 Arret(
"entree error code 2 : need to reported");
326 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
327 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
332 void TMVA::MethodCFMlpANN_Utils::Wini()
334 Int_t i__1, i__2, i__3;
338 i__1 = fParam_1.layerm;
339 for (layer = 2; layer <= i__1; ++layer) {
340 i__2 = fNeur_1.neuron[layer - 2];
341 for (i__ = 1; i__ <= i__2; ++i__) {
342 i__3 = fNeur_1.neuron[layer - 1];
343 for (j = 1; j <= i__3; ++j) {
344 w_ref(layer, j, i__) = (Sen3a() * 2. - 1.) * .2;
345 ww_ref(layer, j) = (Sen3a() * 2. - 1.) * .2;
354 #define xeev_ref(a_1,a_2) fVarn2_1(a_1,a_2)
355 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
356 #define x_ref(a_1,a_2) fNeur_1.x[(a_2)*max_nLayers_ + a_1 - 7]
357 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
358 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
363 void TMVA::MethodCFMlpANN_Utils::En_avant(Int_t *ievent)
365 Int_t i__1, i__2, i__3;
371 i__1 = fNeur_1.neuron[0];
372 for (i__ = 1; i__ <= i__1; ++i__) {
373 y_ref(1, i__) = xeev_ref(*ievent, i__);
375 i__1 = fParam_1.layerm - 1;
376 for (layer = 1; layer <= i__1; ++layer) {
377 i__2 = fNeur_1.neuron[layer];
378 for (j = 1; j <= i__2; ++j) {
379 x_ref(layer + 1, j) = 0.;
380 i__3 = fNeur_1.neuron[layer - 1];
381 for (i__ = 1; i__ <= i__3; ++i__) {
382 x_ref(layer + 1, j) = ( x_ref(layer + 1, j) + y_ref(layer, i__)
383 * w_ref(layer + 1, j, i__) );
385 x_ref(layer + 1, j) = x_ref(layer + 1, j) + ww_ref(layer + 1, j);
387 Foncf(&i__3, &x_ref(layer + 1, j), &f);
388 y_ref(layer + 1, j) = f;
399 #define xeev_ref(a_1,a_2) fVarn2_1(a_1,a_2)
404 void TMVA::MethodCFMlpANN_Utils::Leclearn( Int_t *ktest, Double_t *tout2, Double_t *tin2 )
409 Int_t nocla[max_nNodes_], ikend;
410 Double_t xpg[max_nVar_];
413 i__1 = fParam_1.lclass;
414 for (k = 1; k <= i__1; ++k) {
417 i__1 = fParam_1.nvar;
418 for (i__ = 1; i__ <= i__1; ++i__) {
419 fVarn_1.xmin[i__ - 1] = 1e30;
420 fVarn_1.xmax[i__ - 1] = -fVarn_1.xmin[i__ - 1];
422 i__1 = fParam_1.nevl;
423 for (i__ = 1; i__ <= i__1; ++i__) {
424 DataInterface(tout2, tin2, &fg_100, &fg_0, &fParam_1.nevl, &fParam_1.nvar,
425 xpg, &fVarn_1.nclass[i__ - 1], &ikend);
430 CollectVar(&fParam_1.nvar, &fVarn_1.nclass[i__ - 1], xpg);
432 i__2 = fParam_1.nvar;
433 for (j = 1; j <= i__2; ++j) {
434 xeev_ref(i__, j) = xpg[j - 1];
436 if (fVarn_1.iclass == 1) {
437 i__2 = fParam_1.lclass;
438 for (k = 1; k <= i__2; ++k) {
439 if (fVarn_1.nclass[i__ - 1] == k) {
444 i__2 = fParam_1.nvar;
445 for (k = 1; k <= i__2; ++k) {
446 if (xeev_ref(i__, k) < fVarn_1.xmin[k - 1]) {
447 fVarn_1.xmin[k - 1] = xeev_ref(i__, k);
449 if (xeev_ref(i__, k) > fVarn_1.xmax[k - 1]) {
450 fVarn_1.xmax[k - 1] = xeev_ref(i__, k);
455 if (fVarn_1.iclass == 1) {
456 i__2 = fParam_1.lclass;
457 for (k = 1; k <= i__2; ++k) {
458 i__1 = fParam_1.lclass;
459 for (l = 1; l <= i__1; ++l) {
460 if (nocla[k - 1] != nocla[l - 1]) {
466 i__1 = fParam_1.nevl;
467 for (i__ = 1; i__ <= i__1; ++i__) {
468 i__2 = fParam_1.nvar;
469 for (l = 1; l <= i__2; ++l) {
470 if (fVarn_1.xmax[l - 1] == (Float_t)0. && fVarn_1.xmin[l - 1] == (
472 xeev_ref(i__, l) = (Float_t)0.;
475 xeev_ref(i__, l) = xeev_ref(i__, l) - (fVarn_1.xmax[l - 1] +
476 fVarn_1.xmin[l - 1]) / 2.;
477 xeev_ref(i__, l) = xeev_ref(i__, l) / ((fVarn_1.xmax[l - 1] -
478 fVarn_1.xmin[l - 1]) / 2.);
486 #define delw_ref(a_1,a_2,a_3) fDel_1.delw[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
487 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
488 #define x_ref(a_1,a_2) fNeur_1.x[(a_2)*max_nLayers_ + a_1 - 7]
489 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
490 #define delta_ref(a_1,a_2,a_3) fDel_1.delta[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
491 #define delww_ref(a_1,a_2) fDel_1.delww[(a_2)*max_nLayers_ + a_1 - 7]
492 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
493 #define del_ref(a_1,a_2) fDel_1.del[(a_2)*max_nLayers_ + a_1 - 7]
494 #define deltaww_ref(a_1,a_2) fNeur_1.deltaww[(a_2)*max_nLayers_ + a_1 - 7]
499 void TMVA::MethodCFMlpANN_Utils::En_arriere( Int_t *ievent )
501 Int_t i__1, i__2, i__3;
507 i__1 = fNeur_1.neuron[fParam_1.layerm - 1];
508 for (i__ = 1; i__ <= i__1; ++i__) {
509 if (fVarn_1.nclass[*ievent - 1] == i__) {
510 fNeur_1.o[i__ - 1] = 1.;
513 fNeur_1.o[i__ - 1] = -1.;
517 i__1 = fNeur_1.neuron[l - 1];
518 for (i__ = 1; i__ <= i__1; ++i__) {
520 df = (f + 1.) * (1. - f) / (fDel_1.temp[l - 1] * 2.);
521 del_ref(l, i__) = df * (fNeur_1.o[i__ - 1] - y_ref(l, i__)) *
522 fDel_1.coef[i__ - 1];
523 delww_ref(l, i__) = fParam_1.eeps * del_ref(l, i__);
524 i__2 = fNeur_1.neuron[l - 2];
525 for (j = 1; j <= i__2; ++j) {
526 delw_ref(l, i__, j) = fParam_1.eeps * del_ref(l, i__) * y_ref(l -
531 for (l = fParam_1.layerm - 1; l >= 2; --l) {
532 i__2 = fNeur_1.neuron[l - 1];
533 for (i__ = 1; i__ <= i__2; ++i__) {
535 i__1 = fNeur_1.neuron[l];
536 for (k = 1; k <= i__1; ++k) {
537 uu += w_ref(l + 1, k, i__) * del_ref(l + 1, k);
539 Foncf(&l, &x_ref(l, i__), &f);
540 df = (f + 1.) * (1. - f) / (fDel_1.temp[l - 1] * 2.);
541 del_ref(l, i__) = df * uu;
542 delww_ref(l, i__) = fParam_1.eeps * del_ref(l, i__);
543 i__1 = fNeur_1.neuron[l - 2];
544 for (j = 1; j <= i__1; ++j) {
545 delw_ref(l, i__, j) = fParam_1.eeps * del_ref(l, i__) * y_ref(
550 i__1 = fParam_1.layerm;
551 for (l = 2; l <= i__1; ++l) {
552 i__2 = fNeur_1.neuron[l - 1];
553 for (i__ = 1; i__ <= i__2; ++i__) {
554 deltaww_ref(l, i__) = delww_ref(l, i__) + fParam_1.eta *
556 ww_ref(l, i__) = ww_ref(l, i__) + deltaww_ref(l, i__);
557 i__3 = fNeur_1.neuron[l - 2];
558 for (j = 1; j <= i__3; ++j) {
559 delta_ref(l, i__, j) = delw_ref(l, i__, j) + fParam_1.eta *
560 delta_ref(l, i__, j);
561 w_ref(l, i__, j) = w_ref(l, i__, j) + delta_ref(l, i__, j);
577 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
578 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
582 void TMVA::MethodCFMlpANN_Utils::Out( Int_t *iii, Int_t *maxcycle )
586 if (*iii == *maxcycle) {
594 #define delta_ref(a_1,a_2,a_3) fDel_1.delta[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
595 #define deltaww_ref(a_1,a_2) fNeur_1.deltaww[(a_2)*max_nLayers_ + a_1 - 7]
599 void TMVA::MethodCFMlpANN_Utils::Innit(
char *det, Double_t *tout2, Double_t *tin2, Int_t )
602 Int_t i__1, i__2, i__3;
605 Int_t nevod, layer, ktest, i1, nrest;
608 Double_t xxx = 0.0, yyy = 0.0;
610 Leclearn(&ktest, tout2, tin2);
611 Lecev2(&ktest, tout2, tin2);
613 printf(
" .... strange to be here (1) ... \n");
616 i__1 = fParam_1.layerm - 1;
617 for (layer = 1; layer <= i__1; ++layer) {
618 i__2 = fNeur_1.neuron[layer];
619 for (j = 1; j <= i__2; ++j) {
620 deltaww_ref(layer + 1, j) = 0.;
621 i__3 = fNeur_1.neuron[layer - 1];
622 for (i__ = 1; i__ <= i__3; ++i__) {
623 delta_ref(layer + 1, j, i__) = 0.;
627 if (fParam_1.ichoi == 1) {
634 i__3 = fParam_1.nblearn;
635 Timer timer( i__3,
"CFMlpANN" );
636 Int_t num = i__3/100;
638 for (i1 = 1; i1 <= i__3; ++i1) {
640 if ( ( num>0 && (i1-1)%num == 0) || (i1 == i__3) ) timer.DrawProgressBar( i1-1 );
642 i__2 = fParam_1.nevl;
643 for (i__ = 1; i__ <= i__2; ++i__) {
645 if (fCost_1.ieps == 2) {
646 fParam_1.eeps = Fdecroi(&kkk);
648 if (fCost_1.ieps == 1) {
649 fParam_1.eeps = fParam_1.epsmin;
651 Bool_t doCont = kTRUE;
652 if (fVarn_1.iclass == 2) {
653 ievent = (Int_t) ((Double_t) fParam_1.nevl * Sen3a());
659 if (fVarn_1.iclass == 1) {
660 nevod = fParam_1.nevl / fParam_1.lclass;
661 nrest = i__ % fParam_1.lclass;
662 fParam_1.ndiv = i__ / fParam_1.lclass;
664 ievent = fParam_1.ndiv + 1 + (fParam_1.lclass - nrest) *
668 ievent = fParam_1.ndiv;
676 if (i1 % fParam_1.ndivis == 0 || i1 == 1 || i1 == fParam_1.nblearn) {
679 GraphNN(&i1, &xxx, &yyy, det, (Int_t)20);
680 Out(&i1, &fParam_1.nblearn);
682 if (xxx < fCost_1.tolcou) {
683 GraphNN(&fParam_1.nblearn, &xxx, &yyy, det, (Int_t)20);
684 Out(&fParam_1.nblearn, &fParam_1.nblearn);
696 void TMVA::MethodCFMlpANN_Utils::TestNN()
704 if (fParam_1.layerm > max_nLayers_) {
706 printf(
"Error: number of layers exceeds maximum: %i, %i ==> abort",
707 fParam_1.layerm, max_nLayers_ );
708 Arret(
"modification of mlpl3_param_lim.inc is needed ");
710 if (fParam_1.nevl > max_Events_) {
712 printf(
"Error: number of training events exceeds maximum: %i, %i ==> abort",
713 fParam_1.nevl, max_Events_ );
714 Arret(
"modification of mlpl3_param_lim.inc is needed ");
716 if (fParam_1.nevt > max_Events_) {
717 printf(
"Error: number of testing events exceeds maximum: %i, %i ==> abort",
718 fParam_1.nevt, max_Events_ );
719 Arret(
"modification of mlpl3_param_lim.inc is needed ");
721 if (fParam_1.lclass < fNeur_1.neuron[fParam_1.layerm - 1]) {
723 printf(
"Error: wrong number of classes at ouput layer: %i != %i ==> abort\n",
724 fNeur_1.neuron[fParam_1.layerm - 1], fParam_1.lclass);
725 Arret(
"problem needs to reported ");
727 if (fParam_1.nvar > max_nVar_) {
729 printf(
"Error: number of variables exceeds maximum: %i, %i ==> abort",
730 fParam_1.nvar, fg_max_nVar_ );
731 Arret(
"modification of mlpl3_param_lim.inc is needed");
733 i__1 = fParam_1.layerm;
734 for (i__ = 1; i__ <= i__1; ++i__) {
735 if (fNeur_1.neuron[i__ - 1] > max_nNodes_) {
737 printf(
"Error: number of neurons at layer exceeds maximum: %i, %i ==> abort",
738 i__, fg_max_nNodes_ );
742 printf(
" .... strange to be here (2) ... \n");
747 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
752 void TMVA::MethodCFMlpANN_Utils::Cout( Int_t * , Double_t *xxx )
761 i__1 = fParam_1.nevl;
762 for (i__ = 1; i__ <= i__1; ++i__) {
764 i__2 = fNeur_1.neuron[fParam_1.layerm - 1];
765 for (j = 1; j <= i__2; ++j) {
766 if (fVarn_1.nclass[i__ - 1] == j) {
767 fNeur_1.o[j - 1] = 1.;
770 fNeur_1.o[j - 1] = -1.;
773 d__1 = y_ref(fParam_1.layerm, j) - fNeur_1.o[j - 1];
774 c__ += fDel_1.coef[j - 1] * (d__1 * d__1);
777 c__ /= (Double_t) (fParam_1.nevl * fParam_1.lclass) * 2.;
779 fCost_1.ancout = c__;
784 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
785 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
790 void TMVA::MethodCFMlpANN_Utils::Inl()
794 Int_t jmax, k, layer, kk, nq, nr;
796 i__1 = fParam_1.nvar;
797 i__1 = fParam_1.layerm;
798 i__1 = fParam_1.layerm - 1;
799 for (layer = 1; layer <= i__1; ++layer) {
800 nq = fNeur_1.neuron[layer] / 10;
801 nr = fNeur_1.neuron[layer] - nq * 10;
809 for (k = 1; k <= i__2; ++k) {
812 if (fNeur_1.neuron[layer] < jmax) {
813 jmax = fNeur_1.neuron[layer];
826 Double_t TMVA::MethodCFMlpANN_Utils::Fdecroi( Int_t *i__ )
832 aaa = (fParam_1.epsmin - fParam_1.epsmax) / (Double_t) (fParam_1.nblearn *
834 bbb = fParam_1.epsmax - aaa;
835 ret_val = aaa * (Double_t) (*i__) + bbb;
839 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
844 void TMVA::MethodCFMlpANN_Utils::GraphNN( Int_t *ilearn, Double_t * ,
845 Double_t * ,
char * , Int_t )
849 Double_t xmok[max_nNodes_];
851 Double_t xmko[max_nNodes_];
856 Int_t nko[max_nNodes_], nok[max_nNodes_];
864 i__1 = fNeur_1.neuron[fParam_1.layerm - 1];
865 for (i__ = 1; i__ <= i__1; ++i__) {
871 i__1 = fParam_1.nevl;
872 for (i__ = 1; i__ <= i__1; ++i__) {
874 i__2 = fNeur_1.neuron[fParam_1.layerm - 1];
875 for (j = 1; j <= i__2; ++j) {
877 if (fVarn_1.nclass[i__ - 1] == j) {
879 xmok[j - 1] += y_ref(fParam_1.layerm, j);
883 xmko[j - 1] += y_ref(fParam_1.layerm, j);
892 i__1 = fNeur_1.neuron[fParam_1.layerm - 1];
893 for (j = 1; j <= i__1; ++j) {
894 xmok[j - 1] /= (Double_t) nok[j - 1];
895 xmko[j - 1] /= (Double_t) nko[j - 1];
896 fNeur_1.cut[j - 1] = (xmok[j - 1] + xmko[j - 1]) / 2.;
898 ix = fNeur_1.neuron[fParam_1.layerm - 1];
907 Double_t TMVA::MethodCFMlpANN_Utils::Sen3a(
void )
911 Double_t f1 = 2.44140625e-4;
912 Double_t f2 = 5.96046448e-8;
913 Double_t f3 = 1.45519152e-11;
917 static Int_t fg_i1 = 3823;
918 static Int_t fg_i2 = 4006;
919 static Int_t fg_i3 = 2903;
922 Int_t k3, l3, k2, l2, k1, l1;
927 k2 = fg_i2 * j3 + fg_i3 * j2 + l3;
929 k1 = fg_i1 * j3 + fg_i2 * j2 + fg_i3 * j1 + l2;
931 fg_i1 = k1 - l1 * m12;
932 fg_i2 = k2 - l2 * m12;
933 fg_i3 = k3 - l3 * m12;
934 ret_val = f1 * (Double_t) fg_i1 + f2 * (Float_t) fg_i2 + f3 * (Double_t) fg_i3;
941 void TMVA::MethodCFMlpANN_Utils::Foncf( Int_t *i__, Double_t *u, Double_t *f )
946 if (*u / fDel_1.temp[*i__ - 1] > 170.) {
947 *f = .99999999989999999;
949 else if (*u / fDel_1.temp[*i__ - 1] < -170.) {
950 *f = -.99999999989999999;
953 yy = TMath::Exp(-(*u) / fDel_1.temp[*i__ - 1]);
954 *f = (1. - yy) / (yy + 1.);
960 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
965 void TMVA::MethodCFMlpANN_Utils::Cout2( Int_t * , Double_t *yyy )
974 i__1 = fParam_1.nevt;
975 for (i__ = 1; i__ <= i__1; ++i__) {
977 i__2 = fNeur_1.neuron[fParam_1.layerm - 1];
978 for (j = 1; j <= i__2; ++j) {
979 if (fVarn_1.mclass[i__ - 1] == j) {
980 fNeur_1.o[j - 1] = 1.;
983 fNeur_1.o[j - 1] = -1.;
986 d__1 = y_ref(fParam_1.layerm, j) - fNeur_1.o[j - 1];
987 c__ += fDel_1.coef[j - 1] * (d__1 * d__1);
990 c__ /= (Double_t) (fParam_1.nevt * fParam_1.lclass) * 2.;
996 #define xx_ref(a_1,a_2) fVarn3_1(a_1,a_2)
1001 void TMVA::MethodCFMlpANN_Utils::Lecev2( Int_t *ktest, Double_t *tout2, Double_t *tin2 )
1008 Double_t xpg[max_nVar_];
1016 i__1 = fParam_1.lclass;
1020 i__1 = fParam_1.nevt;
1021 for (i__ = 1; i__ <= i__1; ++i__) {
1022 DataInterface(tout2, tin2, &fg_999, &fg_0, &fParam_1.nevt, &fParam_1.nvar,
1023 xpg, &fVarn_1.mclass[i__ - 1], &ikend);
1029 i__2 = fParam_1.nvar;
1030 for (j = 1; j <= i__2; ++j) {
1031 xx_ref(i__, j) = xpg[j - 1];
1035 i__1 = fParam_1.nevt;
1036 for (i__ = 1; i__ <= i__1; ++i__) {
1037 i__2 = fParam_1.nvar;
1038 for (l = 1; l <= i__2; ++l) {
1039 if (fVarn_1.xmax[l - 1] == (Float_t)0. && fVarn_1.xmin[l - 1] == (
1041 xx_ref(i__, l) = (Float_t)0.;
1044 xx_ref(i__, l) = xx_ref(i__, l) - (fVarn_1.xmax[l - 1] +
1045 fVarn_1.xmin[l - 1]) / 2.;
1046 xx_ref(i__, l) = xx_ref(i__, l) / ((fVarn_1.xmax[l - 1] -
1047 fVarn_1.xmin[l - 1]) / 2.);
1055 #define w_ref(a_1,a_2,a_3) fNeur_1.w[((a_3)*max_nNodes_ + (a_2))*max_nLayers_ + a_1 - 187]
1056 #define x_ref(a_1,a_2) fNeur_1.x[(a_2)*max_nLayers_ + a_1 - 7]
1057 #define y_ref(a_1,a_2) fNeur_1.y[(a_2)*max_nLayers_ + a_1 - 7]
1058 #define ww_ref(a_1,a_2) fNeur_1.ww[(a_2)*max_nLayers_ + a_1 - 7]
1059 #define xx_ref(a_1,a_2) fVarn3_1(a_1,a_2)
1064 void TMVA::MethodCFMlpANN_Utils::En_avant2( Int_t *ievent )
1066 Int_t i__1, i__2, i__3;
1072 i__1 = fNeur_1.neuron[0];
1073 for (i__ = 1; i__ <= i__1; ++i__) {
1074 y_ref(1, i__) = xx_ref(*ievent, i__);
1076 i__1 = fParam_1.layerm - 1;
1077 for (layer = 1; layer <= i__1; ++layer) {
1078 i__2 = fNeur_1.neuron[layer];
1079 for (j = 1; j <= i__2; ++j) {
1080 x_ref(layer + 1, j) = 0.;
1081 i__3 = fNeur_1.neuron[layer - 1];
1082 for (i__ = 1; i__ <= i__3; ++i__) {
1083 x_ref(layer + 1, j) = x_ref(layer + 1, j) + y_ref(layer, i__)
1084 * w_ref(layer + 1, j, i__);
1086 x_ref(layer + 1, j) = x_ref(layer + 1, j) + ww_ref(layer + 1, j);
1088 Foncf(&i__3, &x_ref(layer + 1, j), &f);
1089 y_ref(layer + 1, j) = f;
1103 void TMVA::MethodCFMlpANN_Utils::Arret(
const char* mot )
1106 printf(
"%s: %s",fg_MethodName, mot);
1113 void TMVA::MethodCFMlpANN_Utils::CollectVar( Int_t * , Int_t * , Double_t * )