88using std::stringstream;
140 MethodCFMlpANN_nsel(0)
157 MethodCFMlpANN_nsel(0)
177 DeclareOptionRef( fNcycles =3000,
"NCycles",
"Number of training cycles" );
178 DeclareOptionRef( fLayerSpec=
"N,N-1",
"HiddenLayers",
"Specification of hidden layer architecture" );
186 fNodes =
new Int_t[20];
188 Int_t currentHiddenLayer = 1;
190 while(layerSpec.
Length()>0) {
192 if (layerSpec.
First(
',')<0) {
197 sToAdd = layerSpec(0,layerSpec.
First(
','));
198 layerSpec = layerSpec(layerSpec.
First(
',')+1,layerSpec.
Length());
202 nNodes += atoi(sToAdd);
203 fNodes[currentHiddenLayer++] = nNodes;
206 fNodes[0] = GetNvar();
207 fNodes[fNlayers-1] = 2;
209 if (IgnoreEventsWithNegWeightsInTraining()) {
210 Log() << kFATAL <<
"Mechanism to ignore events with negative weights in training not yet available for method: "
211 << GetMethodTypeName()
212 <<
" --> please remove \"IgnoreNegWeightsInTraining\" option from booking string."
216 Log() << kINFO <<
"Use configuration (nodes per layer): in=";
217 for (
Int_t i=0; i<fNlayers-1; i++) Log() << kINFO << fNodes[i] <<
":";
218 Log() << kINFO << fNodes[fNlayers-1] <<
"=out" <<
Endl;
221 Log() <<
"Use " << fNcycles <<
" training cycles" <<
Endl;
223 Int_t nEvtTrain = Data()->GetNTrainingEvents();
229 fData =
new TMatrix( nEvtTrain, GetNvar() );
230 fClass =
new std::vector<Int_t>( nEvtTrain );
235 for (
Int_t ievt=0; ievt<nEvtTrain; ievt++) {
236 const Event * ev = GetEvent(ievt);
239 (*fClass)[ievt] = DataInfo().IsSignal(ev) ? 1 : 2;
242 for (ivar=0; ivar<GetNvar(); ivar++) {
243 (*fData)( ievt, ivar ) = ev->
GetValue(ivar);
259 SetNormalised(
kTRUE );
262 MethodCFMlpANN_nsel = 0;
275 for (
Int_t i=0; i<fNlayers; i++)
delete[] fYNN[i];
287 Int_t ntrain(Data()->GetNTrainingEvents());
289 Int_t nvar(GetNvar());
290 Int_t nlayers(fNlayers);
292 Int_t ncycles(fNcycles);
294 for (
Int_t i=0; i<nlayers; i++) nodes[i] = fNodes[i];
297 for (
Int_t i=0; i<fNlayers; i++)
delete[] fYNN[i];
302 for (
Int_t layer=0; layer<nlayers; layer++)
303 fYNN[layer] =
new Double_t[fNodes[layer]];
307 Train_nn( &dumDat, &dumDat, &ntrain, &ntest, &nvar, &nlayers, nodes, &ncycles );
309 Log() << kWARNING <<
"<Train> sorry CFMlpANN does not run on Windows" <<
Endl;
323 const Event* ev = GetEvent();
326 std::vector<Double_t> inputVec( GetNvar() );
327 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) inputVec[ivar] = ev->
GetValue(ivar);
329 Double_t myMVA = EvalANN( inputVec, isOK );
330 if (!isOK) Log() << kFATAL <<
"EvalANN returns (!isOK) for event " <<
Endl;
333 NoErrorCalc(err, errUpper);
345 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) xeev[ivar] = inVar[ivar];
349 for (
UInt_t jvar=0; jvar<GetNvar(); jvar++) {
351 if (fVarn_1.xmax[jvar] < xeev[jvar]) xeev[jvar] = fVarn_1.xmax[jvar];
352 if (fVarn_1.xmin[jvar] > xeev[jvar]) xeev[jvar] = fVarn_1.xmin[jvar];
353 if (fVarn_1.xmax[jvar] == fVarn_1.xmin[jvar]) {
358 xeev[jvar] = xeev[jvar] - ((fVarn_1.xmax[jvar] + fVarn_1.xmin[jvar])/2);
359 xeev[jvar] = xeev[jvar] / ((fVarn_1.xmax[jvar] - fVarn_1.xmin[jvar])/2);
365 Double_t retval = 0.5*(1.0 + fYNN[fParam_1.layerm-1][0]);
377 for (
Int_t ivar=0; ivar<fNeur_1.neuron[0]; ivar++) fYNN[0][ivar] = xeev[ivar];
379 for (
Int_t layer=1; layer<fParam_1.layerm; layer++) {
380 for (
Int_t j=1; j<=fNeur_1.neuron[layer]; j++) {
382 Double_t x = Ww_ref(fNeur_1.ww, layer+1,j);
384 for (
Int_t k=1; k<=fNeur_1.neuron[layer-1]; k++) {
385 x += fYNN[layer-1][k-1]*W_ref(fNeur_1.w, layer+1, j, k);
387 fYNN[layer][j-1] = NN_fonc( layer,
x );
399 if (u/fDel_1.temp[i] > 170)
f = +1;
400 else if (u/fDel_1.temp[i] < -170)
f = -1;
403 f = (1 - yy)/(1 + yy);
418 istr >> nva >> lclass;
420 if (GetNvar() != nva)
421 Log() << kFATAL <<
"<ReadWeightsFromFile> mismatch in number of variables" <<
Endl;
425 Log() << kFATAL <<
"<ReadWeightsFromFile> mismatch in number of classes" <<
Endl;
429 Log() << kFATAL <<
"<ReadWeightsFromStream> reached EOF prematurely " <<
Endl;
432 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++)
433 istr >> fVarn_1.xmax[ivar] >> fVarn_1.xmin[ivar];
436 istr >> fParam_1.layerm;
439 for (
Int_t i=0; i<fNlayers; i++)
delete[] fYNN[i];
443 fYNN =
new Double_t*[fParam_1.layerm];
444 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
447 istr >> fNeur_1.neuron[layer];
448 fYNN[layer] =
new Double_t[fNeur_1.neuron[layer]];
453 char* dumchar =
new char[
nchar];
456 for (
Int_t layer=1; layer<=fParam_1.layerm-1; layer++) {
458 Int_t nq = fNeur_1.neuron[layer]/10;
459 Int_t nr = fNeur_1.neuron[layer] - nq*10;
465 for (
Int_t k=1; k<=kk; k++) {
466 Int_t jmin = 10*k - 9;
468 if (fNeur_1.neuron[layer]<jmax) jmax = fNeur_1.neuron[layer];
469 for (
Int_t j=jmin; j<=jmax; j++) {
470 istr >> Ww_ref(fNeur_1.ww, layer+1, j);
472 for (
Int_t i=1; i<=fNeur_1.neuron[layer-1]; i++) {
473 for (
Int_t j=jmin; j<=jmax; j++) {
474 istr >> W_ref(fNeur_1.w, layer+1, j, i);
478 istr.getline( dumchar,
nchar );
482 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
485 istr.getline( dumchar,
nchar );
486 istr.getline( dumchar,
nchar );
488 istr >> fDel_1.temp[layer];
492 if ((
Int_t)GetNvar() != fNeur_1.neuron[0]) {
493 Log() << kFATAL <<
"<ReadWeightsFromFile> mismatch in zeroth layer:"
494 << GetNvar() <<
" " << fNeur_1.neuron[0] <<
Endl;
497 fNlayers = fParam_1.layerm;
515 Log() << kFATAL <<
"ERROR in MethodCFMlpANN_DataInterface zero pointer xpg" <<
Endl;
517 if (*nvar != (
Int_t)this->GetNvar()) {
518 Log() << kFATAL <<
"ERROR in MethodCFMlpANN_DataInterface mismatch in num of variables: "
519 << *nvar <<
" " << this->GetNvar() <<
Endl;
523 *iclass = (
int)this->GetClass( MethodCFMlpANN_nsel );
524 for (
UInt_t ivar=0; ivar<this->GetNvar(); ivar++)
525 xpg[ivar] = (
double)this->GetData( MethodCFMlpANN_nsel, ivar );
527 ++MethodCFMlpANN_nsel;
544 for (
Int_t ivar=0; ivar<fParam_1.nvar; ivar++)
545 s << std::scientific << fVarn_1.xmin[ivar] <<
" " << fVarn_1.xmax[ivar] <<
" ";
550 for (
Int_t layer=0; layer<fParam_1.layerm; layer++)
551 n << std::scientific << fNeur_1.neuron[layer] <<
" ";
553 for (
Int_t layer=1; layer<fParam_1.layerm; layer++) {
555 gTools().
AddAttr(layernode,
"NNeurons",fNeur_1.neuron[layer]);
556 void* neuronnode=NULL;
557 for (
Int_t neuron=0; neuron<fNeur_1.neuron[layer]; neuron++) {
559 stringstream weights;
560 weights.precision( 16 );
561 weights << std::scientific << Ww_ref(fNeur_1.ww, layer+1, neuron+1);
562 for (
Int_t i=0; i<fNeur_1.neuron[layer-1]; i++) {
563 weights <<
" " << std::scientific << W_ref(fNeur_1.w, layer+1, neuron+1, i+1);
570 temp.precision( 16 );
571 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
572 temp << std::scientific << fDel_1.temp[layer] <<
" ";
584 stringstream content(minmaxcontent);
585 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++)
586 content >> fVarn_1.xmin[ivar] >> fVarn_1.xmax[ivar];
588 for (
Int_t i=0; i<fNlayers; i++)
delete[] fYNN[i];
592 fYNN =
new Double_t*[fParam_1.layerm];
595 stringstream ncontent(neuronscontent);
596 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
599 ncontent >> fNeur_1.neuron[layer];
600 fYNN[layer] =
new Double_t[fNeur_1.neuron[layer]];
602 for (
Int_t layer=1; layer<fParam_1.layerm; layer++) {
604 void* neuronnode=NULL;
606 for (
Int_t neuron=0; neuron<fNeur_1.neuron[layer]; neuron++) {
608 stringstream weights(neuronweights);
609 weights >> Ww_ref(fNeur_1.ww, layer+1, neuron+1);
610 for (
Int_t i=0; i<fNeur_1.neuron[layer-1]; i++) {
611 weights >> W_ref(fNeur_1.w, layer+1, neuron+1, i+1);
618 stringstream t(temp);
619 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
620 t >> fDel_1.temp[layer];
622 fNlayers = fParam_1.layerm;
631 o <<
"Number of vars " << fParam_1.nvar << std::endl;
632 o <<
"Output nodes " << fParam_1.lclass << std::endl;
635 for (
Int_t ivar=0; ivar<fParam_1.nvar; ivar++)
636 o <<
"Var " << ivar <<
" [" << fVarn_1.xmin[ivar] <<
" - " << fVarn_1.xmax[ivar] <<
"]" << std::endl;
639 o <<
"Number of layers " << fParam_1.layerm << std::endl;
641 o <<
"Nodes per layer ";
642 for (
Int_t layer=0; layer<fParam_1.layerm; layer++)
644 o << fNeur_1.neuron[layer] <<
" ";
648 for (
Int_t layer=1; layer<=fParam_1.layerm-1; layer++) {
650 Int_t nq = fNeur_1.neuron[layer]/10;
651 Int_t nr = fNeur_1.neuron[layer] - nq*10;
657 for (
Int_t k=1; k<=kk; k++) {
658 Int_t jmin = 10*k - 9;
661 if (fNeur_1.neuron[layer]<jmax) jmax = fNeur_1.neuron[layer];
662 for (j=jmin; j<=jmax; j++) {
665 o << Ww_ref(fNeur_1.ww, layer+1, j) <<
" ";
670 for (i=1; i<=fNeur_1.neuron[layer-1]; i++) {
671 for (j=jmin; j<=jmax; j++) {
673 o << W_ref(fNeur_1.w, layer+1, j, i) <<
" ";
682 for (
Int_t layer=0; layer<fParam_1.layerm; layer++) {
683 o <<
"Del.temp in layer " << layer <<
" : " << fDel_1.temp[layer] << std::endl;
692 fout <<
" // not implemented for class: \"" << className <<
"\"" << std::endl;
693 fout <<
"};" << std::endl;
714 Log() <<
"<None>" <<
Endl;
718 Log() <<
"<None>" <<
Endl;
722 Log() <<
"<None>" <<
Endl;
#define REGISTER_METHOD(CLASS)
for example
interop::TCppScope_t fClass
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t nchar
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
TMatrixT< Float_t > TMatrix
Class that contains all the data information.
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
Virtual base Class for all MVA method.
void SetLogger(MsgLogger *l)
void PrintWeights(std::ostream &o) const
write the weights of the neural net
void DeclareOptions() override
define the options (their key words) that can be set in the option string know options: NCycles=xx :t...
void MakeClassSpecificHeader(std::ostream &, const TString &="") const override
write specific classifier response for header
void ReadWeightsFromXML(void *wghtnode) override
read weights from xml file
Double_t EvalANN(std::vector< Double_t > &, Bool_t &isOK)
evaluates NN value as function of input variables
void AddWeightsXMLTo(void *parent) const override
write weights to xml file
void NN_ava(Double_t *)
auxiliary functions
Int_t DataInterface(Double_t *, Double_t *, Int_t *, Int_t *, Int_t *, Int_t *, Double_t *, Int_t *, Int_t *) override
data interface function
void MakeClassSpecific(std::ostream &, const TString &) const override
void Train(void) override
training of the Clement-Ferrand NN classifier
void ProcessOptions() override
decode the options in the option string
Double_t GetMvaValue(Double_t *err=nullptr, Double_t *errUpper=nullptr) override
returns CFMlpANN output (normalised within [0,1])
Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t) override
CFMlpANN can handle classification with 2 classes.
Double_t NN_fonc(Int_t, Double_t) const
activation function
void ReadWeightsFromStream(std::istream &istr) override
read back the weight from the training from file (stream)
void Init(void) override
default initialisation called by all constructors
virtual ~MethodCFMlpANN(void)
destructor
MethodCFMlpANN(const TString &jobName, const TString &methodTitle, DataSetInfo &theData, const TString &theOption="3000:N-1:N-2")
standard constructor
void GetHelpMessage() const override
get help message text
Singleton class for Global types used by TMVA.
Ssiz_t First(char c) const
Find first occurrence of a character c.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Remove(Ssiz_t pos)
create variable transformations
MsgLogger & Endl(MsgLogger &ml)
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.