69 #if __cplusplus > 199711L 85 Types::EMVA methodType,
89 :
TMVA::
MethodBase( jobName, methodType, methodTitle, theData, theOption)
130 DeclareOptionRef(
fRandomSeed = 1,
"RandomSeed",
"Random seed for initial synapse weights (0 means unique seed for each run; default value '1')");
133 "MSE (Mean Square Estimator) for Gaussian Likelihood or CE(Cross-Entropy) for Bernoulli Likelihood" );
140 Int_t nTypes = names->size();
141 for (
Int_t i = 0; i < nTypes; i++)
148 nTypes = names->size();
174 std::vector<Int_t>* layout =
new std::vector<Int_t>();
176 while(layerSpec.
Length()>0) {
178 if (layerSpec.
First(
',')<0) {
183 sToAdd = layerSpec(0,layerSpec.
First(
','));
184 layerSpec = layerSpec(layerSpec.First(
',')+1,layerSpec.Length());
188 nNodes += atoi(sToAdd);
189 layout->push_back(nNodes);
194 layout->push_back(
DataInfo().GetNClasses() );
196 layout->push_back(1);
199 for( std::vector<Int_t>::iterator it = layout->begin(); it != layout->end(); it++ ){
251 for (
Int_t i = 0; i < numLayers; i++) {
281 for (
Int_t i = 0; i < numNeurons; i++) {
343 Int_t numLayers = layout->size();
345 for (
Int_t i = 0; i < numLayers; i++) {
347 BuildLayer(layout->at(i), curLayer, prevLayer, i, numLayers, fromFile);
348 prevLayer = curLayer;
353 for (
Int_t i = 0; i < numLayers; i++) {
356 if (i!=0 && i!=numLayers-1)
fRegulators.push_back(0.);
357 for (
Int_t j = 0; j < numNeurons; j++) {
361 for (
Int_t k = 0; k < numSynapses; k++) {
379 for (
Int_t j = 0; j < numNeurons; j++) {
380 if (fromFile && (layerIndex != numLayers-1) && (j==numNeurons-1)){
385 curLayer->
Add(neuron);
392 if (layerIndex == 0) {
398 if (layerIndex == numLayers-1) {
407 curLayer->
Add(neuron);
413 if (layerIndex != numLayers-1) {
418 curLayer->
Add(neuron);
432 for (
Int_t i = 0; i < numNeurons; i++) {
452 for (
Int_t i = 0; i < numSynapses; i++) {
467 for (
Int_t i = 0; i < numSynapses; i++) {
502 for (
Int_t i = 0; i < numLayers; i++) {
506 for (
Int_t j = 0; j < numNeurons; j++) {
529 Log() <<
kINFO <<
"***Type anything to continue (q to quit): ";
530 std::getline(std::cin, dummy);
531 if (dummy ==
"q" || dummy ==
"Q") {
543 if (!
Debug())
return;
547 Log() <<
kINFO <<
"-------------------------------------------------------------------" <<
Endl;
552 for (
Int_t i = 0; i < numLayers; i++) {
557 Log() <<
kINFO <<
"Layer #" << i <<
" (" << numNeurons <<
" neurons):" <<
Endl;
570 for (
Int_t j = 0; j < numNeurons; j++) {
584 <<
"\t\tValue:\t" << neuron->
GetValue()
587 Log() <<
kINFO <<
"\t\tActivationEquation:\t";
647 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
652 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
690 std::vector<Float_t> temp;
693 for (
UInt_t icls = 0; icls < nClasses; icls++) {
697 for(
UInt_t iClass=0; iClass<nClasses; iClass++){
699 for(
UInt_t j=0;j<nClasses;j++){
701 norm+=
exp(temp[j]-temp[iClass]);
703 (*fMulticlassReturnVal).push_back(1.0/(1.0+norm));
722 for (
Int_t i = 0; i < numLayers; i++) {
728 for (
Int_t j = 0; j < numNeurons; j++) {
733 if(numSynapses==0)
continue;
734 std::stringstream s(
"");
736 for (
Int_t k = 0; k < numSynapses; k++) {
738 s << std::scientific << synapse->
GetWeight() <<
" ";
762 for(
Int_t row = 0; row < nRows; ++row ){
767 std::stringstream s(
"");
769 for(
Int_t col = 0; col < nCols; ++col ){
770 s << std::scientific << (*(elements+index)) <<
" ";
787 std::vector<Int_t>* layout =
new std::vector<Int_t>();
789 void* xmlLayout =
NULL;
792 xmlLayout = wghtnode;
796 layout->resize( nLayers );
804 layout->at(index) = nNeurons;
833 std::stringstream s(content);
834 for (
UInt_t iSyn = 0; iSyn<nSyn; iSyn++) {
851 void* xmlInvHessian =
NULL;
871 if (nElements > std::numeric_limits<int>::max()-100){
872 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;
875 elements =
new Double_t[nElements+10];
888 std::stringstream s(content);
889 for (
Int_t iCol = 0; iCol<nCols; iCol++) {
890 s >> (*(elements+index));
914 std::vector<Double_t>* weights =
new std::vector<Double_t>();
916 while (istr>> dummy >> weight) weights->push_back(weight);
947 meanS, meanB, rmsS, rmsB, xmin, xmax );
951 if (avgVal<meanrms) avgVal = meanrms;
954 for (
Int_t j = 0; j < numSynapses; j++) {
959 importance *= avgVal * avgVal;
970 std::vector<TH1*>* hv )
const 975 for (
Int_t i = 0; i < numLayers-1; i++) {
983 hist =
new TH2F(name +
"", name +
"",
984 numNeurons1, 0, numNeurons1, numNeurons2, 0, numNeurons2);
986 for (
Int_t j = 0; j < numNeurons1; j++) {
991 for (
Int_t k = 0; k < numSynapses; k++) {
994 hist->SetBinContent(j+1, k+1, synapse->
GetWeight());
999 if (hv) hv->push_back( hist );
1021 #if __cplusplus > 199711L 1022 static std::atomic<int> epochMonitoringDirectoryNumber{0};
1024 static int epochMonitoringDirectoryNumber = 0;
1026 int epochVal = epochMonitoringDirectoryNumber++;
1057 fout <<
" double ActivationFnc(double x) const;" << std::endl;
1058 fout <<
" double OutputActivationFnc(double x) const;" << std::endl;
1060 fout <<
" int fLayers;" << std::endl;
1061 fout <<
" int fLayerSize["<<numLayers<<
"];" << std::endl;
1062 int numNodesFrom = -1;
1063 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1065 if (numNodesFrom<0) { numNodesFrom=numNodesTo;
continue; }
1066 fout <<
" double fWeightMatrix" << lIdx-1 <<
"to" << lIdx <<
"[" << numNodesTo <<
"][" << numNodesFrom <<
"];";
1067 fout <<
" // weight matrix from layer " << lIdx-1 <<
" to " << lIdx << std::endl;
1068 numNodesFrom = numNodesTo;
1071 fout <<
" double * fWeights["<<numLayers<<
"];" << std::endl;
1072 fout <<
"};" << std::endl;
1076 fout <<
"inline void " << className <<
"::Initialize()" << std::endl;
1077 fout <<
"{" << std::endl;
1078 fout <<
" // build network structure" << std::endl;
1079 fout <<
" fLayers = " << numLayers <<
";" << std::endl;
1080 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1083 fout <<
" fLayerSize[" << lIdx <<
"] = " << numNodes <<
"; fWeights["<<lIdx<<
"] = new double["<<numNodes<<
"]; " << std::endl;
1086 for (
Int_t i = 0; i < numLayers-1; i++) {
1087 fout <<
" // weight matrix from layer " << i <<
" to " << i+1 << std::endl;
1090 for (
Int_t j = 0; j < numNeurons; j++) {
1093 for (
Int_t k = 0; k < numSynapses; k++) {
1095 fout <<
" fWeightMatrix" << i <<
"to" << i+1 <<
"[" << k <<
"][" << j <<
"] = " << synapse->
GetWeight() <<
";" << std::endl;
1100 fout <<
"}" << std::endl;
1104 fout <<
"inline double " << className <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
1105 fout <<
"{" << std::endl;
1106 fout <<
" if (inputValues.size() != (unsigned int)fLayerSize[0]-1) {" << std::endl;
1107 fout <<
" std::cout << \"Input vector needs to be of size \" << fLayerSize[0]-1 << std::endl;" << std::endl;
1108 fout <<
" return 0;" << std::endl;
1109 fout <<
" }" << std::endl;
1111 fout <<
" for (int l=0; l<fLayers; l++)" << std::endl;
1112 fout <<
" for (int i=0; i<fLayerSize[l]; i++) fWeights[l][i]=0;" << std::endl;
1114 fout <<
" for (int l=0; l<fLayers-1; l++)" << std::endl;
1115 fout <<
" fWeights[l][fLayerSize[l]-1]=1;" << std::endl;
1117 fout <<
" for (int i=0; i<fLayerSize[0]-1; i++)" << std::endl;
1118 fout <<
" fWeights[0][i]=inputValues[i];" << std::endl;
1120 for (
Int_t i = 0; i < numLayers-1; i++) {
1121 fout <<
" // layer " << i <<
" to " << i+1 << std::endl;
1122 if (i+1 == numLayers-1) {
1123 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]; o++) {" << std::endl;
1126 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]-1; o++) {" << std::endl;
1128 fout <<
" for (int i=0; i<fLayerSize[" << i <<
"]; i++) {" << std::endl;
1129 fout <<
" double inputVal = fWeightMatrix" << i <<
"to" << i+1 <<
"[o][i] * fWeights[" << i <<
"][i];" << std::endl;
1132 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal;" << std::endl;
1135 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal*inputVal;" << std::endl;
1138 fout <<
" fWeights[" << i+1 <<
"][o] += fabs(inputVal);" << std::endl;
1140 fout <<
" }" << std::endl;
1141 if (i+1 != numLayers-1)
1142 fout <<
" fWeights[" << i+1 <<
"][o] = ActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1143 else fout <<
" fWeights[" << i+1 <<
"][o] = OutputActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1144 fout <<
" }" << std::endl;
1147 fout <<
" return fWeights[" << numLayers-1 <<
"][0];" << std::endl;
1148 fout <<
"}" << std::endl;
1151 TString fncName = className+
"::ActivationFnc";
1153 fncName = className+
"::OutputActivationFnc";
1156 fout <<
" " << std::endl;
1157 fout <<
"// Clean up" << std::endl;
1158 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
1159 fout <<
"{" << std::endl;
1160 fout <<
" // clean up the arrays" << std::endl;
1161 fout <<
" for (int lIdx = 0; lIdx < "<<numLayers<<
"; lIdx++) {" << std::endl;
1162 fout <<
" delete[] fWeights[lIdx];" << std::endl;
1163 fout <<
" }" << std::endl;
1164 fout <<
"}" << std::endl;
void WaitForKeyboard()
wait for keyboard input, for debugging
Double_t GetDelta() const
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 ...
void AddWeightsXMLTo(void *parent) const
create XML description of ANN classifier
Random number generator class based on M.
MsgLogger & Endl(MsgLogger &ml)
void ForceNetworkCalculations()
calculate input values to each neuron
virtual TString GetExpression()=0
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
virtual Double_t Rndm()
Machine independent random number generator.
MethodANNBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &theData, const TString &theOption)
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.
TActivation * fActivation
void AddPreLinks(TNeuron *neuron, TObjArray *prevLayer)
add synapses connecting a neuron to its preceding layer
Double_t GetValue() const
const char * GetName() const
const Ranking * CreateRanking()
compute ranking of input variables by summing function of weights
void SetPostNeuron(TNeuron *post)
UInt_t GetNClasses() const
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
TNeuronInput * fInputCalculator
Int_t GetNoElements() const
Bool_t IsNormalised() const
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.
void PrintPostLinks() const
Int_t GetEntriesFast() const
virtual void DeclareOptions()
define the options (their key words) that can be set in the option string here the options valid for ...
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...
const TString & GetInputVar(Int_t i) const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static const Bool_t fgDEBUG
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
const char * GetNodeContent(XMLNodePointer_t xmlnode)
get contents (if any) of xml node
void ForceWeights(std::vector< Double_t > *weights)
force the synapse weights
const char * Data() const
std::vector< TH1 * > fEpochMonHistB
UInt_t GetNTargets() const
void PrintLayer(TObjArray *layer) const
print a single layer, for debugging
Bool_t DoMulticlass() const
void PrintMessage(TString message, Bool_t force=kFALSE) const
print messages, turn off printing by setting verbose and debug flag appropriately ...
virtual void ProcessOptions()
do nothing specific at this moment
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 GetActivationValue() const
Int_t NumPostLinks() 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...
virtual void WriteMonitoringHistosToFile() const
write histograms to file
tomato 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 Debug() const
who the hell makes such strange Debug flags that even use "global pointers"..
void PrintActivationEqn()
print activation equation, for debugging
const Event * GetEvent() const
char * Form(const char *fmt,...)
std::vector< TH1 * > fEpochMonHistW
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)
void PrintPreLinks() const
void CreateWeightMonitoringHists(const TString &bulkname, std::vector< TH1 * > *hv=0) const
std::vector< Int_t > fRegulatorIdx
void InitWeights()
initialize the synapse weights randomly
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 ForceNetworkInputs(const Event *ev, Int_t ignoreIndex=-1)
force the input values of the input neurons force the value for each input neuron ...
TDirectory * BaseDir() const
returns the ROOT directory where info/histograms etc of the corresponding MVA method instance are sto...
static RooMathCoreReg dummy
void CalculateValue()
calculate neuron input
std::vector< TString > * GetAllActivationNames() const
DataSetInfo & DataInfo() const
Int_t GetEntries() const
Return the number of objects in array (i.e.
void AddPreDefVal(const T &)
std::vector< TNeuron * > fOutputNeurons
virtual ~MethodANNBase()
destructor
void SetPreNeuron(TNeuron *pre)
virtual void PrintNetwork() const
print network representation, for debugging
void SetWeight(Double_t weight)
set synapse weight
Float_t GetTarget(UInt_t itgt) const
Bool_t DoRegression() const
void CalculateActivationValue()
calculate neuron activation/output
Abstract ClassifierFactory template that handles arbitrary types.
void AddPostLink(TSynapse *post)
add synapse as a post-link to this neuron
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
Double_t GetXmax(Int_t ivar) const
virtual void AddRank(const Rank &rank)
Add a new rank take ownership of it.
UInt_t GetTrainingTMVAVersionCode() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
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
TSynapse * PostLinkAt(Int_t index) const
Int_t NumPreLinks() const
std::vector< TH1 * > fEpochMonHistS
std::vector< Float_t > * fRegressionReturnVal
TObject * At(Int_t idx) const
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
THist< 2, float, THistStatContent, THistStatUncertainty > TH2F
void BuildLayers(std::vector< Int_t > *layout, Bool_t from_file=false)
build the network layers
double norm(double *x, double *p)
virtual void MakeClassSpecific(std::ostream &, const TString &) const
write specific classifier response
void SetInputCalculator(TNeuronInput *calculator)
set input calculator
TH1F * fEstimatorHistTest
Ssiz_t First(char c) const
Find first occurrence of a character c.
void PrintNeuron(TNeuron *neuron) const
print a neuron, for debugging
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
void InitANNBase()
initialize ANNBase object
Double_t GetXmin(Int_t ivar) const
virtual void GetMatrix2Array(Element *data, Option_t *option="") const
Copy matrix data to array .