Exemple #1
0
void RandomTest::randomListTest()
{
    float minF = 10.f, maxF = 20.f;
    std::vector<float> randF(10);
    ::fwTools::random::fillContainer(minF, maxF, randF);
    for(size_t i = 0; i < randF.size(); ++i)
    {
        CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randF[i] >= minF && randF[i] <= maxF);
    }

    int minI = 10, maxI = 20;
    std::vector<int> randI(10);
    ::fwTools::random::fillContainer(minI, maxI, randI);
    for(size_t i = 0; i < randF.size(); ++i)
    {
        CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randI[i] >= minI && randI[i] <= maxI);
    }
}
int pickParent(int prevChosen, int nInDeme )
{
    int i, j, n, count, dadi, momi, *ipt;
    int aliveOnes[nInDeme], nAlive=0;
    //double fitnessArray[TOTAL_N];
    short int *offspringGenotyes, *sipt;
    int *offspringDemeLocations;
    offspringGenotyes = (short int *) malloc( (sizeof(short int) * 2 * totalSitesInGenome * TOTAL_N) );
    offspringDemeLocations = (int *) malloc( (sizeof(int) * TOTAL_N) );

//	momi = *(ipt + momi); // extract the right index from the overall index array; "momi" and "dadi" are "local" indexes in the consecutive fitness array
//        dadi = *(ipt + dadi);

	sipt = offspringGenotyes;

    int luckyOne;
    if ( MODEL_TYPE == MODEL_TYPE_NEUTRAL_ONLY ) {
        do {
            luckyOne = randI() % nInDeme;
        } while ( luckyOne == prevChosen );
    }
    else if ( MODEL_TYPE == MODEL_TYPE_SELECTION ) {
        //fprintf(stderr, "\nError in pickParent()! Procedures not in place for MODEL_TYPE_SELECTION\n");
        //exit(-1);

	int s_total=0;
	int s_sum;
	int individual=0;
	int i=0, j=0;
	double viabilityArray[nInDeme];
for (i; i<nSITES_PER_WINDOW; i++){
	s_sum += selectionCoefficients[i];
}

for(individual = 0; individual < nInDeme; individual++){
	s_total=0, i=0;
	for (j; j<nSITES_PER_WINDOW; j++)
		{
			for (i=0;i<2;i++){
				if (*sipt = 1){
					s_total += selectionCoefficients[j];
				}
				sipt++;
			}
		} //builds individual selection total for comparison to overall total
viabilityArray[individual]=s_total; 

}
cutoff = Cutoff(viabilityArray);
i=0;
int deadTracker;

for (i; i<nInDeme; i++){
	if (viabilityArray[i]>cutoff){
		//aliveTracker[deadTracker] = i;
		deadTracker++;
	} //Scans through to find values less than cutoff; make 0 or 1 in living ones array instead?
}



luckyOne = randI() % deadTracker; //not nInDeme! Choose from array of live/dead
//aliveTracker currently has nInDeme elements; is the current modulus operation OK??
}

    return aliveOnes[luckyOne];
}
void CSE_ALifeAnomalousZone::spawn_artefacts				()
{
	VERIFY2					(!m_bOnline,"Cannot spawn artefacts in online!");

	float					m_min_start_power	= pSettings->r_float(name(),"min_start_power");
	float					m_max_start_power	= pSettings->r_float(name(),"max_start_power");
	u32						m_min_artefact_count= pSettings->r_u32	(name(),"min_artefact_count");;
	u32						m_max_artefact_count= pSettings->r_u32	(name(),"max_artefact_count");;
    u32						m_artefact_count;

	if (m_min_artefact_count == m_max_artefact_count)
		m_artefact_count	= m_min_artefact_count;
	else
		m_artefact_count	= randI(m_min_artefact_count,m_max_artefact_count);

	if (m_min_start_power == m_max_start_power)
		m_maxPower			= m_min_start_power;
	else
		m_maxPower			= randF(m_min_start_power,m_max_start_power);

	LPCSTR					artefacts = pSettings->r_string(name(),"artefacts");
	u32						n = _GetItemCount(artefacts);
	VERIFY2					(!(n % 2),"Invalid parameters count in line artefacts for anomalous zone");
	n						>>= 1;
	
	typedef std::pair<shared_str,float>	ARTEFACT_PAIR;

	string256				temp0, temp1;
	ARTEFACT_PAIR			*m_weights = (ARTEFACT_PAIR*)_alloca(n*sizeof(ARTEFACT_PAIR));
	ARTEFACT_PAIR			*I = m_weights;
	ARTEFACT_PAIR			*E = m_weights + n;
	for (u32 i = 0; I != E; ++I, ++i) {
		_GetItem			(artefacts,2*i,temp0);
		_GetItem			(artefacts,2*i + 1,temp1);
		new					(I) ARTEFACT_PAIR(temp0,(float)atof(temp1));
	}

	for (u32 ii=0; ii<m_artefact_count; ++ii) {
		float fProbability		= randF(1.f);
		float fSum				= 0.f;
		for (u16 p=0; p<n; ++p) {
			fSum			+= m_weights[p].second;
			if (fSum > fProbability)
				break;
		}
		if (p < n) {
			CSE_Abstract		*l_tpSE_Abstract = alife().spawn_item(*m_weights[p].first,position(),m_tNodeID,m_tGraphID,0xffff);
			R_ASSERT3			(l_tpSE_Abstract,"Can't spawn artefact ",*m_weights[p].first);
			CSE_ALifeDynamicObject	*i = smart_cast<CSE_ALifeDynamicObject*>(l_tpSE_Abstract);
			R_ASSERT2			(i,"Non-ALife object in the 'game.spawn'");

			i->m_tSpawnID		= m_tSpawnID;
			i->m_bALifeControl	= true;
			ai().alife().spawns().assign_artefact_position(this,i);

			Fvector				t = i->o_Position	;
			u32					p = i->m_tNodeID	;
			float				q = i->m_fDistance	;
			alife().graph().change(i,m_tGraphID,i->m_tGraphID);
			i->o_Position		= t;
			i->m_tNodeID		= p;
			i->m_fDistance		= q;

			CSE_ALifeItemArtefact *l_tpALifeItemArtefact = smart_cast<CSE_ALifeItemArtefact*>(i);
			R_ASSERT2		(l_tpALifeItemArtefact,"Anomalous zone can't generate non-artefact objects since they don't have an 'anomaly property'!");

			l_tpALifeItemArtefact->m_fAnomalyValue = m_maxPower*(1.f - i->o_Position.distance_to(o_Position)/m_offline_interactive_radius);
		}
	}

	for (I = m_weights; I != E; ++I)
		I->~ARTEFACT_PAIR		();
}