Литература / ОтчетСетиПетри / net_cpp
.doc#include "net.h"
using namespace std;
cPetry::cPetry( char fileName[]){
fstream fin ( fileName );
vector < cAttr<string> > Astr;
vector < cAttr<int> > Aint; //цикл считывает информацию в атрибуты
for ( int i = 0; i < 16; ++i)
{
static int count = 0;
if ( i == 1 || i == 3 || i == 6 || i == 9 || i ==10 || i == 12 || i == 13 || i == 15)
{
cAttr <int> iTemp ( fileName, count );
Aint.push_back( iTemp );
}
else{
cAttr<string> sTemp (fileName, count);
Astr.push_back( sTemp );
}
}
// объявляем вектора кортежей, куда сольем информацию из атрибутов
// для будующих отношений
vector < cKort2<string, int> > temp_Sn;
vector < cKort2<string, int> > temp_Tt;
vector < cKort3<string, string, int> > temp_TSk;
vector < cKort3<string, string, int> > temp_STn;
vector < cKort3<int, string, int> > temp_activeT;
vector < cKort3<int, string, int> > temp_externalAct;
// формирование таблицы Sn
for ( int i = 0; i < Astr[0].size(); ++i){
cKort2<string, int> vTemp(Astr[0].getCell(i), Aint[0].getCell(i) );
temp_Sn.push_back(vTemp);
}
// формирование таблицы Tt
for ( i = 0; i < Astr[1].size(); ++i) {
cKort2<string, int> vTemp(Astr[1].getCell(i), Aint[1].getCell(i));
temp_Tt.push_back(vTemp);
}
// формирование таблицы переходов ST
for ( i = 0; i < Astr[2].size(); ++i)
{
cKort3<string,string, int> vTemp
( Astr[2].getCell(i),Astr[3].getCell(i), Aint[2].getCell(i));
temp_STn.push_back(vTemp);
}
// формирование таблицы переходов TS
for ( i = 0; i < Astr[4].size(); ++i){
cKort3<string,string, int> vTemp
( Astr[4].getCell(i),Astr[5].getCell(i), Aint[3].getCell(i) );
temp_TSk.push_back(vTemp);
}
// формирование таблицы активных переходов
for ( i = 0; i < Astr[6].size(); ++i){
cKort3<int, string, int> vTemp
( Aint[4].getCell(i), Astr[6].getCell(i), Aint[5].getCell(i));
temp_activeT.push_back( vTemp );
}
//формирование таблицы внешних воздействий
for ( i = 0; i < Aint[6].size(); ++i) {
cKort3<int,string, int> vTemp
( Aint[6].getCell(i), Astr[7].getCell(i), Aint[7].getCell(i));
temp_externalAct.push_back(vTemp);
}
Sn.setRel2( temp_Sn );
Tt.setRel2( temp_Tt );
TSk.setRel3( temp_TSk );
STn.setRel3( temp_STn );
activeT.setRel3( temp_activeT);
externalAct.setRel3( temp_externalAct);
}
void cPetry::print(){
cout << "S n" << endl;
for ( int i = 0; i < Sn.size(); ++i) Sn[i].print();
cout << "T t" << endl;
for ( i = 0; i < Tt.size(); ++i) Tt[i].print();
cout << "S T n" << endl;
for ( i = 0; i < STn.size(); ++i)STn[i].print();
cout << "T S k" << endl;
for ( i = 0; i < TSk.size(); ++i)TSk[i].print();
cout << "Tstart Tact Tfin" << endl;
for ( i = 0; i < activeT.size(); ++i) activeT[i].print();
cout << "Time S Ns" << endl;
for ( i = 0; i < externalAct.size(); ++i) externalAct[i].print();
}
// *********************************МОДЕЛИРОВАНИЕ
// **********************************************
// Функция завершения работы перехода
void cPetry::finishAct( int time )
{
int startSize = activeT.size();
string tempForDel[ 10 ];
static int tempS = 0;
for ( int i = 0; i < startSize; ++i)
{
if( activeT[i].getThird() == time )
{
for ( int j = 0; j < TSk.size(); ++j )
if ( TSk[j].getFirst() == activeT[i].getSecond())
for ( int k = 0; k < Sn.size(); ++k)
if (TSk[j].getSecond() == Sn[k].getFirst())
Sn[k].setSecond(Sn[k].getSecond()+TSk[j].getThird() );
// Кидаем отработанный переход в протокол событий
protocol.addEvent(activeT[i]);
tempForDel[tempS] = activeT[i].getSecond();
tempS++;
}
}
for ( i = 0; i < tempS; i ++ ) activeT.Delete2( tempForDel[i] );
}
// **********************************************
// Функция добавления новых фишек
void cPetry::addExternal( int time )
{
for ( int i = 0; i < externalAct.size(); ++i)
if ( externalAct[i].getFirst() == time )
for ( int j = 0; j < Sn.size(); ++j )
if ( Sn[j].getFirst() == externalAct[i].getSecond() )
Sn[j].setSecond( externalAct[i].getThird() + Sn[j].getSecond() );
}
// **********************************************
// Функция начала работы переходов
bool cPetry::startAct( int time ){
for ( int i = 0; i < Tt.size(); ++i )
{
bool flag = true;
// Проверяем, активен или нет i-ый переход
for ( int j = 0; j < activeT.size(); ++j)
if ( activeT[j].getSecond() == Tt[i].getFirst() ) flag = false ;
// Если переход неактивен флаг равен истине
if ( flag == false )continue;
// Первое. Пройти по таблице связей STn и выяснить, сколько необходимо фишек
// для начала работы перехода. Если их хватает, то второе
// Второе. Проходим по таблице состояний, убираем фишки, которые нужны для начала
// работы перехода.
// Третье. Кидаем активный переход в календарь событий.
// Первое.
cKort2 <string, int> prepS[ 1000 ];
int prep_size = 0;
for ( int j = 0; j < STn.size(); ++j )
{
if ( STn[j].getSecond() == Tt[i].getFirst() )
{
int k = -1;
do{
++k;
if ( Sn[k].getFirst() == STn[j].getFirst() ){
if ( Sn[k].getSecond() < STn[j].getThird() ) flag = false;
else {
flag = true;
prepS[prep_size].setFirst( Sn[k].getFirst());
prepS[prep_size].setSecond(STn[j].getThird());
prep_size++;
}
}
} while ( STn[j].getFirst() != Sn[k].getFirst() );
}
}
// Если для начала активности этого перехода не хватает фишек, то сваливаем
if ( flag == false ) continue;
// Второе.
for ( int j = 0; j < prep_size; ++j )
{
int k = -1;
do{
++k;
if ( prepS[j].getFirst() == Sn[k].getFirst() )
Sn[k].setSecond( Sn[k].getSecond() - prepS[j].getSecond() );
} while ( prepS[j].getFirst() != Sn[k].getFirst());
}
// Третье.
int delayTime = Tt[i].getSecond();
cKort3<int, string, int> newTActive(time, Tt[i].getFirst(), time + delayTime );
activeT.add( newTActive );
}
return true;
}
// *****************************************************
// Функция моделирования
void cPetry::model( int tStart, int tFinish){
for ( int curTime = tStart;curTime < tFinish; ++curTime){
finishAct( curTime );
addExternal( curTime );
startAct( curTime );
}
protocol.print();
}