📄 topology.cpp
字号:
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 + -