Esempio n. 1
0
void IndexedQueue::init(RanGen& ran, AllReactions& all){

	_pqueue.clear();
	for(unsigned i=0; i < _indices.size() ; ++i){
		QueueElement* elm = _indices[i];
		delete elm;
		_indices[i] = NULL;
	}
        _indices.clear();


	//create empty PQueue using information in all.
	if(!_sentinel){
		_sentinel = new QueueElement();
		_pqueue.setSentinel(_sentinel);  // sentinel is not added to the indexvector
	}
        else if (_pqueue.size()==0){//if init() is called again, sentinel has to be set again!
            _pqueue.setSentinel(_sentinel);
        }
	
	for (unsigned r=0; r < all.size() ; ++r){
		// cout << r << "\t" << all[r]->propensity() << "\t";
		double time_i = std::numeric_limits<double>::infinity();
		if(all[r]->propensity() > 0.0){
			double rval = ran.randouble();
			time_i = all[r]->calcPutativeTime(rval); 
			// cout << "Rval = " << rval << " for reaction " << *(all[r]) << " ";//" produces pututative time = "<<  time_i << endl;
		}
		else all[r]->setPutativeTime(time_i);
		// cout << all[r]->putativeTime()<<"\t" << endl;
		
		QueueElement *elm = new QueueElement(r, time_i);
		_indices.push_back(elm);
		elm->setQueueLoc(_pqueue.size()); //starts at 1!!!
		try {
			_pqueue.push(elm);
		}
		catch (std::exception & e){
                    std::cout <<" HEAP exception: " << e.what() << std::endl;
			exit(0);
		}
	}
        // all.print(std::cout);
}