Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.43 KB | None | 0 0
  1. //
  2. // Created by Lenovo on 3/15/2018.
  3. //
  4.  
  5. #include "dfaGenerator.h"
  6.  
  7.  
  8.  
  9. dfaGenerator::dfaGenerator(node* s)
  10. {
  11. vector<node*> temp;
  12. temp.push_back(s);
  13. tableRow* x = new tableRow(temp);
  14. states.push_back(x);
  15. // cout << "First node before Eclosure " << states[0]->getArrayList().size() << endl;
  16.  
  17. states[0] = Eclosure(states[0]);
  18. //cout << states[0]->getArrayList()[0]->get
  19. // cout <<"First node After Eclosure " << states[0]->getArrayList().size()<<" name: " << states[0]->getArrayList()[0]->getNodeCount()<<" "
  20. // << " name: "<< states[0]->getArrayList()[1]->getNodeCount()<<endl;
  21.  
  22. if(s->isFinal())
  23. {
  24. states[0]->setFinal(true, s->getFinalType());
  25. }
  26. tableGenerator();
  27. // cout<<"here"<<endl;
  28. // cout << "Mimization starts here ******************************" << endl;
  29. cout << "Size before minimization " << states.size()<<endl;
  30.  
  31. //Minimize();
  32. //cout << "Size after minimization " << states.size()<<endl;
  33.  
  34. }
  35.  
  36. tableRow* dfaGenerator::Eclosure(tableRow *row)
  37. {
  38. stack<node*> Stack;
  39. vector<node*> temp;
  40. tableRow *newRow = new tableRow(temp);
  41. for(int i = 0 ; i < row->getArrayList().size() ; i++)
  42. {
  43.  
  44. Stack.push(row->getArrayList()[i]);
  45.  
  46. newRow->addToArrayList(row->getArrayList()[i]);
  47.  
  48. if(row->getArrayList()[i]->isFinal())
  49. {
  50. row->setFinal(true, row->getArrayList()[i]->getFinalType());
  51. }
  52. }
  53.  
  54. while(!Stack.empty())
  55. {
  56.  
  57. node* n = Stack.top();
  58. Stack.pop();
  59. // cout<<"Node going out of stack > going out edges count: "<<n->getEdgeOutList().size()<<" Name: " << n->getNodeCount()<<endl;
  60. vector<Edge*> edges = n->getEdgeOutList();
  61.  
  62. for(int i = 0 ; i< edges.size() ; i++)
  63. {
  64.  
  65. Edge* e = edges[i];
  66. // cout<< "Edge value " <<e->getValue() << "Node Name: "<<e->getToNode()->getNodeCount()<<endl;
  67. // cout <<"Node of Node going out edges count: "<<e->getToNode()->getEdgeOutList().size()<<endl;
  68. if(e->getValue()== "\\L" &&
  69. !(std::find(newRow->getArrayList().begin(), newRow->getArrayList().end(), e->getToNode()) == newRow->getArrayList().end()))
  70. {
  71.  
  72.  
  73.  
  74. newRow->addToArrayList(e->getToNode());
  75. Stack.push(e->getToNode());
  76. // cout<<"We pushed " << e->getToNode()->getNodeCount()<< " into the stack, with out list = "<<e->getToNode()->getEdgeOutList().size() << "FINAL? "<<e->getToNode()->isFinal()<<endl;
  77. if(e->getToNode()->isFinal())
  78. {
  79. newRow->setFinal(true, e->getToNode()->getFinalType());
  80. }
  81. }
  82. }
  83. }
  84. return newRow;
  85.  
  86. }
  87. int dfaGenerator:: countSame(vector<node*> one, vector<node*> two)
  88. {
  89. int counter = 0 ;
  90. for (int i = 0 ; i < one.size() ; i ++)
  91. {
  92. if(std::find(two.begin(), two.end(), one[i]) != two.end())
  93. {
  94. counter++;
  95. }
  96. else
  97. {
  98. counter = -1 ;
  99. break;
  100. }
  101.  
  102. }
  103. return counter;
  104. }
  105. void dfaGenerator::tableGenerator()
  106. {
  107. for(int i = 0 ; i < states.size(); i++)
  108. {
  109. cout<<"Value of i: "<<i<<" size of states: "<<states.size()<<endl;
  110. tableRow *row = states[i];
  111. cout<<"sizee of arr " << row->getArrayList().size()<<" "<<row->getArrayList()[0]->getNodeCount()<<endl;
  112.  
  113. vector<node*> state = row->getArrayList();
  114. for (int j = 0 ; j < state.size() ; j++ )
  115. {
  116. //cout<<"here"<<endl;
  117. // cout << " ***************" << endl;
  118. node* n = state[j];
  119. cout << "value of j = " << j << " name of node: "<< n->getNodeCount()<<endl;
  120. vector<Edge*> edgeList = n->getEdgeOutList();
  121. cout<<"edge list size "<< edgeList.size()<<endl;
  122. for(int k = 0 ; k < edgeList.size() ; k++ )
  123. {
  124.  
  125. // cout << "value of k = " << k << endl;
  126.  
  127. Edge* e = edgeList[k];
  128. string val = e->getValue();
  129. // cout<<"value "<< val<<endl;
  130. // node* target = e->getToNode();
  131. map<string,tableRow*> temp = row->getMap();
  132. if(val != "\\L")
  133. {
  134.  
  135. if(temp[val] == NULL)
  136. {
  137. cout<<" here is my target node " << e->getToNode()->getNodeCount()<< e->getValue()<<endl;
  138.  
  139. vector<node*> t;
  140. t.push_back(e->getToNode());
  141. tableRow* tempr = new tableRow(t);
  142. row->addToHash(val,tempr);
  143. }
  144.  
  145. else
  146. {
  147. row->editMap(val,e->getToNode());
  148. cout << row ->getMap()[val]<<endl;
  149.  
  150. }
  151. }
  152.  
  153.  
  154. }
  155.  
  156. }
  157. int coun = 0 ;
  158. int x = row->getMap().size();
  159. for(map<string,tableRow*>::iterator itr = row->getMap().begin(); itr != row->getMap().end()
  160. && coun < x ; ++itr)
  161.  
  162. {
  163. //cout<<x<<endl;
  164. // cout << "here"<<(coun)<<endl;
  165.  
  166.  
  167. string key = itr->first;
  168. coun++;
  169.  
  170. cout<< key;
  171. cout<< "before " <<itr->second->getArrayList().size()<<endl;
  172.  
  173. tableRow *r = Eclosure(itr->second);
  174. cout<< "after "<<r->getArrayList().size()<<endl;
  175. cout<< "key >>>>>>>>>>>>>>>>>>>>>>>> "<<key<< "Size after closure of itr->second: "<< r->getArrayList().size()<< endl;
  176.  
  177. row->addToHash(key, r );
  178. cout << "more after "<<row->getMap()[itr->first]->getArrayList().size()<<endl;
  179. bool stateFound = false;
  180.  
  181. for(int k = 0 ; k <states.size(); k++)
  182. {
  183.  
  184. if(countSame(states[k]->getArrayList(), r->getArrayList()) == r->getArrayList().size())
  185. {
  186. stateFound = true;
  187. row->addToHash(key,states[k]);
  188. break;
  189. }
  190.  
  191.  
  192.  
  193. }
  194. if(!stateFound)
  195. states.push_back(row->getMap()[key]);
  196.  
  197. cout<<row->getMap()["l"]->getArrayList()[0]->getNodeCount()<<endl;
  198.  
  199. cout<<"Size of states after adding : " <<states.size()<<endl;
  200. }
  201. }
  202. }
  203.  
  204.  
  205. void dfaGenerator::Minimize()
  206. {
  207.  
  208. for(int i = 0 ; i < states.size()-1; i++)
  209. {
  210. //cout<<"aa fen"<<endl;
  211.  
  212. bool found =false;
  213. tableRow* Row1 = states[i];
  214. cout << "value of i= " << i<<endl;
  215. for(int j =i+1 ; j < states.size() ; j++)
  216. {
  217. cout << "value of j= " << j <<endl;
  218.  
  219. tableRow* Row2 = states[j];
  220. int counter1 , counter2;
  221. if(Row1->getMap().size()==Row2->getMap().size() && Row1->isFinal()==Row2->isFinal() )
  222. {
  223. cout << "Maps of 2 states are equal in length and both are Final"<<endl;
  224. counter1 = 0;
  225. for(map<string,tableRow*>::iterator it = Row1->getMap().begin(); counter1 < Row1->getMap().size() && it != Row1->getMap().end(); ++it)
  226. {
  227. found = false;
  228.  
  229. cout << "Iterate over map 1 with key = "<< it->first <<endl;
  230. counter2 =0;
  231.  
  232. for (map<string,tableRow*>::iterator it2 = Row2->getMap().begin(); counter2 < Row2->getMap().size() &&it2 != Row2->getMap().end(); ++it2)
  233. {
  234. //cout << "here" <<endl;
  235. cout << "Iterate over map 2 with key = "<< it2->first<<endl;
  236.  
  237. if (it->first == it2->first && it->second == it2->second)
  238. {
  239. //cout << found << endl;
  240. cout << "found " << it->first << " in map1 equal "<< it2->first <<" in map 2 " << endl;
  241. found = true;
  242. }
  243. counter2++;
  244. }
  245. if(found == false)
  246. {
  247. cout << "Didn't Find Equality & Breaking" << endl;
  248. break;
  249. }
  250. counter1++;
  251. }
  252. if(found==true) // 2 identical states
  253. {
  254. cout << "FOUND Total Equality"<<endl;
  255. for(int k = 0 ; k < states.size()-1; k++)
  256. {
  257. tableRow* ro = states[k];
  258. int counter3 = 0;
  259. for (map<string,tableRow*>::iterator iter = ro->getMap().begin(); counter3 < ro->getMap().size()&&iter != ro->getMap().end(); ++iter)
  260. {
  261.  
  262. if ((iter->second)->getArrayList() == Row2->getArrayList())
  263. {
  264.  
  265. ro->addToHash(iter->first, Row1);
  266. }
  267. counter3++;
  268. }
  269. }
  270.  
  271. states.erase(states.begin() + j);
  272. cout << ">>>>>>>>> Removing state: " << j << endl;
  273. cout << states.size()<< endl;
  274. j--;
  275. }
  276.  
  277. }
  278. }
  279. }
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement