void nnMike1(int trainMe,double w1,double w2){

  gROOT->Reset();
  gStyle->SetPalette(1);
  gROOT->SetStyle("Plain");
  gStyle->SetOptStat(0);
  char *s = new char[1];

  int nBinsX   = 100;
  double xLow  = 0.0;
  double xHigh = 1.0;
  int nBinsY   = 100;
  double yLow  = 0.0;
  double yHigh = 1.0;

  TH2D *hX2VsX1NodeA = new TH2D("hX2VsX1NodeA","",nBinsX,xLow,xHigh,nBinsY,yLow,yHigh);
  TH2D *hX2VsX1NodeB = new TH2D("hX2VsX1NodeB","",nBinsX,xLow,xHigh,nBinsY,yLow,yHigh);
  TH2D *hX2VsX1NodeC = new TH2D("hX2VsX1NodeC","",nBinsX,xLow,xHigh,nBinsY,yLow,yHigh);

  //auto c1 = new TCanvas("c1","c1");

  //GET RANDOM                                                                                                                                        
  UInt_t mySeed = 3;
  TRandom3 *myRandGen = new TRandom3(mySeed);
  Double_t myRandVal;

  int nToPlot = 100;


  double vecX[100];
  double vecY[100];
  double vecEX[100];
  double vecEY[100];
  int vecType[100];

  //MAKE FAKE DATA OF TYPE 1 and 2
  for (int myInt = 0; myInt < nToPlot; myInt++){
    double myXVal = myRandGen->Uniform(0.0,1.0);
    double myYVal = myRandGen->Uniform(0.0,1.0);
    vecX[myInt] = myXVal;
    vecY[myInt] = myYVal;
    vecEX[myInt] = 0.0;
    vecEY[myInt] = 0.0;
    vecType[myInt] = 2;
    //If training

    if (trainMe ==1){
      if (myYVal > -myXVal + 1.0) {
	vecType[myInt] = 1; 
      }
    }
  }
  if (trainMe == 1){ 
    w1 = 1.0;
    w2 = 0.3;
  }

  double theta = 0.7;
  double alpha = 0.5;
 
  //START TRAINING
  bool runMe = true;

  if (trainMe == 1) {
    while(runMe == true){
      int mismatchedCounter = 0;
      for(int i = 0; i < nToPlot; ++i){

	if (vecType[i] == 2){
	  if(vecY[i] > theta/w2 - vecX[i]*w1/w2){
	    w1 = w1 - alpha*vecX[i];
	    w2 = w2 - alpha*vecY[i];
	    mismatchedCounter++;
	  }
	}

	if (vecType[i] == 1){
	  if(vecY[i] < theta/w2 - vecX[i]*w1/w2){
	    w1 = w1 + alpha*vecX[i];
	    w2 = w2 + alpha*vecY[i];
	    mismatchedCounter++;
	  }
	}

      }
      //cout<<"mismatchedCounter = "<<mismatchedCounter<<endl;
      if(mismatchedCounter == 0){runMe = false;}
    }
    
    cout<<"w1,w2 = "<<w1<<" , "<<w2<<endl;
  }
 //END TRAINING

  //START CLASIFIER
  for(int i = 0; i < nToPlot; ++i){
    if(vecY[i] >= theta/w2 - vecX[i]*w1/w2){
      vecType[i] = 1;
    }
  }
  

  //END CLASIFIER

  ///Visualization
  double vecX1[100];
  double vecY1[100];
  double vecEX1[100];
  double vecEY1[100];

  double vecX2[100];
  double vecY2[100];
  double vecEX2[100];
  double vecEY2[100];

  int nToPlot1 = 0;
  int nToPlot2 = 0;
  int iType1 = 0;
  int iType2 = 0;
  for(int i = 0; i < nToPlot; ++i){
    if (vecType[i] == 1){
      vecX1[iType1] = vecX[i];
      vecY1[iType1] = vecY[i];
      iType1++;
    }else{
      vecX2[iType2] = vecX[i];
      vecY2[iType2] = vecY[i];
      iType2++;
    }
  }

  nToPlot1 = iType1;
  nToPlot2 = iType2;

  TGraphErrors *myGraph = new TGraphErrors(nToPlot,vecX,vecY,vecEX,vecEY);
  TGraphErrors *myGraph1 = new TGraphErrors(nToPlot1,vecX1,vecY1,vecEX1,vecEY1);
  TGraphErrors *myGraph2 = new TGraphErrors(nToPlot2,vecX2,vecY2,vecEX2,vecEY2);


  myGraph->SetMarkerStyle(27);
  myGraph->SetMarkerColor(3);
  myGraph1->SetMarkerStyle(20);
  myGraph1->SetMarkerColor(2);
  myGraph2->SetMarkerStyle(21);
  myGraph2->SetMarkerColor(4);

  myGraph->Draw("ap");
  myGraph1->Draw("psame");
  myGraph2->Draw("psame");

}
