#include <stdio.h>
#include "tinyxml.h"
#include <iostream>
#include <cstring>
#include<string>
#include<vector>
#include <stdlib.h>
using namespace std;
struct Arc {
string id;
string source;
string target;
int sourceNum = 0;
int sourceP = 0;//源节点是库所,则sourceP为1
int sourceT = 0;
int targetNum = 0;
};
//库所顶点表
typedef struct Place
{
string name;
int num = 0;
int initialMarking = 0;
};
//变迁顶点表
typedef struct Transition
{
string name;
int num = 0;
};
int m = 0;
int n = 0;
int arcnum = 0;
Arc arc[1000];
int A[300][300] = { 0 };
Place place[300];
Transition transition[300];
void readPNML() {
TiXmlDocument mydoc("E:\\model.pnml");
bool loadOK = mydoc.LoadFile();
if (!loadOK) {
cout << "could not load the test file" << endl;
exit(1);
}
TiXmlElement *pnmlElement = mydoc.RootElement();
TiXmlElement *netElement = pnmlElement->FirstChildElement();
TiXmlElement *pageElement = netElement->FirstChildElement("page");
for (TiXmlElement *petriElement = pageElement->FirstChildElement();//第一个子元素
petriElement;
petriElement = petriElement->NextSiblingElement())
{
if (petriElement->ValueTStr() == "place") {
place[m].num = m;
if (petriElement->FirstChildElement("initialMarking")) {
TiXmlElement *initialMarkingElement = petriElement->FirstChildElement("initialMarking")->FirstChildElement("text");
place[m].initialMarking = atoi(initialMarkingElement->GetText());
}
TiXmlElement *nameElement = petriElement->FirstChildElement("name")->FirstChildElement("text");
place[m].name = nameElement->GetText();
m++;
}
if (petriElement->ValueTStr() == "transition") {
transition[n].num = n;
TiXmlElement *tnameElement = petriElement->FirstChildElement("name")->FirstChildElement("text");
transition[n].name = tnameElement->GetText();
n++;
}
if (petriElement->ValueTStr() == "arc") {
TiXmlAttribute *arcAttr = petriElement->FirstAttribute();
arc[arcnum].id = arcAttr->Value();
arcAttr = arcAttr->Next();
arc[arcnum].source = arcAttr->Value();
arcAttr = arcAttr->Next();
arc[arcnum].target = arcAttr->Value();
arcnum++;
}
}
for (int i = 0; i < arcnum; i++) {//对于每一条弧
for (int j = 0; j < n; j++) {//和变迁比
if (arc[i].source.compare(transition[j].name) == 0) {
arc[i].sourceT = 1;
arc[i].sourceNum = transition[j].num;
}
if (arc[i].target.compare(transition[j].name) == 0) {
arc[i].targetNum = j;
}
}
for (int k = 0; k < m; k++) {//和库所比
if (arc[i].source.compare(place[k].name) == 0) {
arc[i].sourceP = 1;
arc[i].sourceNum = place[k].num;
}
if (arc[i].target.compare(place[k].name) == 0) {
arc[i].targetNum = k;
}
}
}
}
void getA() {
for (int i = 0; i < arcnum; i++) {
if (arc[i].sourceP == 1) {
A[arc[i].targetNum][arc[i].sourceNum]--;
}
if (arc[i].sourceT == 1) {
A[arc[i].sourceNum][arc[i].targetNum]++;
}
}
}
void printA() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << A[i][j] << " ";
}
cout << endl;
}
}
int main() {
readPNML();//读取pnml文档信息
getA();//生成关联矩阵
printA();//打印关联矩阵
// ReachabilityGraph();//生成可达图
// PrintGraph();//打印可达图
system("pause");
return 0;
}