cimforreduceloss/testHasttable/elementreduction.cpp

201 lines
5.6 KiB
C++

#include "elementreduction.h"
#include <iostream>
#include <QFile>
#include <QTextStream>
ElementReduction::ElementReduction(const QList<BranchStruc *> &branchList):branchList(branchList)
{
}
ElementReduction::~ElementReduction()
{
}
void ElementReduction::doIt()
{
QHash<QString,QVector<BranchStruc *> > linkage;
//先记录元件之间的连接关系
QHash<QString,BranchStruc *> idToBranch;
foreach(BranchStruc* v,this->branchList)
{
idToBranch[v->id]=v;
linkage[v->fromID].push_back(v);
linkage[v->toID].push_back(v);
}
QDomDocument root;
QDomElement element=root.createElement(this->branchList.at(2)->id);
root.appendChild(element);
this->buildTree(element,root,linkage,idToBranch);
this->visited.remove(this->branchList.at(2)->id);
this->buildTree2(element,root,linkage,idToBranch);
QFile file("1.xml");
if(file.open(QFile::WriteOnly))
{
// root.setContent(&file);
QTextStream writer(&file);
root.save(writer,4);
file.close();
}
//看看是不是每个都访问到了
foreach(BranchStruc* v,this->branchList)
{
if(!this->visited.contains(v->id))
{
std::cout<<"unvisited "<<v->id.toStdString()<<std::endl;
}
}
//合并
}
void ElementReduction::merge()
{
}
void ElementReduction::buildTree(QDomElement &element,QDomDocument &root,QHash<QString,QVector<BranchStruc *> >& linkage,QHash<QString,BranchStruc *>& idToBranch)
{
QString id=element.tagName();
if(this->visited.contains(id))
{
// std::cout<<"visited "<<branch->id.toStdString()<<std::endl;
return;
}
this->visited[id]=0;
BranchStruc * branch=idToBranch[id];
QString nextTo;
nextTo=branch->toID;
QVector<BranchStruc *> nextVec;
nextVec=linkage[nextTo];
foreach(BranchStruc *n,nextVec)
{
if(this->visited.contains(n->id))
{
continue;
}
// std::cout<<"add "<<n->id.toStdString()<<std::endl;
QDomElement newEle=root.createElement(n->id);
element.appendChild(newEle);
this->buildTree(newEle,root,linkage,idToBranch);
}
}
void ElementReduction::buildTree2(QDomElement &element,QDomDocument &root,QHash<QString,QVector<BranchStruc *> >& linkage,QHash<QString,BranchStruc *>& idToBranch)
{
QString id=element.tagName();
if(this->visited.contains(id))
{
std::cout<<"visited "<<id.toStdString()<<std::endl;
return;
}
this->visited[id]=0;
BranchStruc * branch=idToBranch[id];
QString nextFrom=branch->fromID;
QVector<BranchStruc *> nextFromVec;
nextFromVec=linkage[nextFrom];
foreach(BranchStruc *n,nextFromVec)
{
if(this->visited.contains(n->id))
{
continue;
}
// std::cout<<"add "<<n->id.toStdString()<<std::endl;
QDomElement newEle=root.createElement(n->id);
element.appendChild(newEle);
this->buildTree2(newEle,root,linkage,idToBranch);
}
}
void ElementReduction::visit(BranchStruc* branch,QHash<QString,QVector<BranchStruc *> >& linkage)
{
std::cout<<"visit "<<branch->id.toStdString()<<std::endl;
// if(this->visited.contains(branch->id))
// {
// std::cout<<"visited "<<branch->id.toStdString()<<std::endl;
// return;
// }
this->visited[branch->id]=0;
QString next;
next=branch->toID;
QVector<BranchStruc* > nextVec;
nextVec=linkage[next];
// std::cout<<"next length"<<nextVec.length()<<std::endl;
foreach(BranchStruc* v,nextVec)
{
if(v->dispose)
{
// std::cout<<"disposed "<<v->id.toStdString()<<std::endl;
continue;//丢弃的元件
}
if(v->isZeroBranch)//是0阻抗
{
std::cout<<"merge "<<branch->id.toStdString()<<" and "<<v->id.toStdString()<<std::endl;
//进行合并
branch->toID=v->toID;
v->dispose=true;
foreach(BranchStruc* change,linkage[branch->toID])
{
if(change->id==branch->id)
{
continue;
}
change->fromID=branch->toID;
}
}
// std::cout<<"start to visit next"<<std::endl;
if(v->id!=branch->id)
{
this->visit(v,linkage);//深度优先
}
}
}
void ElementReduction::visit2(BranchStruc* branch,QHash<QString,QVector<BranchStruc *> >& linkage)
{
// std::cout<<"visit "<<branch->id.toStdString()<<std::endl;
if(this->visited.contains(branch->id))
{
std::cout<<"visited "<<branch->id.toStdString()<<std::endl;
return;
}
this->visited[branch->id]=0;
QString next;
next=branch->fromID;
QVector<BranchStruc* > nextVec;
nextVec=linkage[next];
// std::cout<<"next length"<<nextVec.length()<<std::endl;
foreach(BranchStruc* v,nextVec)
{
if(v->dispose)
{
// std::cout<<"disposed "<<v->id.toStdString()<<std::endl;
continue;//丢弃的元件
}
if(v->isZeroBranch)//是0阻抗
{
std::cout<<"merge "<<branch->id.toStdString()<<" and "<<v->id.toStdString()<<std::endl;
//进行合并
branch->fromID=v->fromID;
v->dispose=true;
foreach(BranchStruc* change,linkage[branch->fromID])
{
if(change->id==branch->id)
{
continue;
}
change->toID=branch->fromID;
}
}
// std::cout<<"start to visit next"<<std::endl;
this->visit(v,linkage);//深度优先
}
}