43 #if __cplusplus > 199711L 49 #include "TDirectory.h" 79 Types::EMVA methodType,
84 :
TMVA::
MethodBase( jobName, methodType, methodTitle, theData, theOption, theTargetDir )
101 :
TMVA::
MethodBase( methodType, theData, theWeightFile, theTargetDir )
126 DeclareOptionRef(
fRandomSeed = 1,
"RandomSeed",
"Random seed for initial synapse weights (0 means unique seed for each run; default value '1')");
129 "MSE (Mean Square Estimator) for Gaussian Likelihood or CE(Cross-Entropy) for Bernoulli Likelihood" );
136 Int_t nTypes = names->size();
137 for (
Int_t i = 0; i < nTypes; i++)
144 nTypes = names->size();
170 std::vector<Int_t>* layout =
new std::vector<Int_t>();
172 while(layerSpec.
Length()>0) {
174 if (layerSpec.
First(
',')<0) {
179 sToAdd = layerSpec(0,layerSpec.
First(
','));
180 layerSpec = layerSpec(layerSpec.First(
',')+1,layerSpec.Length());
184 nNodes += atoi(sToAdd);
185 layout->push_back(nNodes);
190 layout->push_back(
DataInfo().GetNClasses() );
192 layout->push_back(1);
195 for( std::vector<Int_t>::iterator it = layout->begin(); it != layout->end(); it++ ){
247 for (
Int_t i = 0; i < numLayers; i++) {
277 for (
Int_t i = 0; i < numNeurons; i++) {
338 Int_t numLayers = layout->size();
340 for (
Int_t i = 0; i < numLayers; i++) {
342 BuildLayer(layout->at(i), curLayer, prevLayer, i, numLayers, fromFile);
343 prevLayer = curLayer;
348 for (
Int_t i = 0; i < numLayers; i++) {
351 if (i!=0 && i!=numLayers-1)
fRegulators.push_back(0.);
352 for (
Int_t j = 0; j < numNeurons; j++) {
356 for (
Int_t k = 0; k < numSynapses; k++) {
374 for (
Int_t j = 0; j < numNeurons; j++) {
375 if (fromFile && (layerIndex != numLayers-1) && (j==numNeurons-1)){
380 curLayer->
Add(neuron);
387 if (layerIndex == 0) {
393 if (layerIndex == numLayers-1) {
402 curLayer->
Add(neuron);
408 if (layerIndex != numLayers-1) {
413 curLayer->
Add(neuron);
427 for (
Int_t i = 0; i < numNeurons; i++) {
447 for (
Int_t i = 0; i < numSynapses; i++) {
462 for (
Int_t i = 0; i < numSynapses; i++) {
497 for (
Int_t i = 0; i < numLayers; i++) {
501 for (
Int_t j = 0; j < numNeurons; j++) {
524 Log() <<
kINFO <<
"***Type anything to continue (q to quit): ";
525 std::getline(std::cin, dummy);
526 if (dummy ==
"q" || dummy ==
"Q") {
538 if (!
Debug())
return;
542 Log() <<
kINFO <<
"-------------------------------------------------------------------" <<
Endl;
547 for (
Int_t i = 0; i < numLayers; i++) {
552 Log() <<
kINFO <<
"Layer #" << i <<
" (" << numNeurons <<
" neurons):" <<
Endl;
565 for (
Int_t j = 0; j < numNeurons; j++) {
579 <<
"\t\tValue:\t" << neuron->
GetValue()
582 Log() <<
kINFO <<
"\t\tActivationEquation:\t";
642 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
647 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
685 std::vector<Float_t> temp;
688 for (
UInt_t icls = 0; icls < nClasses; icls++) {
692 for(
UInt_t iClass=0; iClass<nClasses; iClass++){
694 for(
UInt_t j=0;j<nClasses;j++){
696 norm+=
exp(temp[j]-temp[iClass]);
698 (*fMulticlassReturnVal).push_back(1.0/(1.0+norm));
717 for (
Int_t i = 0; i < numLayers; i++) {
723 for (
Int_t j = 0; j < numNeurons; j++) {
728 if(numSynapses==0)
continue;
729 std::stringstream s(
"");
731 for (
Int_t k = 0; k < numSynapses; k++) {
733 s << std::scientific << synapse->
GetWeight() <<
" ";
757 for(
Int_t row = 0; row < nRows; ++row ){
762 std::stringstream s(
"");
764 for(
Int_t col = 0; col < nCols; ++col ){
765 s << std::scientific << (*(elements+index)) <<
" ";
782 std::vector<Int_t>* layout =
new std::vector<Int_t>();
784 void* xmlLayout =
NULL;
787 xmlLayout = wghtnode;
791 layout->resize( nLayers );
799 layout->at(index) = nNeurons;
828 std::stringstream s(content);
829 for (
UInt_t iSyn = 0; iSyn<nSyn; iSyn++) {
846 void* xmlInvHessian =
NULL;
867 Log() <<
kFATAL <<
"you tried to read a hessian matrix with " << nElements <<
" elements, --> too large, guess s.th. went wrong reading from the weight file" <<
Endl;
870 elements =
new Double_t[nElements+10];
883 std::stringstream s(content);
884 for (
Int_t iCol = 0; iCol<nCols; iCol++) {
885 s >> (*(elements+index));
909 std::vector<Double_t>* weights =
new std::vector<Double_t>();
911 while (istr>> dummy >> weight) weights->push_back(weight);
942 meanS, meanB, rmsS, rmsB, xmin, xmax );
946 if (avgVal<meanrms) avgVal = meanrms;
949 for (
Int_t j = 0; j < numSynapses; j++) {
954 importance *= avgVal * avgVal;
965 std::vector<TH1*>* hv )
const 970 for (
Int_t i = 0; i < numLayers-1; i++) {
978 hist =
new TH2F(name +
"", name +
"",
979 numNeurons1, 0, numNeurons1, numNeurons2, 0, numNeurons2);
981 for (
Int_t j = 0; j < numNeurons1; j++) {
986 for (
Int_t k = 0; k < numSynapses; k++) {
989 hist->SetBinContent(j+1, k+1, synapse->
GetWeight());
994 if (hv) hv->push_back( hist );
1016 #if __cplusplus > 199711L 1017 static std::atomic<int> epochMonitoringDirectoryNumber{0};
1019 static int epochMonitoringDirectoryNumber = 0;
1021 int epochVal = epochMonitoringDirectoryNumber++;
1052 fout <<
" double ActivationFnc(double x) const;" << std::endl;
1053 fout <<
" double OutputActivationFnc(double x) const;" << std::endl;
1055 fout <<
" int fLayers;" << std::endl;
1056 fout <<
" int fLayerSize["<<numLayers<<
"];" << std::endl;
1057 int numNodesFrom = -1;
1058 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1060 if (numNodesFrom<0) { numNodesFrom=numNodesTo;
continue; }
1061 fout <<
" double fWeightMatrix" << lIdx-1 <<
"to" << lIdx <<
"[" << numNodesTo <<
"][" << numNodesFrom <<
"];";
1062 fout <<
" // weight matrix from layer " << lIdx-1 <<
" to " << lIdx << std::endl;
1063 numNodesFrom = numNodesTo;
1066 fout <<
" double * fWeights["<<numLayers<<
"];" << std::endl;
1067 fout <<
"};" << std::endl;
1071 fout <<
"inline void " << className <<
"::Initialize()" << std::endl;
1072 fout <<
"{" << std::endl;
1073 fout <<
" // build network structure" << std::endl;
1074 fout <<
" fLayers = " << numLayers <<
";" << std::endl;
1075 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1078 fout <<
" fLayerSize[" << lIdx <<
"] = " << numNodes <<
"; fWeights["<<lIdx<<
"] = new double["<<numNodes<<
"]; " << std::endl;
1081 for (
Int_t i = 0; i < numLayers-1; i++) {
1082 fout <<
" // weight matrix from layer " << i <<
" to " << i+1 << std::endl;
1085 for (
Int_t j = 0; j < numNeurons; j++) {
1088 for (
Int_t k = 0; k < numSynapses; k++) {
1090 fout <<
" fWeightMatrix" << i <<
"to" << i+1 <<
"[" << k <<
"][" << j <<
"] = " << synapse->
GetWeight() <<
";" << std::endl;
1095 fout <<
"}" << std::endl;
1099 fout <<
"inline double " << className <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
1100 fout <<
"{" << std::endl;
1101 fout <<
" if (inputValues.size() != (unsigned int)fLayerSize[0]-1) {" << std::endl;
1102 fout <<
" std::cout << \"Input vector needs to be of size \" << fLayerSize[0]-1 << std::endl;" << std::endl;
1103 fout <<
" return 0;" << std::endl;
1104 fout <<
" }" << std::endl;
1106 fout <<
" for (int l=0; l<fLayers; l++)" << std::endl;
1107 fout <<
" for (int i=0; i<fLayerSize[l]; i++) fWeights[l][i]=0;" << std::endl;
1109 fout <<
" for (int l=0; l<fLayers-1; l++)" << std::endl;
1110 fout <<
" fWeights[l][fLayerSize[l]-1]=1;" << std::endl;
1112 fout <<
" for (int i=0; i<fLayerSize[0]-1; i++)" << std::endl;
1113 fout <<
" fWeights[0][i]=inputValues[i];" << std::endl;
1115 for (
Int_t i = 0; i < numLayers-1; i++) {
1116 fout <<
" // layer " << i <<
" to " << i+1 << std::endl;
1117 if (i+1 == numLayers-1) {
1118 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]; o++) {" << std::endl;
1121 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]-1; o++) {" << std::endl;
1123 fout <<
" for (int i=0; i<fLayerSize[" << i <<
"]; i++) {" << std::endl;
1124 fout <<
" double inputVal = fWeightMatrix" << i <<
"to" << i+1 <<
"[o][i] * fWeights[" << i <<
"][i];" << std::endl;
1127 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal;" << std::endl;
1130 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal*inputVal;" << std::endl;
1133 fout <<
" fWeights[" << i+1 <<
"][o] += fabs(inputVal);" << std::endl;
1135 fout <<
" }" << std::endl;
1136 if (i+1 != numLayers-1)
1137 fout <<
" fWeights[" << i+1 <<
"][o] = ActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1138 else fout <<
" fWeights[" << i+1 <<
"][o] = OutputActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1139 fout <<
" }" << std::endl;
1142 fout <<
" return fWeights[" << numLayers-1 <<
"][0];" << std::endl;
1143 fout <<
"}" << std::endl;
1146 TString fncName = className+
"::ActivationFnc";
1148 fncName = className+
"::OutputActivationFnc";
1151 fout <<
" " << std::endl;
1152 fout <<
"// Clean up" << std::endl;
1153 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
1154 fout <<
"{" << std::endl;
1155 fout <<
" // clean up the arrays" << std::endl;
1156 fout <<
" for (int lIdx = 0; lIdx < "<<numLayers<<
"; lIdx++) {" << std::endl;
1157 fout <<
" delete[] fWeights[lIdx];" << std::endl;
1158 fout <<
" }" << std::endl;
1159 fout <<
"}" << std::endl;
void WaitForKeyboard()
wait for keyboard input, for debugging
virtual void WriteMonitoringHistosToFile() const
write histograms to file
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
virtual Double_t GetMvaValue(Double_t *err=0, Double_t *errUpper=0)
get the mva value generated by the NN
void BuildLayer(Int_t numNeurons, TObjArray *curLayer, TObjArray *prevLayer, Int_t layerIndex, Int_t numLayers, Bool_t from_file=false)
build a single layer with neurons and synapses connecting this layer to the previous layer ...
Random number generator class based on M.
MsgLogger & Endl(MsgLogger &ml)
void ForceNetworkCalculations()
calculate input values to each neuron
virtual TString GetExpression()=0
void CreateWeightMonitoringHists(const TString &bulkname, std::vector< TH1 *> *hv=0) const
virtual TMatrixTBase< Element > & SetMatrixArray(const Element *data, Option_t *option="")
Copy array data to matrix .
void ForceValue(Double_t value)
force the value, typically for input and bias neurons
void DeleteNetwork()
delete/clear network
TActivation * fActivation
void AddPreLinks(TNeuron *neuron, TObjArray *prevLayer)
add synapses connecting a neuron to its preceding layer
const Ranking * CreateRanking()
compute ranking of input variables by summing function of weights
void SetPostNeuron(TNeuron *post)
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
virtual void ReadWeightsFromStream(std::istream &istr)
destroy/clear the network then read it back in from the weights file
virtual void MakeClassSpecific(std::ostream &, const TString &) const
write specific classifier response
TNeuronInput * fInputCalculator
XMLNodePointer_t GetNext(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
return next to xmlnode node if realnode==kTRUE, any special nodes in between will be skipped ...
TransformationHandler & GetTransformationHandler(Bool_t takeReroutedIfAvailable=true)
virtual TDirectory * mkdir(const char *name, const char *title="")
Create a sub-directory and return a pointer to the created directory.
UInt_t GetNClasses() const
UInt_t GetNTargets() const
Double_t GetActivationValue() const
void AddWeightsXMLTo(void *parent) const
create XML description of ANN classifier
virtual void DeclareOptions()
define the options (their key words) that can be set in the option string here the options valid for ...
TObject * At(Int_t idx) const
void SetActivationEqn(TActivation *activation)
set activation equation
virtual TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1)
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
static const Bool_t fgDEBUG
const char * GetNodeContent(XMLNodePointer_t xmlnode)
get contents (if any) of xml node
Int_t GetNoElements() const
void ForceWeights(std::vector< Double_t > *weights)
force the synapse weights
Bool_t Debug() const
who the hell makes such strange Debug flags that even use "global pointers"..
const TString & GetInputVar(Int_t i) const
std::vector< TH1 * > fEpochMonHistB
TSynapse * PostLinkAt(Int_t index) const
UInt_t GetTrainingTMVAVersionCode() const
void PrintMessage(TString message, Bool_t force=kFALSE) const
print messages, turn off printing by setting verbose and debug flag appropriately ...
const Event * GetEvent() const
Double_t GetXmin(Int_t ivar) const
DataSetInfo & DataInfo() const
Bool_t DoRegression() const
virtual void ProcessOptions()
do nothing specific at this moment
Ssiz_t First(char c) const
Find first occurrence of a character c.
virtual Double_t Rndm(Int_t i=0)
Machine independent random number generator.
Int_t NumPreLinks() const
virtual void BuildNetwork(std::vector< Int_t > *layout, std::vector< Double_t > *weights=NULL, Bool_t fromFile=kFALSE)
build network given a layout (number of neurons in each layer) and optional weights array ...
TActivation * CreateActivation(EActivationType type) const
void ReadWeightsFromXML(void *wghtnode)
read MLP from xml weight file
Double_t GetXmax(Int_t ivar) const
Bool_t DoMulticlass() const
Int_t NumPostLinks() const
virtual void PrintNetwork() const
print network representation, for debugging
Float_t GetTarget(UInt_t itgt) const
virtual void MakeFunction(std::ostream &fout, const TString &fncName)=0
Bool_t AddRawLine(XMLNodePointer_t parent, const char *line)
Add just line into xml file Line should has correct xml syntax that later it can be decoded by xml pa...
const char * GetName() const
Returns name of object.
2-D histogram with a float per channel (see TH1 documentation)}
void Statistics(Types::ETreeType treeType, const TString &theVarName, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &)
calculates rms,mean, xmin, xmax of the event variable this can be either done for the variables as th...
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Double_t GetDelta() const
Int_t GetEntriesFast() const
void PrintActivationEqn()
print activation equation, for debugging
char * Form(const char *fmt,...)
virtual void GetMatrix2Array(Element *data, Option_t *option="") const
Copy matrix data to array .
std::vector< TH1 * > fEpochMonHistW
void PrintPostLinks() const
void SetTarget(UInt_t itgt, Float_t value)
set the target value (dimension itgt) to value
std::vector< Double_t > fRegulators
TNeuron * GetInputNeuron(Int_t index)
std::vector< Int_t > fRegulatorIdx
void InitWeights()
initialize the synapse weights randomly
Double_t GetValue() const
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
TString & Remove(Ssiz_t pos)
#define TMVA_VERSION(a, b, c)
std::vector< Int_t > * ParseLayoutString(TString layerSpec)
parse layout specification string and return a vector, each entry containing the number of neurons to...
XMLAttrPointer_t NewAttr(XMLNodePointer_t xmlnode, XMLNsPointer_t, const char *name, const char *value)
creates new attribute for xmlnode, namespaces are not supported for attributes
virtual const std::vector< Float_t > & GetMulticlassValues()
get the multiclass classification values generated by the NN
TNeuron * GetOutputNeuron(Int_t index=0)
Describe directory structure in memory.
std::vector< Float_t > * fMulticlassReturnVal
void PrintPreLinks() const
Bool_t IsNormalised() const
void ForceNetworkInputs(const Event *ev, Int_t ignoreIndex=-1)
force the input values of the input neurons force the value for each input neuron ...
static RooMathCoreReg dummy
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void CalculateValue()
calculate neuron input
void AddPreDefVal(const T &)
std::vector< TNeuron * > fOutputNeurons
virtual ~MethodANNBase()
destructor
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
void SetPreNeuron(TNeuron *pre)
void SetWeight(Double_t weight)
set synapse weight
void CalculateActivationValue()
calculate neuron activation/output
std::vector< TString > * GetAllActivationNames() const
Abstract ClassifierFactory template that handles arbitrary types.
void AddPostLink(TSynapse *post)
add synapse as a post-link to this neuron
MethodANNBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &theData, const TString &theOption, TDirectory *theTargetDir)
standard constructor Note: Right now it is an option to choose the neuron input function, but only the input function "sum" leads to weight convergence – otherwise the weights go to nan and lead to an ABORT.
virtual Bool_t cd(const char *path=0)
Change current directory to "this" directory.
XMLNodePointer_t GetChild(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
returns first child of xml node
TDirectory * BaseDir() const
returns the ROOT directory where info/histograms etc of the corresponding MVA method instance are sto...
virtual void AddRank(const Rank &rank)
Add a new rank take ownership of it.
XMLNodePointer_t NewChild(XMLNodePointer_t parent, XMLNsPointer_t ns, const char *name, const char *content=0)
create new child element for parent node
virtual const std::vector< Float_t > & GetRegressionValues()
get the regression value generated by the NN
void PrintNeuron(TNeuron *neuron) const
print a neuron, for debugging
Int_t GetEntries() const
Return the number of objects in array (i.e.
std::vector< TH1 * > fEpochMonHistS
std::vector< Float_t > * fRegressionReturnVal
void AddPreLink(TSynapse *pre)
add synapse as a pre-link to this neuron
void DeletePreLinks()
delete all pre-links
TH1F * fEstimatorHistTrain
void DeleteNetworkLayer(TObjArray *&layer)
delete a network layer
void BuildLayers(std::vector< Int_t > *layout, Bool_t from_file=false)
build the network layers
double norm(double *x, double *p)
void SetInputCalculator(TNeuronInput *calculator)
set input calculator
TH1F * fEstimatorHistTest
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
void PrintLayer(TObjArray *layer) const
print a single layer, for debugging
void InitANNBase()
initialize ANNBase object
const char * Data() const