Пример #1
0
/**
 * Returns the last ministep of the given option in the subchain starting
 * with the given ministep, or pFirst, if there is no such a ministep.
 */
MiniStep * Chain::pLastMiniStepForLink(const MiniStep * pLinkMiniStep) const
{
	int ego = pLinkMiniStep->ego();
	const NetworkChange * pLinkNetworkChange =
		dynamic_cast<const NetworkChange *>(pLinkMiniStep);
	int alter = pLinkNetworkChange->alter();
	const ActorSet * pActorSet1 =
		this->lpData->pNetworkData(pLinkMiniStep->variableName())->pSenders();
	const ActorSet * pActorSet2 =
		this->lpData->pNetworkData(pLinkMiniStep->variableName())->pReceivers();
	MiniStep * pLastMiniStep = this->lpFirst;
	MiniStep * pMiniStep = this->lpFirst->pNext();

	while (pMiniStep != this->lpLast)
	{
		if (pMiniStep->networkMiniStep())
		{
			const NetworkChange * pNetworkChange =
				dynamic_cast<const NetworkChange *>(pMiniStep);
			if (pMiniStep->ego() == ego &&
				pNetworkChange->alter() == alter)
			{
				NetworkLongitudinalData * pNetwork =
					this->lpData->pNetworkData(pMiniStep->variableName());
				if (pNetwork->pSenders() == pActorSet1 &&
					pNetwork->pReceivers() == pActorSet2)
				{
					pLastMiniStep = pMiniStep;
				}
			}
		}
		pMiniStep = pMiniStep->pNext();
	}
	return pLastMiniStep;
}
Пример #2
0
/**
 * Initializes this function.
 * @param[in] pData the observed data
 * @param[in] pState the current state of the dependent variables
 * @param[in] period the period of interest
 * @param[in] pCache the cache object to be used to speed up calculations
 */
void OutdegreePopularityEffect::initialize(const Data * pData,
	State * pState,
	int period,
	Cache * pCache)
{
	NetworkEffect::initialize(pData, pState, period, pCache);
	if (this->lcentered)
	{
		NetworkLongitudinalData * pNetworkData =
				pData->pNetworkData(this->lvariableName);
		this->lcentering = pNetworkData->averageOutDegree();
	}
}
Пример #3
0
/**
 * Returns the first ministep of the ego, alter, actor set1, actor set 2,
 * or pLast if there is no such a ministep.
 */
MiniStep * Chain::pFirstMiniStepForLink(const MiniStep * pLinkMiniStep) const
{
	int ego = pLinkMiniStep->ego();
	const NetworkChange * pLinkNetworkChange =
		dynamic_cast<const NetworkChange *>(pLinkMiniStep);
	int alter = pLinkNetworkChange->alter();
	const ActorSet * pActorSet1 =
		this->lpData->pNetworkData(pLinkMiniStep->variableName())->pSenders();
	const ActorSet * pActorSet2 =
		this->lpData->pNetworkData(pLinkMiniStep->variableName())->pReceivers();
	bool done = false;
	MiniStep * pMiniStep = this->lpFirst->pNext();
	while (pMiniStep != this->lpLast && !done)
	{
		if (pMiniStep->networkMiniStep())
		{
			const NetworkChange * pNetworkChange =
				dynamic_cast<const NetworkChange *>(pMiniStep);
			if (pMiniStep->ego() == ego &&
				pNetworkChange->alter() == alter)
			{
				NetworkLongitudinalData * pNetwork =
					this->lpData->pNetworkData(pMiniStep->variableName());
				if (pNetwork->pSenders() == pActorSet1 &&
					pNetwork->pReceivers() == pActorSet2)
				{
					done = true;
					break;
				}
			}
		}
		pMiniStep = pMiniStep->pNext();
	}
	if (pMiniStep != this->lpLast)
	{
		PrintValue(getMiniStepDF(*pMiniStep));
	}
	else
		Rprintf("last\n");
	return pMiniStep;
}
Пример #4
0
int approxNetworkLongitudinalData(const NetworkLongitudinalData& r) {
	int size = sizeof(r);
	// networks
	for (int i = 0; i < r.observationCount(); ++i) {
		size += approxNetwork(*r.pNetwork(i));
		size += approxNetwork(*r.pStructuralTieNetwork(i));
		size += approxNetwork(*r.pMissingTieNetwork(i));
		size += approxNetwork(*r.pNetworkLessMissing(i));
		size += approxNetwork(*r.pNetworkLessMissingStart(i));
	}
	// ldensity
	size += r.observationCount() * sizeof(double);
	LOGF(Priority::DEBUG, "NetworkLongitudinalData\t%s\t%d b", r.name().c_str(),
			size);
	return size;
}
Пример #5
0
/**
 *  sets up the model options of MAXDEGREE, UNIVERSALOFFSET, CONDITIONAL
 */
SEXP setupModelOptions(SEXP DATAPTR, SEXP MODELPTR, SEXP MAXDEGREE,
	SEXP UNIVERSALOFFSET,
	SEXP CONDVAR, SEXP CONDTARGETS, SEXP PROFILEDATA, SEXP PARALLELRUN,
	SEXP MODELTYPE, SEXP SIMPLERATES, SEXP NORMSETRATES)
{
	/* get hold of the data vector */
	vector<Data *> * pGroupData = (vector<Data *> *)
		R_ExternalPtrAddr(DATAPTR);
	int nGroups = pGroupData->size();

	/* get hold of the model object */
	Model * pModel = (Model *) R_ExternalPtrAddr(MODELPTR);

	if(!isNull(NORMSETRATES)){
		pModel->normalizeSettingRates(*(LOGICAL(NORMSETRATES)));
	}

	int totObservations = totalPeriods(*pGroupData);

	pModel->numberOfPeriods(totObservations);

	if (!isNull(CONDVAR))
	{
		int *change = INTEGER(CONDTARGETS);
		pModel->conditional(true);
		pModel->conditionalDependentVariable(CHAR(STRING_ELT(CONDVAR,0)));

		int i = 0;

		for (int group = 0; group < nGroups; group++)
		{
			Data * pData = (*pGroupData)[group];

			for (int period = 0;
				 period < pData->observationCount() - 1;
				 period++)
			{
				pModel->targetChange(pData, period, change[i]);
				i++;
			}
		}
	}
	/* get names vector for max degree */
	if (!isNull(MAXDEGREE))
	{
		SEXP Names = getAttrib(MAXDEGREE, R_NamesSymbol);

		for (int group = 0; group < nGroups; group++)
		{
			for (int i = 0; i < length(Names); i++)
			{
				Data * pData = (*pGroupData)[group];
				NetworkLongitudinalData * pNetworkData =
					pData->pNetworkData(CHAR(STRING_ELT(Names, i)));
				pNetworkData->maxDegree(INTEGER(MAXDEGREE)[i]);
			}
		}
	}
	/* get names vector for UniversalOffset */
	if (!isNull(UNIVERSALOFFSET))
	{
		SEXP Names = getAttrib(UNIVERSALOFFSET, R_NamesSymbol);

		for (int group = 0; group < nGroups; group++)
		{
			for (int i = 0; i < length(Names); i++)
			{
				Data * pData = (*pGroupData)[group];
				NetworkLongitudinalData * pNetworkData =
					pData->pNetworkData(CHAR(STRING_ELT(Names, i)));
				pNetworkData->universalOffset(REAL(UNIVERSALOFFSET)[i]);
			}
		}
	}
	/* set the parallel run flag on the model */
	if (!isNull(PARALLELRUN))
	{
		pModel->parallelRun(true);
	}
	if (!isNull(MODELTYPE))
	{
		pModel->modelType(asInteger(MODELTYPE));
	}
	// print out Data for profiling
	if (asInteger(PROFILEDATA))
	{
		printOutData((*pGroupData)[0]);
	}

	pModel->simpleRates(asInteger(SIMPLERATES));

	return R_NilValue;

}
Пример #6
0
/**
 * Generates a chain connecting the original and simulated initial
 * observations of the given data object for the given period.
 * The chain is simple in the sense that no two ministeps cancel each other out.
 */
void Chain::createInitialStateDifferences()
{
	deallocateVector(this->linitialStateDifferences);
	//Rprintf("******** %d create initial\n",this->linitialStateDifferences.size() );
	Data * pData = this->lpData;
	State * initialState = this->lpInitialState;
	int period = this->lperiod;

	// Create the required ministeps

	for (unsigned variableIndex = 0;
		variableIndex < pData->rDependentVariableData().size();
		variableIndex++)
	{
		LongitudinalData * pVariableData =
			pData->rDependentVariableData()[variableIndex];
		NetworkLongitudinalData * pNetworkData =
			dynamic_cast<NetworkLongitudinalData *>(pVariableData);
		BehaviorLongitudinalData * pBehaviorData =
			dynamic_cast<BehaviorLongitudinalData *>(pVariableData);

		if (pNetworkData)
		{
			const Network * pNetwork1 = pNetworkData->pNetwork(period);
			const Network * pNetwork2 =
				initialState->pNetwork(pNetworkData->name());

			for (int i = 0; i < pNetwork1->n(); i++)
			{
				IncidentTieIterator iter1 = pNetwork1->outTies(i);
				IncidentTieIterator iter2 = pNetwork2->outTies(i);

				while (iter1.valid() || iter2.valid())
				{
					if (iter1.valid() &&
						(!iter2.valid() || iter1.actor() < iter2.actor()))
					{
						if (!pNetworkData->structural(i, iter1.actor(),
								period)
							//	|| !pNetworkData->structural(i, iter1.actor(),
							//	period + 1)
							)
						{
							NetworkChange * pMiniStep =
								new NetworkChange(pNetworkData,
									i,
									iter1.actor(), false);
							//		PrintValue(getMiniStepDF(*pMiniStep));
							this->linitialStateDifferences.
								push_back(pMiniStep);

							iter1.next();
							//	PrintValue(getMiniStepDF(
							//		*this->linitialStateDifferences.back()));
						}
						else
						{
							// create step in structural subchain?
						}
					}
					else if (iter2.valid() &&
						(!iter1.valid() || iter2.actor() < iter1.actor()))
					{
						if (!pNetworkData->structural(i, iter2.actor(),
								period)
							//	|| !pNetworkData->structural(i, iter2.actor(),
							// period + 1)
							)
						{
							this->linitialStateDifferences.push_back(
								new NetworkChange(pNetworkData,
									i,
									iter2.actor(), false));
							iter2.next();
							//PrintValue(getMiniStepDF(
							//		*this->linitialStateDifferences.back()));
						}
						else
						{
							// create step in structural subchain?
						}
					}
					else
					{
						iter1.next();
						iter2.next();
					}
				}
			}
		}
		else if (pBehaviorData)
		{
			for (int i = 0; i < pBehaviorData->n(); i++)
			{
				int delta = initialState->
					behaviorValues(pBehaviorData->name())[i]
					- pBehaviorData->value(period, i);
				int singleChange = 1;

				if (delta < 0)
				{
					delta = -delta;
					singleChange = -1;
				}

				for (int j = 0; j < delta; j++)
				{
					if (!pBehaviorData->structural(period, j)
						//|| !pBehaviorData->structural(period, j + 1)
						)

					{
						this->linitialStateDifferences.push_back(
							new BehaviorChange(pBehaviorData,
								i,
								singleChange));
						//	Rprintf(" %d %d in beh\n", i, singleChange);
					}
					else
					{
						// create step in structural subchain?
					}
				}
			}
		}
	}
//	Rprintf("xx ********%d %d end create initial diff\n", this->linitialStateDifferences.size(), period);
}
Пример #7
0
/**
 * Generates a random chain connecting the start and end observations of the
 * given data object for the given period. The chain is simple in the sense
 * that no two ministeps cancel each other out.
 */
void Chain::connect(int period, MLSimulation * pMLSimulation)
{
	this->clear();
	this->lperiod = period;
	vector<MiniStep *> miniSteps;

	// Create the required ministeps

	for (unsigned variableIndex = 0;
		variableIndex < this->lpData->rDependentVariableData().size();
		variableIndex++)
	{
		LongitudinalData * pVariableData =
			this->lpData->rDependentVariableData()[variableIndex];
		NetworkLongitudinalData * pNetworkData =
			dynamic_cast<NetworkLongitudinalData *>(pVariableData);
		BehaviorLongitudinalData * pBehaviorData =
			dynamic_cast<BehaviorLongitudinalData *>(pVariableData);

		if (pNetworkData)
		{
			const Network * pNetwork1 = pNetworkData->pNetwork(period);
			const Network * pNetwork2 = pNetworkData->pNetwork(period + 1);

			for (int i = 0; i < pNetwork1->n(); i++)
			{
				IncidentTieIterator iter1 = pNetwork1->outTies(i);
				IncidentTieIterator iter2 = pNetwork2->outTies(i);

				while (iter1.valid() || iter2.valid())
				{
					if (iter1.valid() &&
						(!iter2.valid() || iter1.actor() < iter2.actor()))
					{
						if (!pNetworkData->structural(i, iter1.actor(),
								period)
							//	|| !pNetworkData->structural(i, iter1.actor(),
							//	period + 1)
							)
						{
							miniSteps.push_back(
								new NetworkChange(pNetworkData,
									i,
									iter1.actor(), false));
							iter1.next();
						}
						else
						{
							// create step in structural subchain?
						}
					}
					else if (iter2.valid() &&
						(!iter1.valid() || iter2.actor() < iter1.actor()))
					{
						if (!pNetworkData->structural(i, iter2.actor(),
								period)
							//	|| !pNetworkData->structural(i, iter2.actor(),
							// period + 1)
							)
						{
							miniSteps.push_back(
								new NetworkChange(pNetworkData,
									i,
									iter2.actor(), false));
							iter2.next();
						}
						else
						{
							// create step in structural subchain?
						}
					}
					else
					{
						iter1.next();
						iter2.next();
					}
				}
			}
		}
		else if (pBehaviorData)
		{
			for (int i = 0; i < pBehaviorData->n(); i++)
			{
				int delta = pBehaviorData->value(period + 1, i) -
					pBehaviorData->value(period, i);
				int singleChange = 1;

				if (delta < 0)
				{
					delta = -delta;
					singleChange = -1;
				}

				for (int j = 0; j < delta; j++)
				{
					if (!pBehaviorData->structural(period, j)
						//|| !pBehaviorData->structural(period, j + 1)
						)

					{
						miniSteps.push_back(
							new BehaviorChange(pBehaviorData,
								i,
								singleChange));
					}
					else
					{
						// create step in structural subchain?
					}
				}
			}
		}
	}

	// If we have no constraints we can go ahead and add to the chain in a
	// random order. If we do have contraints we need to make sure our chain
	// is valid. For now we have two distinct loops:

	if (this->lpData->rNetworkConstraints().size()  == 0)
	{
		// Randomize the ministeps

		for (unsigned i = 1; i < miniSteps.size(); i++)
		{
			int j = nextInt(i + 1);
			MiniStep * pTempMiniStep = miniSteps[i];
			miniSteps[i] = miniSteps[j];
			miniSteps[j] = pTempMiniStep;
		}

		// And finally add the ministeps to this chain

		for (unsigned i = 0; i < miniSteps.size(); i++)
		{
			this->insertBefore(miniSteps[i], this->lpLast);
		}
	}
	else
	{
		unsigned count = 0;
		vector<MiniStep *> remainingMiniSteps;
		while(miniSteps.size() > 0 &&
			count < this->lpData->rDependentVariableData().size())
		{
			count++;
			remainingMiniSteps.clear();
			for (unsigned i = 0; i < miniSteps.size(); i++)
			{
				// first try random insert
				//const NetworkChange * pNetworkChange =
				//	dynamic_cast<const NetworkChange *>(miniSteps[i]);
				MiniStep * pMiniStep =
					this->randomMiniStep(this->lpFirst->pNext(),
						this->lpLast);
				bool valid = false;
				if (miniSteps[i]->behaviorMiniStep())
				{
					valid = true;
				}
				else
				{
					// get current state at this place
					pMLSimulation->initialize(this->lperiod);
					pMLSimulation->executeMiniSteps(this->lpFirst->pNext(),
						pMiniStep);
					// see if valid here
					DependentVariable * pVariable =
						pMLSimulation->rVariables()[miniSteps[i]->variableId()];
					//	PrintValue(getMiniStepDF(*miniSteps[i]));

					if (!pVariable->validMiniStep(miniSteps[i]))
					{
						//		Rprintf("first inval\n");
						// no go, so try to find somewhere else to put it
						MiniStep * pLastMiniStep =
							this->pLastMiniStepForLink(miniSteps[i]);
						if (pLastMiniStep != this->lpFirst)
						{
							//		Rprintf("lastl\n");
							//	PrintValue(getMiniStepDF(*pLastMiniStep));
							pMiniStep =
								this->randomMiniStep(pLastMiniStep->pNext(),
									this->lpLast);
							//	PrintValue(getMiniStepDF(*pMiniStep));
							pMLSimulation->initialize(this->lperiod);
							pMLSimulation->executeMiniSteps(this->lpFirst->
								pNext(), pMiniStep);
							// see if valid here
							if (!pVariable->validMiniStep(miniSteps[i]))
							{
								//		Rprintf("second inval\n");
								// no go, so try to find somewhere else to put
								// it
								MiniStep * pFirstMiniStep =
									this->pFirstMiniStepForLink(miniSteps[i]);
								//	if (pFirstMiniStep != this->lpFirst)
								//{
								//	PrintValue(getMiniStepDF(*pFirstMiniStep));
								pMiniStep =
									this->randomMiniStep(this->
										lpFirst->pNext(),
										pFirstMiniStep);
								//	PrintValue(getMiniStepDF(*pMiniStep));
								pMLSimulation->initialize(this->lperiod);
								pMLSimulation->
									executeMiniSteps(pFirstMiniStep,
										pMiniStep);
								// see if valid here
								if (pVariable->validMiniStep(miniSteps[i]))
								{
									Rprintf("thirsd true val\n");
									valid = true;
								}
								//	}
							}
							else
							{
								valid = true;
							}
						}
					}
					else
					{
						valid = true;
					}
				}
				if (valid)
				{
					this->insertBefore(miniSteps[i], pMiniStep);
				}
				else
				{
					remainingMiniSteps.push_back(miniSteps[i]);
				}
			}
			miniSteps = remainingMiniSteps;
		}
		//	PrintValue(getChainDF(*this, false));
		//	Rprintf("****** count %d\n", count);
		if (miniSteps.size() > 0)
		{
			for (unsigned i = 0; i < miniSteps.size(); i++)
			{
				PrintValue(getMiniStepDF(*miniSteps[i]));
			}

			error("Cannot create minimal chain due to constraints");
		}
	}
}