322 const char* extF,
const char* extD)
381 const char * weight,
TTree * data,
385 const char* extF,
const char* extD)
447 const char * training,
450 const char* extF,
const char* extD)
467 if(testcut==
"") testcut =
Form(
"!(%s)",training);
477 data->
Draw(
Form(
">>fTestList_%lu",(
ULong_t)
this),(
const char *)testcut,
"goff");
481 Warning(
"TMultiLayerPerceptron::TMultiLayerPerceptron",
"Data not set. Cannot define datasets");
519 const char * weight,
TTree * data,
520 const char * training,
523 const char* extF,
const char* extD)
540 if(testcut==
"") testcut =
Form(
"!(%s)",training);
550 data->
Draw(
Form(
">>fTestList_%lu",(
ULong_t)
this),(
const char *)testcut,
"goff");
554 Warning(
"TMultiLayerPerceptron::TMultiLayerPerceptron",
"Data not set. Cannot define datasets");
581 std::cerr <<
"Error: data already defined." << std::endl;
642 Warning(
"TMultiLayerPerceptron::TMultiLayerPerceptron",
"Data not set. Cannot define datasets");
661 Warning(
"TMultiLayerPerceptron::TMultiLayerPerceptron",
"Data not set. Cannot define datasets");
778 Bool_t minE_Train =
false;
784 Int_t displayStepping = 1;
788 displayStepping = atoi(out.
Data() + 7);
798 TGraph *train_residual_plot = 0;
799 TGraph *test_residual_plot = 0;
801 Error(
"Train",
"Training/Test samples still not defined. Cannot train the neural network");
804 Info(
"Train",
"Using %d train and %d test entries.",
808 std::cout <<
"Training the Neural Network" << std::endl;
812 canvas =
new TCanvas(
"NNtraining",
"Neural Net training");
815 if(!canvas) canvas =
new TCanvas(
"NNtraining",
"Neural Net training");
817 train_residual_plot =
new TGraph(nEpoch);
818 test_residual_plot =
new TGraph(nEpoch);
822 residual_plot->
Add(train_residual_plot);
823 residual_plot->
Add(test_residual_plot);
824 residual_plot->
Draw(
"LA");
836 for (i = 0; i < els; i++)
839 TMatrixD bfgsh(matrix_size, matrix_size);
845 for (
Int_t iepoch = 0; (iepoch < nEpoch) && (!minE_Train || training_E>minE) && (!minE_Test || test_E>minE) ; iepoch++) {
874 for (i = 0; i < els; i++)
875 onorm += dir[i] * dir[i];
883 prod -= dir[idx++] * neuron->
GetDEDw();
889 prod -= dir[idx++] * synapse->
GetDEDw();
906 for (i = 0; i < els; i++)
907 onorm += dir[i] * dir[i];
933 if (
GetBFGSH(bfgsh, gamma, delta)) {
948 Error(
"TMultiLayerPerceptron::Train()",
"Line search fail");
958 Error(
"TMultiLayerPerceptron::Train()",
"Stop.");
967 if ((verbosity % 2) && ((!(iepoch % displayStepping)) || (iepoch == nEpoch - 1))) {
968 std::cout <<
"Epoch: " << iepoch
969 <<
" learn=" << training_E
970 <<
" test=" << test_E
974 train_residual_plot->
SetPoint(iepoch, iepoch,training_E);
975 test_residual_plot->
SetPoint(iepoch, iepoch,test_E);
979 for (i = 1; i < nEpoch; i++) {
980 train_residual_plot->
SetPoint(i, i, trp);
981 test_residual_plot->
SetPoint(i, i, tep);
984 if ((!(iepoch % displayStepping)) || (iepoch == nEpoch - 1)) {
1000 std::cout <<
"Training done." << std::endl;
1001 if (verbosity / 2) {
1004 "Training sample",
"L");
1006 "Test sample",
"L");
1034 if (nEntries == 0)
return 0.0;
1065 for (i = 0; i < nEvents; i++) {
1070 for (i = 0; i < nEvents; i++) {
1087 return (error / 2.);
1100 if (target < DBL_EPSILON) {
1106 if ((1 - target) < DBL_EPSILON) {
1131 if (target > DBL_EPSILON) {
1163 for (i = 0; i < nEvents; i++) {
1190 for (i = 0; i < nEvents; i++) {
1252 Bool_t normalize =
false;
1256 Int_t maxop, maxpar, maxconst;
1318 for (i = 0; i<nneurons; i++) {
1322 if(
f.GetMultiplicity()==1 &&
f.GetNdata()>1) {
1323 Warning(
"TMultiLayerPerceptron::ExpandStructure()",
"Variable size arrays cannot be used to build implicitly an input layer. The index 0 will be assumed.");
1330 else if(
f.GetNdata()>1) {
1331 for(
Int_t j=0; j<
f.GetNdata(); j++) {
1332 if(i||j) newInput +=
",";
1340 if(i) newInput +=
",";
1346 fStructure = newInput +
":" + hiddenAndOutput;
1363 hidden(hidden.
Last(
':') + 1,
1365 if (input.
Length() == 0) {
1366 Error(
"BuildNetwork()",
"malformed structure. No input layer.");
1369 if (
output.Length() == 0) {
1370 Error(
"BuildNetwork()",
"malformed structure. No output layer.");
1389 for (i = 0; i<nneurons; i++) {
1405 Int_t prevStart = 0;
1411 end = hidden.
Index(
":", beg + 1);
1428 Error(
"BuildOneHiddenLayer",
1429 "The specification '%s' for hidden layer %d must contain only numbers!",
1430 sNumNodes.
Data(), layer - 1);
1433 for (
Int_t i = 0; i < num; i++) {
1434 name.Form(
"HiddenL%d:N%d",layer,i);
1437 for (
Int_t j = prevStart; j < prevStop; j++) {
1446 for (
Int_t i = prevStop; i < nEntries; i++) {
1448 for (
Int_t j = prevStop; j < nEntries; j++)
1453 prevStart = prevStop;
1476 Int_t prevStart = prevStop - prev;
1482 for (i = 0; i<nneurons; i++) {
1489 for (j = prevStart; j < prevStop; j++) {
1498 for (i = prevStop; i < nEntries; i++) {
1500 for (j = prevStop; j < nEntries; j++)
1521 Error(
"DrawResult()",
"no such output.");
1526 new TCanvas(
"NNresult",
"Neural Net output");
1533 setname =
Form(
"train%d",index);
1536 setname =
Form(
"test%d",index);
1538 if ((!
fData) || (!events)) {
1539 Error(
"DrawResult()",
"no dataset.");
1544 TString title =
"Neural Net Output control. ";
1546 setname =
"MLP_" + setname +
"_comp";
1549 hist =
new TH2D(setname.
Data(), title.
Data(), 50, -1, 1, 50, -1, 1);
1552 for (i = 0; i < nEvents; i++) {
1559 TString title =
"Neural Net Output. ";
1561 setname =
"MLP_" + setname;
1564 hist =
new TH1D(setname, title, 50, 1, -1);
1567 for (i = 0; i < nEvents; i++)
1575 hist =
new TH1D(setname, title, 50, 1, -1);
1577 nEvents = events->
GetN();
1578 for (i = 0; i < nEvents; i++)
1594 Error(
"TMultiLayerPerceptron::DumpWeights()",
"Invalid file name");
1602 *
output <<
"#input normalization" << std::endl;
1610 *
output <<
"#output normalization" << std::endl;
1617 *
output <<
"#neurons weights" << std::endl;
1624 *
output <<
"#synapses weights" << std::endl;
1629 ((std::ofstream *)
output)->close();
1644 Error(
"TMultiLayerPerceptron::LoadWeights()",
"Invalid file name");
1647 char *buff =
new char[100];
1648 std::ifstream input(filen.
Data());
1650 input.getline(buff, 100);
1658 input.getline(buff, 100);
1660 input.getline(buff, 100);
1667 input.getline(buff, 100);
1669 input.getline(buff, 100);
1677 input.getline(buff, 100);
1679 input.getline(buff, 100);
1726 Warning(
"TMultiLayerPerceptron::Export",
"Request to export a network using an external function");
1729 TString basefilename = filename;
1733 TString classname = basefilename;
1738 std::ofstream headerfile(header);
1739 std::ofstream sourcefile(source);
1740 headerfile <<
"#ifndef " << basefilename <<
"_h" << std::endl;
1741 headerfile <<
"#define " << basefilename <<
"_h" << std::endl << std::endl;
1742 headerfile <<
"class " << classname <<
" { " << std::endl;
1743 headerfile <<
"public:" << std::endl;
1744 headerfile <<
" " << classname <<
"() {}" << std::endl;
1745 headerfile <<
" ~" << classname <<
"() {}" << std::endl;
1746 sourcefile <<
"#include \"" << header <<
"\"" << std::endl;
1747 sourcefile <<
"#include <cmath>" << std::endl << std::endl;
1748 headerfile <<
" double Value(int index";
1749 sourcefile <<
"double " << classname <<
"::Value(int index";
1751 headerfile <<
",double in" << i;
1752 sourcefile <<
",double in" << i;
1754 headerfile <<
");" << std::endl;
1755 sourcefile <<
") {" << std::endl;
1757 sourcefile <<
" input" << i <<
" = (in" << i <<
" - "
1761 sourcefile <<
" switch(index) {" << std::endl;
1766 sourcefile <<
" case " << idx++ <<
":" << std::endl
1767 <<
" return neuron" << neuron <<
"();" << std::endl;
1768 sourcefile <<
" default:" << std::endl
1769 <<
" return 0.;" << std::endl <<
" }"
1771 sourcefile <<
"}" << std::endl << std::endl;
1772 headerfile <<
" double Value(int index, double* input);" << std::endl;
1773 sourcefile <<
"double " << classname <<
"::Value(int index, double* input) {" << std::endl;
1775 sourcefile <<
" input" << i <<
" = (input[" << i <<
"] - "
1779 sourcefile <<
" switch(index) {" << std::endl;
1784 sourcefile <<
" case " << idx++ <<
":" << std::endl
1785 <<
" return neuron" << neuron <<
"();" << std::endl;
1786 sourcefile <<
" default:" << std::endl
1787 <<
" return 0.;" << std::endl <<
" }"
1789 sourcefile <<
"}" << std::endl << std::endl;
1790 headerfile <<
"private:" << std::endl;
1792 headerfile <<
" double input" << i <<
";" << std::endl;
1797 if (!neuron->
GetPre(0)) {
1798 headerfile <<
" double neuron" << neuron <<
"();" << std::endl;
1799 sourcefile <<
"double " << classname <<
"::neuron" << neuron
1800 <<
"() {" << std::endl;
1801 sourcefile <<
" return input" << idx++ <<
";" << std::endl;
1802 sourcefile <<
"}" << std::endl << std::endl;
1804 headerfile <<
" double input" << neuron <<
"();" << std::endl;
1805 sourcefile <<
"double " << classname <<
"::input" << neuron
1806 <<
"() {" << std::endl;
1807 sourcefile <<
" double input = " << neuron->
GetWeight()
1808 <<
";" << std::endl;
1811 while ((syn = neuron->
GetPre(
n++))) {
1812 sourcefile <<
" input += synapse" << syn <<
"();" << std::endl;
1814 sourcefile <<
" return input;" << std::endl;
1815 sourcefile <<
"}" << std::endl << std::endl;
1817 headerfile <<
" double neuron" << neuron <<
"();" << std::endl;
1818 sourcefile <<
"double " << classname <<
"::neuron" << neuron <<
"() {" << std::endl;
1819 sourcefile <<
" double input = input" << neuron <<
"();" << std::endl;
1823 sourcefile <<
" return ((input < -709. ? 0. : (1/(1+exp(-input)))) * ";
1828 sourcefile <<
" return (input * ";
1833 sourcefile <<
" return (tanh(input) * ";
1838 sourcefile <<
" return (exp(-input*input) * ";
1843 sourcefile <<
" return (exp(input) / (";
1846 sourcefile <<
"exp(input" << side <<
"())";
1848 sourcefile <<
" + exp(input" << side <<
"())";
1849 sourcefile <<
") * ";
1854 sourcefile <<
" return (0.0 * ";
1859 sourcefile <<
"}" << std::endl << std::endl;
1866 headerfile <<
" double synapse" << synapse <<
"();" << std::endl;
1867 sourcefile <<
"double " << classname <<
"::synapse"
1868 << synapse <<
"() {" << std::endl;
1869 sourcefile <<
" return (neuron" << synapse->
GetPre()
1870 <<
"()*" << synapse->
GetWeight() <<
");" << std::endl;
1871 sourcefile <<
"}" << std::endl << std::endl;
1874 headerfile <<
"};" << std::endl << std::endl;
1875 headerfile <<
"#endif // " << basefilename <<
"_h" << std::endl << std::endl;
1878 std::cout << header <<
" and " << source <<
" created." << std::endl;
1880 else if(lg ==
"FORTRAN") {
1881 TString implicit =
" implicit double precision (a-h,n-z)\n";
1882 std::ofstream sigmoid(
"sigmoid.f");
1883 sigmoid <<
" double precision FUNCTION SIGMOID(X)" << std::endl
1885 <<
" IF(X.GT.37.) THEN" << std::endl
1886 <<
" SIGMOID = 1." << std::endl
1887 <<
" ELSE IF(X.LT.-709.) THEN" << std::endl
1888 <<
" SIGMOID = 0." << std::endl
1889 <<
" ELSE" << std::endl
1890 <<
" SIGMOID = 1./(1.+EXP(-X))" << std::endl
1891 <<
" ENDIF" << std::endl
1892 <<
" END" << std::endl;
1896 std::ofstream sourcefile(source);
1899 sourcefile <<
" double precision function " << filename
1900 <<
"(x, index)" << std::endl;
1901 sourcefile << implicit;
1902 sourcefile <<
" double precision x(" <<
1906 sourcefile <<
"C --- Last Layer" << std::endl;
1910 TString ifelseif =
" if (index.eq.";
1912 sourcefile << ifelseif.
Data() << idx++ <<
") then" << std::endl
1914 <<
"=neuron" << neuron <<
"(x);" << std::endl;
1915 ifelseif =
" else if (index.eq.";
1917 sourcefile <<
" else" << std::endl
1918 <<
" " << filename <<
"=0.d0" << std::endl
1919 <<
" endif" << std::endl;
1920 sourcefile <<
" end" << std::endl;
1923 sourcefile <<
"C --- First and Hidden layers" << std::endl;
1928 sourcefile <<
" double precision function neuron"
1929 << neuron <<
"(x)" << std::endl
1931 sourcefile <<
" double precision x("
1933 if (!neuron->
GetPre(0)) {
1934 sourcefile <<
" neuron" << neuron
1935 <<
" = (x(" << idx+1 <<
") - "
1939 <<
"d0" << std::endl;
1942 sourcefile <<
" neuron" << neuron
1943 <<
" = " << neuron->
GetWeight() <<
"d0" << std::endl;
1946 while ((syn = neuron->
GetPre(
n++)))
1947 sourcefile <<
" neuron" << neuron
1948 <<
" = neuron" << neuron
1949 <<
" + synapse" << syn <<
"(x)" << std::endl;
1953 sourcefile <<
" neuron" << neuron
1954 <<
"= (sigmoid(neuron" << neuron <<
")*";
1963 sourcefile <<
" neuron" << neuron
1964 <<
"= (tanh(neuron" << neuron <<
")*";
1969 sourcefile <<
" neuron" << neuron
1970 <<
"= (exp(-neuron" << neuron <<
"*neuron"
1978 sourcefile <<
" div = exp(neuron" << side <<
"())" << std::endl;
1980 sourcefile <<
" div = div + exp(neuron" << side <<
"())" << std::endl;
1981 sourcefile <<
" neuron" << neuron ;
1982 sourcefile <<
"= (exp(neuron" << neuron <<
") / div * ";
1987 sourcefile <<
" neuron " << neuron <<
"= 0.";
1993 sourcefile <<
" end" << std::endl;
1998 sourcefile <<
"C --- Synapses" << std::endl;
2002 sourcefile <<
" double precision function " <<
"synapse"
2003 << synapse <<
"(x)\n" << implicit;
2004 sourcefile <<
" double precision x("
2006 sourcefile <<
" synapse" << synapse
2007 <<
"=neuron" << synapse->
GetPre()
2008 <<
"(x)*" << synapse->
GetWeight() <<
"d0" << std::endl;
2009 sourcefile <<
" end" << std::endl << std::endl;
2013 std::cout << source <<
" created." << std::endl;
2015 else if(lg ==
"PYTHON") {
2019 std::ofstream pythonfile(pyfile);
2020 pythonfile <<
"from math import exp" << std::endl << std::endl;
2021 pythonfile <<
"from math import tanh" << std::endl << std::endl;
2022 pythonfile <<
"class " << classname <<
":" << std::endl;
2023 pythonfile <<
"\tdef value(self,index";
2025 pythonfile <<
",in" << i;
2027 pythonfile <<
"):" << std::endl;
2029 pythonfile <<
"\t\tself.input" << i <<
" = (in" << i <<
" - "
2036 pythonfile <<
"\t\tif index==" << idx++
2037 <<
": return self.neuron" << neuron <<
"();" << std::endl;
2038 pythonfile <<
"\t\treturn 0." << std::endl;
2043 pythonfile <<
"\tdef neuron" << neuron <<
"(self):" << std::endl;
2045 pythonfile <<
"\t\treturn self.input" << idx++ << std::endl;
2047 pythonfile <<
"\t\tinput = " << neuron->
GetWeight() << std::endl;
2050 while ((syn = neuron->
GetPre(
n++)))
2051 pythonfile <<
"\t\tinput = input + self.synapse"
2052 << syn <<
"()" << std::endl;
2056 pythonfile <<
"\t\tif input<-709. : return " << neuron->
GetNormalisation()[1] << std::endl;
2057 pythonfile <<
"\t\treturn ((1/(1+exp(-input)))*";
2062 pythonfile <<
"\t\treturn (input*";
2067 pythonfile <<
"\t\treturn (tanh(input)*";
2072 pythonfile <<
"\t\treturn (exp(-input*input)*";
2077 pythonfile <<
"\t\treturn (exp(input) / (";
2080 pythonfile <<
"exp(self.neuron" << side <<
"())";
2082 pythonfile <<
" + exp(self.neuron" << side <<
"())";
2083 pythonfile <<
") * ";
2088 pythonfile <<
"\t\treturn 0.";
2099 pythonfile <<
"\tdef synapse" << synapse <<
"(self):" << std::endl;
2100 pythonfile <<
"\t\treturn (self.neuron" << synapse->
GetPre()
2101 <<
"()*" << synapse->
GetWeight() <<
")" << std::endl;
2105 std::cout << pyfile <<
" created." << std::endl;
2127 for (
Int_t i = 0; i <
n; i++) {
2130 index[j] = index[i];
2145 for (i = 0; i < nEvents; i++)
2151 for (i = 0; i < nEvents; i++) {
2220 neuron->
SetWeight(origin[idx] + (dir[idx] * dist));
2226 synapse->
SetWeight(origin[idx] + (dir[idx] * dist));
2242 dir[idx++] = -neuron->
GetDEDw();
2246 dir[idx++] = -synapse->
GetDEDw();
2285 MLP_Line(origin, direction, alpha2);
2291 for (icount = 0; icount < 100; icount++) {
2293 MLP_Line(origin, direction, alpha3);
2310 for (icount = 0; icount < 100; icount++) {
2312 MLP_Line(origin, direction, alpha2);
2330 (err3 - err1) / ((err3 - err2) / (alpha3 - alpha2)
2331 - (err2 - err1) / (alpha2 - alpha1)));
2340 buffer[idx] = neuron->
GetWeight() - origin[idx];
2346 buffer[idx] = synapse->
GetWeight() - origin[idx];
2370 dir[idx] = -neuron->
GetDEDw() + beta * dir[idx];
2376 dir[idx] = -synapse->
GetDEDw() + beta * dir[idx];
2424 gamma[idx++][0] = -neuron->
GetDEDw();
2429 gamma[idx++][0] = -synapse->
GetDEDw();
2431 for (
Int_t i = 0; i < els; i++)
2432 delta[i].Assign(buffer[i]);
2439 gamma[idx++][0] += neuron->
GetDEDw();
2444 gamma[idx++][0] += synapse->
GetDEDw();
2487 dedw[idx++][0] = neuron->
GetDEDw();
2492 dedw[idx++][0] = synapse->
GetDEDw();
2495 for (
Int_t i = 0; i < els; i++)
2496 dir[i] = -direction[i][0];
2508#define NeuronSize 2.5
2511 Float_t xStep = 1./(nLayers+1.);
2513 for(layer=0; layer< nLayers-1; layer++) {
2525 Int_t num = atoi(
TString(hidden(beg, end - beg)).Data());
2528 end = hidden.
Index(
":", beg + 1);
2529 if(layer==cnt) nNeurons_this = num;
2533 if(layer==cnt) nNeurons_this = num;
2536 if(layer==nLayers-2) {
2538 nNeurons_next =
output.CountChar(
',')+1;
2546 Int_t num = atoi(
TString(hidden(beg, end - beg)).Data());
2549 end = hidden.
Index(
":", beg + 1);
2550 if(layer+1==cnt) nNeurons_next = num;
2554 if(layer+1==cnt) nNeurons_next = num;
2556 Float_t yStep_this = 1./(nNeurons_this+1.);
2557 Float_t yStep_next = 1./(nNeurons_next+1.);
2562 maxWeight = maxWeight < theSynapse->
GetWeight() ? theSynapse->
GetWeight() : maxWeight;
2565 for(
Int_t neuron1=0; neuron1<nNeurons_this; neuron1++) {
2566 for(
Int_t neuron2=0; neuron2<nNeurons_next; neuron2++) {
2567 TLine* synapse =
new TLine(xStep*(layer+1),yStep_this*(neuron1+1),xStep*(layer+2),yStep_next*(neuron2+1));
2570 if (!theSynapse)
continue;
2579 for(layer=0; layer< nLayers; layer++) {
2585 else if(layer==nLayers-1) {
2587 nNeurons =
output.CountChar(
',')+1;
2595 Int_t num = atoi(
TString(hidden(beg, end - beg)).Data());
2598 end = hidden.
Index(
":", beg + 1);
2599 if(layer==cnt) nNeurons = num;
2603 if(layer==cnt) nNeurons = num;
2605 Float_t yStep = 1./(nNeurons+1.);
2606 for(
Int_t neuron=0; neuron<nNeurons; neuron++) {
2608 m->SetMarkerColor(4);
2616 Float_t yStep = 1./(nrItems+1);
2617 for (
Int_t item = 0; item < nrItems; item++) {
2619 TText* label =
new TText(0.5*xStep,yStep*(item+1),brName.
Data());
2625 yStep=1./(numOutNodes+1);
2626 for (
Int_t outnode=0; outnode<numOutNodes; outnode++) {
2628 if (neuron && neuron->
GetName()) {
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetLeftMargin(Float_t leftmargin)
Set Pad left margin in fraction of the pad width.
void SetDecimals(Bool_t dot=kTRUE)
Sets the decimals flag By default, blank characters are stripped, and then the label is correctly ali...
virtual void UnZoom()
Reset first & last bin to the full range.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
A TEventList object is a list of selected events (entries) in a TTree.
virtual Long64_t GetEntry(Int_t index) const
Return value of entry at index in the list.
virtual Int_t GetN() const
A TGraph is an object made of two arrays X and Y with npoints each.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
1-D histogram with a double per channel (see TH1 documentation)}
virtual void Reset(Option_t *option="")
Reset.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual void Draw(Option_t *option="")
Draw this histogram with options.
2-D histogram with a double per channel (see TH1 documentation)}
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Int_t Fill(Double_t)
Invalid Fill method.
This class displays a legend box (TPaveText) containing several legend entries.
TLegendEntry * AddEntry(const TObject *obj, const char *label="", Option_t *option="lpf")
Add a new entry to this legend.
virtual void Draw(Option_t *option="")
Draw this legend with its current attributes.
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
virtual TMatrixTBase< Element > & UnitMatrix()
Make a unit matrix (matrix need not be a square one).
A TMultiGraph is a collection of TGraph (or derived) objects.
TList * GetListOfGraphs() const
virtual void Add(TGraph *graph, Option_t *chopt="")
Add a new graph to the list of graphs.
virtual void Draw(Option_t *chopt="")
Draw this multigraph with its current attributes.
TAxis * GetYaxis()
Get y axis of the graph.
TAxis * GetXaxis()
Get x axis of the graph.
This class describes a neural network.
TTreeFormula * fEventWeight
! formula representing the event weight
void BuildOneHiddenLayer(const TString &sNumNodes, Int_t &layer, Int_t &prevStart, Int_t &prevStop, Bool_t lastLayer)
Builds a hidden layer, updates the number of layers.
void SteepestDir(Double_t *)
Sets the search direction to steepest descent.
void BuildNetwork()
Instantiates the network from the description.
TObjArray fNetwork
Collection of all the neurons in the network.
Double_t Evaluate(Int_t index, Double_t *params) const
Returns the Neural Net for a given set of input parameters #parameters must equal #input neurons.
TEventList * fTest
! EventList defining the events in the test dataset
bool GetBFGSH(TMatrixD &, TMatrixD &, TMatrixD &)
Computes the hessian matrix using the BFGS update algorithm.
void BuildHiddenLayers(TString &)
Builds hidden layers.
void BuildFirstLayer(TString &)
Instantiates the neurons in input Inputs are normalised and the type is set to kOff (simple forward o...
void SetTau(Double_t tau)
Sets Tau - used in line search (look at the constructor for the complete description of learning meth...
TMultiLayerPerceptron()
Default constructor.
Double_t GetSumSquareError() const
Error on the output for a given event.
void ConjugateGradientsDir(Double_t *, Double_t)
Sets the search direction to conjugate gradient direction beta should be:
Double_t fTau
! Tau - used in line search - Default=3.
TTree * fData
! pointer to the tree used as datasource
Double_t Result(Int_t event, Int_t index=0) const
Computes the output for a given event.
void SetGammaDelta(TMatrixD &, TMatrixD &, Double_t *)
Sets the gamma and delta vectors Gamma is computed here, so ComputeDEDw cannot have been called bef...
TEventList * fTraining
! EventList defining the events in the training dataset
TString fStructure
String containing the network structure.
Int_t fReset
! number of epochs between two resets of the search direction to the steepest descent - Default=50
Bool_t LoadWeights(Option_t *filename="")
Loads the weights from a text file conforming to the format defined by DumpWeights.
void MLP_Batch(Double_t *)
One step for the batch (stochastic) method.
TNeuron::ENeuronType fOutType
Type of output neurons.
Double_t fCurrentTreeWeight
! weight of the current tree in a chain
ELearningMethod fLearningMethod
! The Learning Method
Double_t fLastAlpha
! internal parameter used in line search
Int_t fCurrentTree
! index of the current tree in a chain
void Export(Option_t *filename="NNfunction", Option_t *language="C++") const
Exports the NN as a function for any non-ROOT-dependant code Supported languages are: only C++ ,...
Double_t fEpsilon
! Epsilon - used in stochastic minimisation - Default=0.
void Train(Int_t nEpoch, Option_t *option="text", Double_t minE=0)
Train the network.
TNeuron::ENeuronType GetType() const
void BFGSDir(TMatrixD &, Double_t *)
Computes the direction for the BFGS algorithm as the product between the Hessian estimate (bfgsh) and...
void SetTestDataSet(TEventList *test)
Sets the Test dataset.
Bool_t fTrainingOwner
! internal flag whether one has to delete fTraining or not
void SetLearningMethod(TMultiLayerPerceptron::ELearningMethod method)
Sets the learning method.
void SetTrainingDataSet(TEventList *train)
Sets the Training dataset.
void BuildLastLayer(TString &, Int_t)
Builds the output layer Neurons are linear combinations of input, by default.
Double_t fDelta
! Delta - used in stochastic minimisation - Default=0.
TTreeFormulaManager * fManager
! TTreeFormulaManager for the weight and neurons
void Randomize() const
Randomize the weights.
Bool_t LineSearch(Double_t *, Double_t *)
Search along the line defined by direction.
virtual void Draw(Option_t *option="")
Draws the network structure.
void ExpandStructure()
Expand the structure of the first layer.
Double_t fEta
! Eta - used in stochastic minimisation - Default=0.1
Double_t GetError(Int_t event) const
Error on the output for a given event.
Double_t fEtaDecay
! EtaDecay - Eta *= EtaDecay at each epoch - Default=1.
void SetEtaDecay(Double_t ed)
Sets EtaDecay - Eta *= EtaDecay at each epoch (look at the constructor for the complete description o...
void AttachData()
Connects the TTree to Neurons in input and output layers.
void SetData(TTree *)
Set the data source.
void SetEventWeight(const char *)
Set the event weight.
Bool_t DumpWeights(Option_t *filename="-") const
Dumps the weights to a text file.
TString fWeight
String containing the event weight.
void SetDelta(Double_t delta)
Sets Delta - used in stochastic minimisation (look at the constructor for the complete description of...
Double_t GetCrossEntropy() const
Cross entropy error for a softmax output neuron, for a given event.
void SetReset(Int_t reset)
Sets number of epochs between two resets of the search direction to the steepest descent.
Bool_t fTestOwner
! internal flag whether one has to delete fTest or not
void Shuffle(Int_t *, Int_t) const
Shuffle the Int_t index[n] in input.
virtual ~TMultiLayerPerceptron()
Destructor.
Double_t DerivDir(Double_t *)
scalar product between gradient and direction = derivative along direction
void MLP_Stochastic(Double_t *)
One step for the stochastic method buffer should contain the previous dw vector and will be updated.
TObjArray fSynapses
Collection of all the synapses in the network.
void MLP_Line(Double_t *, Double_t *, Double_t)
Sets the weights to a point along a line Weights are set to [origin + (dist * dir)].
TNeuron::ENeuronType fType
Type of hidden neurons.
TObjArray fLastLayer
Collection of the output neurons; subset of fNetwork.
TString fextD
String containing the derivative name.
void ComputeDEDw() const
Compute the DEDw = sum on all training events of dedw for each weight normalized by the number of eve...
Double_t GetCrossEntropyBinary() const
Cross entropy error for sigmoid output neurons, for a given event.
void DrawResult(Int_t index=0, Option_t *option="test") const
Draws the neural net output It produces an histogram with the output for the two datasets.
void SetEta(Double_t eta)
Sets Eta - used in stochastic minimisation (look at the constructor for the complete description of l...
TObjArray fFirstLayer
Collection of the input neurons; subset of fNetwork.
void GetEntry(Int_t) const
Load an entry into the network.
void SetEpsilon(Double_t eps)
Sets Epsilon - used in stochastic minimisation (look at the constructor for the complete description ...
TString fextF
String containing the function name.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
virtual const char * GetName() const
Returns name of object.
This class describes an elementary neuron, which is the basic element for a Neural Network.
Double_t GetWeight() const
void SetWeight(Double_t w)
Sets the neuron weight to w.
Double_t GetValue() const
Computes the output using the appropriate function and all the weighted inputs, or uses the branch as...
void SetDEDw(Double_t in)
Sets the derivative of the total error wrt the neuron weight.
Double_t GetDeDw() const
Computes the derivative of the error wrt the neuron weight.
Double_t GetBranch() const
Returns the formula value.
TNeuron * GetInLayer(Int_t n) const
Double_t GetError() const
Computes the error for output neurons.
TTreeFormula * UseBranch(TTree *, const char *)
Sets a formula that can be used to make the neuron an input.
TSynapse * GetPre(Int_t n) const
void ForceExternalValue(Double_t value)
Uses the branch type to force an external value.
Double_t GetTarget() const
Computes the normalized target pattern for output neurons.
const Double_t * GetNormalisation() const
ENeuronType GetType() const
Returns the neuron type.
void SetNewEvent() const
Inform the neuron that inputs of the network have changed, so that the buffered values have to be rec...
void SetNormalisation(Double_t mean, Double_t RMS)
Sets the normalization variables.
void AddInLayer(TNeuron *)
Tells a neuron which neurons form its layer (including itself).
Iterator of object array.
TObject * Next()
Return next object in array. Returns 0 when no more objects in array.
Int_t GetEntriesFast() const
virtual void AddLast(TObject *obj)
Add object in the next empty slot in the array.
TObject * UncheckedAt(Int_t i) const
TIterator * MakeIterator(Bool_t dir=kIterForward) const
Returns an array iterator.
Int_t GetLast() const
Return index of last object in array.
TObject * At(Int_t idx) const
Collectable string class.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Random number generator class based on M.
virtual Double_t Rndm()
Machine independent random number generator.
Regular expression class.
void ToLower()
Change string to lower-case.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
Bool_t IsAlpha() const
Returns true if all characters in string are alphabetic.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
void ToUpper()
Change string to upper case.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Bool_t IsAlnum() const
Returns true if all characters in string are alphanumeric.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
This is a simple weighted bidirectional connection between two neurons.
Double_t GetDeDw() const
Computes the derivative of the error wrt the synapse weight.
void SetWeight(Double_t w)
Sets the weight of the synapse.
Double_t GetWeight() const
void SetDEDw(Double_t in)
Sets the derivative of the total error wrt the synapse weight.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
Base class for several text objects.
The TTimeStamp encapsulates seconds and ns since EPOCH.
A TTree represents a columnar dataset.
virtual Double_t GetWeight() const
virtual Long64_t GetEntries() const
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
virtual Int_t GetTreeNumber() const
virtual void Draw(Option_t *opt)
Default Draw method for all objects.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual void Modified(Bool_t flag=1)=0
Double_t Sqrt(Double_t x)
static void output(int code)