MonteCarloRun::MonteCarloRun(
        const MinMax<double> & modIndex,
        const MinMax<double> & fmModIndex,
        const MinMax<double> & freq,
        const MinMax<double> & digiFreq,
        const MinMax<double> & fc,
        const double & rate,
        const double & gain,
        const double & timePerSchemeSec,
        const size_t & frameSize,
        const size_t & N) :
    _modType(AMC::ModType::AM_DSB_FC),
    _dataStream(new UhdMock(new StreamFunction(), rate, gain, frameSize)),
    _buffer(_dataStream->getBuffer()),
    _featureExtractor(new AMC::FeatureExtractor(_buffer, N, rate)),
    _rate(rate),
    _timePerScheme(timePerSchemeSec * 1e9),
    _frameSize(frameSize),
    _N(N),
    _modIndex(rng_gen_type(std::time(0) + 100), boost::uniform_real<>(modIndex.getMin(), modIndex.getMax())),
    _fmModIndex(rng_gen_type(std::time(0) + 125), boost::uniform_real<>(fmModIndex.getMin(), fmModIndex.getMax())),
    _freq(rng_gen_type(std::time(0) + 259), boost::uniform_real<>(freq.getMin(), freq.getMax())),
    _digiFreq(rng_gen_type(std::time(0) - 9), boost::uniform_real<>(digiFreq.getMin(), digiFreq.getMax())),
    _fc(rng_gen_type(std::time(0) - 214), boost::uniform_real<>(fc.getMin(), fc.getMax())),
    _constSize(rng_gen_type(std::time(0) + 169), boost::uniform_int<>(2, 8)),
    _timer(),
    _thread(),
    _isRunning(false)
{

}
MonteCarloRun::MonteCarloRun(
        const MinMax<double> & modIndex,
        const MinMax<double> & fmModIndex,
        const MinMax<double> & freq,
        const MinMax<double> & digiFreq,
        const MinMax<double> & snr,
        const double & fc,
        const double & rate,
        const double & gain,
        const double & timePerSchemeSec,
        const size_t & frameSize,
        const size_t & N) :
    _modType(new SharedType<AMC::ModType>(AMC::ModType::AM_DSB_FC)),
    _dataStream(new UhdMock(new StreamFunction(), rate, gain, frameSize)),
    _buffer(_dataStream->getBuffer()),
    _featureExtractor(new AMC::FeatureExtractor(_buffer, new AmcCvDecisionTree(), rate, _dataStream->getFc(), _dataStream->getWindow(), N)),
    _rate(rate),
    _timePerScheme(timePerSchemeSec * 1e9),
    _frameSize(frameSize),
    _N(N),
    _fc(_dataStream->getFc()),
    _firWindow(_dataStream->getWindow()),
    _modIndex(rng_gen_type(std::time(0) + 100), boost::uniform_real<>(modIndex.getMin(), modIndex.getMax())),
    _fmModIndex(rng_gen_type(std::time(0) + 125), boost::uniform_real<>(fmModIndex.getMin(), fmModIndex.getMax())),
    _freq(rng_gen_type(std::time(0) + 259), boost::uniform_real<>(freq.getMin(), freq.getMax())),
    _digiFreq(rng_gen_type(std::time(0) - 9), boost::uniform_real<>(digiFreq.getMin(), digiFreq.getMax())),
    _snr(rng_gen_type(std::time(0) - 206), boost::uniform_real<>(snr.getMin(), snr.getMax())),
    _constSize(rng_gen_type(std::time(0) + 169), boost::uniform_int<>(2, 8)),
    _timer(),
    _thread(),
    _isRunning(false)
{
    boost::unique_lock<boost::shared_mutex> fcLock(*_fc->getMutex());
    _fc->getData() = fc;
    fcLock.unlock();

    double maxWin = std::max(freq.getMax() / rate, digiFreq.getMax());
    maxWin = std::max(maxWin, fmModIndex.getMax());

    boost::unique_lock<boost::shared_mutex> firLock(*_firWindow->getMutex());
    _firWindow->getData() = maxWin * 2.1;
    firLock.unlock();
}