⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topology.cpp

📁 模拟P2P各种网络环境的,适合新手们的学习,不错的源码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		pre = mDomain[mAsNumber].predecessorMatrix[indexA][indexB];
		if(pre != -1)
		{
			if(pre == indexA)
			{
				idi = mDomain[mAsNumber].mapTable[indexB];
				idj = mDomain[mAsNumber].mapTable[indexA];
				Link *link = getLinkBetween(idi, idj);
				if(link)
					path.push_back(link);
				else {
					path.clear();
					return path;
				}
			}
			else {
				lastpre = indexB;
				do
				{
					idi = mDomain[mAsNumber].mapTable[lastpre];
					idj = mDomain[mAsNumber].mapTable[pre];
					Link *link = getLinkBetween(idi, idj);
					if(!link)
					{
						path.clear();
						return path;
					}
					path.push_back(link);
					lastpre = pre;
					pre = mDomain[mAsNumber].predecessorMatrix[indexA][pre];
				}
				while(pre != -1);
			}
		}

		pre = mDomain[aidi].predecessorMatrix[indexi][indexa];
		if(pre != -1)
		{
			if(pre == indexi)
			{
				idi = mDomain[aidi].mapTable[indexa];
				idj = mDomain[aidi].mapTable[indexi];
				Link *link = getLinkBetween(idi, idj);
				if(link)
					path.push_back(link);
				else {
					path.clear();
					return path;
				}
			}
			else {
				lastpre = indexa;
				do
				{
					idi = mDomain[aidi].mapTable[lastpre];
					idj = mDomain[aidi].mapTable[pre];
					Link *link = getLinkBetween(idi, idj);
					if(!link)
					{
						path.clear();
						return path;
					}
					path.push_back(link);
					lastpre = pre;
					pre = mDomain[aidi].predecessorMatrix[indexi][pre];
				}
				while(pre != -1);
			}
		}
		
		return path;
	}
	return path;
}

void Topology::configNetwork(Graph &graph, Property &property)
{		
	unsigned int i, j;
	unsigned int n;

	map<string, Link>::iterator it;

	string delayGenerateMethod = "OFF", bandGenerateMethod = "OFF", congestEstimation = "OFF", dataFile = "OFF";
	unsigned long minSSD = 0, maxSSD = 0;
	unsigned long minSTD = 0, maxSTD = 0;
	unsigned long minInterTTD = 0, maxInterTTD = 0;
	unsigned long minIntraTTD = 0, maxIntraTTD = 0;

	unsigned long minSSB = 0, maxSSB = 0;
	unsigned long minSTB = 0, maxSTB = 0;
	unsigned long minInterTTB = 0, maxInterTTB = 0;
	unsigned long minIntraTTB = 0, maxIntraTTB = 0;

	double alpha = 0, beta = 0;
	
	double mss = 0, rtt = 0, loss = 0, c = 0;
	bool debug;

	mAsNumber = graph.getAsNumber();
	mNodeNumber = graph.getNodeNumber();
	mLinkNumber = graph.getLinkNumber();

	mNode = graph.getAllNode();
	mLink = graph.getAllLink();

	vector<unsigned long> lineDelay(mNodeNumber);
	vector<int> linePredecessor(mNodeNumber);
	
	for(i = 0; i < (unsigned int)mNodeNumber; i++)
	{
		lineDelay[i] = 0;
		linePredecessor[i] = -1;
	}

	
	for(i = 0; i < (unsigned int)mNodeNumber; i++)
	{
		mDelayMatrix.push_back(lineDelay);
		mPredecessorMatrix.push_back(linePredecessor);
	}

	for(i = 0; i <= (unsigned int)mAsNumber; i++)
	{
		Domain temp;
		temp.id = (int)i;
		temp.number = 0;
		temp.transitNumber = 0;
		mDomain.push_back(temp);
	}

	for(i = 0; i < (unsigned int)mNodeNumber; i++)
	{
		int nid = mNode[i].getID();
		int aid = mNode[i].getAID();
		int type = mNode[i].getType();
		
		if(type == TRANSIT)
		{
			mDomain[aid].transitNumber += 1;
			mDomain[aid].transitTable.insert(mDomain[aid].number);
		}

		mDomain[aid].mapTable[mDomain[aid].number] = nid;
		mDomain[aid].reverseMapTable[nid] = mDomain[aid].number;
		mDomain[aid].number += 1;
	}

	for(i = 0; i < (unsigned int)mNodeNumber; i++)
	{
		int nid = mNode[i].getID();
		int type = mNode[i].getType();
		
		if(type != TRANSIT)
			continue;

		mDomain[mAsNumber].transitNumber += 1;
		mDomain[mAsNumber].transitTable.insert(mDomain[mAsNumber].number);
		mDomain[mAsNumber].mapTable[mDomain[mAsNumber].number] = nid;
		mDomain[mAsNumber].reverseMapTable[nid] = mDomain[mAsNumber].number;
		mDomain[mAsNumber].number += 1;
	}

	for(i = 0; i <= (unsigned int)mAsNumber; i++)
	{
		vector<int> linePredecessor(mDomain[i].number);
		vector<unsigned long> lineDelay(mDomain[i].number);
		for(j = 0; j < (unsigned int)mDomain[i].number; j++)
		{
			linePredecessor[j] = -1;
			lineDelay[j] = 0;
		}
		for(j = 0; j < (unsigned int)mDomain[i].number; j++)
		{
			mDomain[i].predecessorMatrix.push_back(linePredecessor);
			mDomain[i].delayMatrix.push_back(lineDelay);
		}
	}


	map<string, string> tmap = property.getProperty();
	
	assert(tmap.find("debug") != tmap.end());
	if(tmap["debug"] == "ON")
		debug = true;
	else
		debug = false;

	if(debug)
	{
		cout << "******************************************************" << endl;
		cout << "After making graph from Graph object" << endl;
		cout << "mAsNumber: " << mAsNumber << endl;
		cout << "mNodeNumber: " << mNodeNumber << endl;
		cout << "mLinkNumber: " << mLinkNumber << endl;
		cout << "mNode: " << endl;
		cout << mNode << endl;
		cout << "mLink" << endl;
		cout << mLink << endl;
		cout << "******************************************************" << endl;
	}

	if(debug)
		cout << "read configure value" << endl;
	
	assert(tmap.find("delayGenerateMethod") != tmap.end());
	delayGenerateMethod = tmap["delayGenerateMethod"];

	assert(tmap.find("bandGenerateMethod") != tmap.end());
	bandGenerateMethod = tmap["bandGenerateMethod"];

	assert(tmap.find("congestEstimation") != tmap.end());
	congestEstimation = tmap["congestEstimation"];

	assert(tmap.find("dataFile") != tmap.end());
	dataFile = tmap["dataFile"];

	if(delayGenerateMethod != "OFF")
	{
		assert(tmap.find("minSSD") != tmap.end());
		minSSD = (unsigned long)(MAGNIFIER * atof(tmap["minSSD"].c_str()));
		
		assert(tmap.find("minSTD") != tmap.end());
		minSTD = (unsigned long)(MAGNIFIER * atof(tmap["minSTD"].c_str()));
		
		assert(tmap.find("minInterTTD") != tmap.end());
		minInterTTD = (unsigned long)(MAGNIFIER * atof(tmap["minInterTTD"].c_str()));
		
		assert(tmap.find("minIntraTTD") != tmap.end());
		minIntraTTD = (unsigned long)(MAGNIFIER * atof(tmap["minIntraTTD"].c_str()));

		assert(tmap.find("maxSSD") != tmap.end());
		maxSSD = (unsigned long)(MAGNIFIER * atof(tmap["maxSSD"].c_str()));
		
		assert(tmap.find("maxSTD") != tmap.end());
		maxSTD = (unsigned long)(MAGNIFIER * atof(tmap["maxSTD"].c_str()));
		
		assert(tmap.find("maxInterTTD") != tmap.end());
		maxInterTTD = (unsigned long)(MAGNIFIER * atof(tmap["maxInterTTD"].c_str()));
		
		assert(tmap.find("maxIntraTTD") != tmap.end());
		maxIntraTTD = (unsigned long)(MAGNIFIER * atof(tmap["maxIntraTTD"].c_str()));	
	}
	
	if(delayGenerateMethod == "EXPONENT") {
		assert(tmap.find("alpha") != tmap.end());
		alpha = atof(tmap["alpha"].c_str());
	}

	if(bandGenerateMethod != "OFF")
	{
		assert(tmap.find("minSSB") != tmap.end());
		minSSB = (unsigned long)atof(tmap["minSSB"].c_str());
		
		assert(tmap.find("minSTB") != tmap.end());
		minSTB = (unsigned long)atof(tmap["minSTB"].c_str());
		
		assert(tmap.find("minInterTTB") != tmap.end());
		minInterTTB = (unsigned long)atof(tmap["minInterTTB"].c_str());
		
		assert(tmap.find("minIntraTTB") != tmap.end());
		minIntraTTB = (unsigned long)atof(tmap["minIntraTTB"].c_str());

		assert(tmap.find("maxSSB") != tmap.end());
		maxSSB = (unsigned long)atof(tmap["maxSSB"].c_str());
		
		assert(tmap.find("maxSTB") != tmap.end());
		maxSTB = (unsigned long)atof(tmap["maxSTB"].c_str());
		
		assert(tmap.find("maxInterTTB") != tmap.end());
		maxInterTTB = (unsigned long)atof(tmap["maxInterTTB"].c_str());
		
		assert(tmap.find("maxIntraTTB") != tmap.end());
		maxIntraTTB = (unsigned long)atof(tmap["maxIntraTTB"].c_str());
	}

	if(bandGenerateMethod == "EXPONENT") {
		assert(tmap.find("beta") != tmap.end());
		beta = atof(tmap["beta"].c_str());
	}
	
	if(congestEstimation == "ON")
	{
		assert(tmap.find("mss") != tmap.end());
		mss = atof(tmap["mss"].c_str());

		assert(tmap.find("rtt") != tmap.end());
		rtt = atof(tmap["rtt"].c_str());

		assert(tmap.find("loss") != tmap.end());
		loss = atof(tmap["loss"].c_str());

		assert(tmap.find("c") != tmap.end());
		c = atof(tmap["c"].c_str());
	}

	if(debug)
	{
		cout << "delayGenerateMethod = " << delayGenerateMethod << endl;
		cout << "bandGenerateMethod = " << bandGenerateMethod << endl;
		cout << "congestEstimation = " << congestEstimation << endl;
		
		cout << endl;
		cout << "minSSD = " << minSSD << '\t' << "maxSSD = " << maxSSD  << endl;
		cout << "minSTD = " << minSTD << '\t' << "maxSTD = " << maxSTD  << endl;
		cout << "minInterTTD = " << minInterTTD << '\t' << "maxInterTTD = " << maxInterTTD  << endl;
		cout << "minIntraTTD = " << minIntraTTD << '\t' << "maxIntraTTD = " << maxIntraTTD  << endl;
		cout << endl;

		cout << "minSSB = " << minSSB << '\t' << "maxSSB = " << maxSSB  << endl;
		cout << "minSTB = " << minSTB << '\t' << "maxSTB = " << maxSTB  << endl;
		cout << "minInterTTB = " << minInterTTB << '\t' << "maxInterTTB = " << maxInterTTB  << endl;
		cout << "minIntraTTB = " << minIntraTTB << '\t' << "maxIntraTTB = " << maxIntraTTB  << endl;
		cout << endl;

		cout << "alpha = " << alpha << '\t' << "beta = " << beta << endl;
		cout << "mss = " << mss << '\t' << "rtt = " << rtt << '\t' << "loss = " << loss << '\t' << "c = " << c << endl;
	}

	/* add intra-transit edge, make sure the transit domain is connected */
	vector<int> transitTable;
	map<int, int>::iterator itm;
	for(itm = mDomain[mAsNumber].mapTable.begin(); itm != mDomain[mAsNumber].mapTable.end(); itm++)
		transitTable.push_back((*itm).second);
	
	n = transitTable.size();
	for(i = 0; i < n; i++)
		for(j = 0; j < n; j++)
		{
			if(i == j)
				continue;
			int aidi = mNode[transitTable[i]].getAID();
			int aidj = mNode[transitTable[j]].getAID();
			if(aidi != aidj)
				continue;
			string key1 = intToString(transitTable[i], transitTable[j]);
			string key2 = intToString(transitTable[j], transitTable[i]);
			if(mLink.find(key1) != mLink.end() || mLink.find(key2) != mLink.end())
				continue;
			LinkProperty property;
			BandwidthManager bandwidthManager;
			Link link;
			bandwidthManager.setBandwidth(minIntraTTB);
			property.setType(TRA_TRA_INTRA);
			property.setBandwidth(minIntraTTB);
			property.setDelay(minIntraTTD);
			property.setLable("tran-tran-a");
			link.setFrom(transitTable[i]);
			link.setTo(transitTable[j]);
			link.setProperty(property);
			link.setBandwidthManager(bandwidthManager);
			mLink[key1] = link;
			mNode[transitTable[i]].haveLinkTo(transitTable[j]);
			mNode[transitTable[j]].haveLinkTo(transitTable[i]);
		}


	if(delayGenerateMethod != "OFF")
	{
		if(debug)
		cout << "delay generation on" << endl;
		for(it = mLink.begin(); it != mLink.end(); it++)
		{
			if(delayGenerateMethod == "CONST")
			{
				if((*it).second.getType() == STU_STU) {
					(*it).second.setDelay(minSSD);
					mDelayMatrix[(*it).second.from()][(*it).second.to()] = minSSD;
					mDelayMatrix[(*it).second.to()][(*it).second.from()] = minSSD;
				}
				else if((*it).second.getType() == STU_TRA) {
					(*it).second.setDelay(minSTD);
					mDelayMatrix[(*it).second.from()][(*it).second.to()] =  minSTD;
					mDelayMatrix[(*it).second.to()][(*it).second.from()] = minSTD;

				}
				else if((*it).second.getType() == TRA_TRA_INTRA) {
					(*it).second.setDelay(minIntraTTD);
					mDelayMatrix[(*it).second.from()][(*it).second.to()] =  minIntraTTD;
					mDelayMatrix[(*it).second.to()][(*it).second.from()] = minIntraTTD;
				}
				else if((*it).second.getType() == TRA_TRA_INTER) {
					(*it).second.setDelay(minInterTTD);
					mDelayMatrix[(*it).second.from()][(*it).second.to()] =  minInterTTD;
					mDelayMatrix[(*it).second.to()][(*it).second.from()] = minInterTTD;
				}
				else {
					cout << "unkown edge type encountered when configure topology object" << endl;
					exit(-1);
				}
			}
			else if(delayGenerateMethod == "UNIFORM")
			{
				double delay;
				double k = random();
				if((*it).second.getType() == STU_STU) {
					unsigned long interval = maxSSD - minSSD;
					delay = minSSD + k / RAND_MAX * interval;
				}
				else if((*it).second.getType() == STU_TRA) {
					unsigned long interval = maxSTD - minSTD;
					delay = minSTD + k / RAND_MAX * interval;
				}
				else if((*it).second.getType() == TRA_TRA_INTRA) {
					unsigned long interval = maxIntraTTD - minIntraTTD;
					delay = minIntraTTD + k / RAND_MAX * interval;
				}
				else if((*it).second.getType() == TRA_TRA_INTER) {
					unsigned long interval = maxInterTTD - minInterTTD;
					delay = minInterTTD + k / RAND_MAX * interval;
				}
				else {
					cout << "unkown edge type encountered when initialize topology object" << endl;
					exit(-1);
				}
				(*it).second.setDelay((unsigned long)delay);
				mDelayMatrix[(*it).second.from()][(*it).second.to()] =  (unsigned long)delay;
				mDelayMatrix[(*it).second.to()][(*it).second.from()] = (unsigned long)delay;
			}
			else if(delayGenerateMethod == "EXPONENT") {
				double delay;
				double p = (double)random() / RAND_MAX;
				if(p < PMIN)
					p = PMIN;
				else if(p > PMAX)
					p = PMAX;
				delay = 0 - log(1 - p) / alpha;
				if((*it).second.getType() == STU_STU)
					delay += minSSD;
				else if((*it).second.getType() == STU_TRA)
					delay += minSTD;
				else if((*it).second.getType() == TRA_TRA_INTRA)
					delay += minIntraTTD;
				else if((*it).second.getType() == TRA_TRA_INTER)
					delay += minInterTTD;
				else {
					cout << "unkown edge type encountered when initialize topology object" << endl;
					exit(-1);
				}
				(*it).second.setDelay((unsigned long)delay);
				mDelayMatrix[(*it).second.from()][(*it).second.to()] =  (unsigned long)delay;
				mDelayMatrix[(*it).second.to()][(*it).second.from()] = (unsigned long)delay;				
			}
			else {
				cout << "delay generation method aren't support" << endl;
				exit(-1);
			}
		}
	}
	if(bandGenerateMethod != "OFF")
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -