322                                             const char* extF, 
const char* extD)
 
  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);
 
  476      data->Draw(
Form(
">>fTrainingList_%zu",(
size_t)
this),training,
"goff");
 
  477      data->Draw(
Form(
">>fTestList_%zu",(
size_t)
this),(
const char *)testcut,
"goff");
 
  481      Warning(
"TMultiLayerPerceptron::TMultiLayerPerceptron",
"Data not set. Cannot define datasets");
 
  520                                             const char * training,
 
  523                                             const char* extF, 
const char* extD)
 
  540   if(testcut==
"") testcut = 
Form(
"!(%s)",training);
 
  549      data->Draw(
Form(
">>fTrainingList_%zu",(
size_t)
this),training,
"goff");
 
  550      data->Draw(
Form(
">>fTestList_%zu",(
size_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;
 
  639      fData->
Draw(
Form(
">>fTrainingList_%zu",(
size_t)
this),train,
"goff");
 
  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");
 
 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];
 
 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");
 
 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++) {
 
 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++) {
 
 2517         nNeurons_this = 
input.CountChar(
',')+1;
 
 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++) {
 
 2583         nNeurons = 
input.CountChar(
',')+1;
 
 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++) {
 
 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()) {
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
 
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 filename
 
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 target
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
 
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
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void reg
 
TMatrixT< Double_t > TMatrixD
 
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
 
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 SetMarkerColor(Color_t mcolor=1)
Set the marker color.
 
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
 
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)}
 
void Reset(Option_t *option="") override
Reset.
 
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
 
void Draw(Option_t *option="") override
Draw this histogram with options.
 
2-D histogram with a double per channel (see TH1 documentation)}
 
void Reset(Option_t *option="") override
Reset this histogram: contents, errors, etc.
 
Int_t Fill(Double_t) override
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.
 
void Draw(Option_t *option="") override
Draw this legend with its current attributes.
 
Use the TLine constructor to create a simple line.
 
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
 
void Draw(Option_t *option="") override
Draw this marker with its current attributes.
 
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.
 
void Draw(Option_t *chopt="") override
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.
 
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...
 
~TMultiLayerPerceptron() override
Destructor.
 
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.
 
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.
 
void Draw(Option_t *option="") override
Draws the network structure.
 
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.
 
const char * GetName() const override
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() override
Return next object in array. Returns 0 when no more objects in array.
 
Int_t GetEntriesFast() const
 
TIterator * MakeIterator(Bool_t dir=kIterForward) const override
Returns an array iterator.
 
TObject * At(Int_t idx) const override
 
void AddLast(TObject *obj) override
Add object in the next empty slot in the array.
 
TObject * UncheckedAt(Int_t i) const
 
Int_t GetLast() const override
Return index of last object in array.
 
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.
 
Double_t Rndm() override
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.
 
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 Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
 
virtual Double_t GetWeight() const
 
void Draw(Option_t *opt) override
Default Draw method for all objects.
 
virtual Long64_t GetEntries() const
 
virtual Int_t GetTreeNumber() const
 
TVirtualPad is an abstract base class for the Pad and Canvas classes.
 
virtual void Modified(Bool_t flag=1)=0
 
Double_t Log(Double_t x)
Returns the natural logarithm of x.
 
Double_t Sqrt(Double_t x)
Returns the square root of x.
 
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.