// @(#)root/roostats:$Id$
// Authors: Giovanni Petrucciani 4/21/2011
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


#include "RooStats/SequentialProposal.h"
#include <RooArgSet.h>
#include <iostream>
#include <memory>
#include <TIterator.h>
#include <RooRandom.h>
#include <RooStats/RooStatsUtils.h>

using namespace std;

ClassImp(RooStats::SequentialProposal)

namespace RooStats { 

SequentialProposal::SequentialProposal(double divisor) : 
    ProposalFunction(),
    fDivisor(1./divisor)
{
}
     

// Populate xPrime with a new proposed point
void SequentialProposal::Propose(RooArgSet& xPrime, RooArgSet& x )
{
   RooStats::SetParameters(&x, &xPrime);
   RooLinkedListIter it(xPrime.iterator());
   RooRealVar* var;
   int n = xPrime.getSize();
   int j = int( floor(RooRandom::uniform()*n) );
   for (int i = 0; (var = (RooRealVar*)it.Next()) != NULL; ++i) {
      if (i == j) {
        double val = var->getVal(), max = var->getMax(), min = var->getMin(), len = max - min;
        val += RooRandom::gaussian() * len * fDivisor;
        while (val > max) val -= len;
        while (val < min) val += len;
        var->setVal(val);
        //std::cout << "Proposing a step along " << var->GetName() << std::endl;
      }
   }
}

Bool_t SequentialProposal::IsSymmetric(RooArgSet& , RooArgSet& ) {
   return true;
}

// Return the probability of proposing the point x1 given the starting
// point x2
Double_t SequentialProposal::GetProposalDensity(RooArgSet& ,
                                                RooArgSet& )
{
   return 1.0; // should not be needed
}

}

 SequentialProposal.cxx:1
 SequentialProposal.cxx:2
 SequentialProposal.cxx:3
 SequentialProposal.cxx:4
 SequentialProposal.cxx:5
 SequentialProposal.cxx:6
 SequentialProposal.cxx:7
 SequentialProposal.cxx:8
 SequentialProposal.cxx:9
 SequentialProposal.cxx:10
 SequentialProposal.cxx:11
 SequentialProposal.cxx:12
 SequentialProposal.cxx:13
 SequentialProposal.cxx:14
 SequentialProposal.cxx:15
 SequentialProposal.cxx:16
 SequentialProposal.cxx:17
 SequentialProposal.cxx:18
 SequentialProposal.cxx:19
 SequentialProposal.cxx:20
 SequentialProposal.cxx:21
 SequentialProposal.cxx:22
 SequentialProposal.cxx:23
 SequentialProposal.cxx:24
 SequentialProposal.cxx:25
 SequentialProposal.cxx:26
 SequentialProposal.cxx:27
 SequentialProposal.cxx:28
 SequentialProposal.cxx:29
 SequentialProposal.cxx:30
 SequentialProposal.cxx:31
 SequentialProposal.cxx:32
 SequentialProposal.cxx:33
 SequentialProposal.cxx:34
 SequentialProposal.cxx:35
 SequentialProposal.cxx:36
 SequentialProposal.cxx:37
 SequentialProposal.cxx:38
 SequentialProposal.cxx:39
 SequentialProposal.cxx:40
 SequentialProposal.cxx:41
 SequentialProposal.cxx:42
 SequentialProposal.cxx:43
 SequentialProposal.cxx:44
 SequentialProposal.cxx:45
 SequentialProposal.cxx:46
 SequentialProposal.cxx:47
 SequentialProposal.cxx:48
 SequentialProposal.cxx:49
 SequentialProposal.cxx:50
 SequentialProposal.cxx:51
 SequentialProposal.cxx:52
 SequentialProposal.cxx:53
 SequentialProposal.cxx:54
 SequentialProposal.cxx:55
 SequentialProposal.cxx:56
 SequentialProposal.cxx:57
 SequentialProposal.cxx:58
 SequentialProposal.cxx:59
 SequentialProposal.cxx:60
 SequentialProposal.cxx:61
 SequentialProposal.cxx:62
 SequentialProposal.cxx:63
 SequentialProposal.cxx:64
 SequentialProposal.cxx:65
 SequentialProposal.cxx:66