mp2_print_etc.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * mp2_print_subroutines.h
  3. *
  4. * Created by Mike Auguston on 02/05/15.
  5. * last modified 03/22/15
  6. */
  7. //=======================================
  8. // this declaration uses Event_name enum
  9. // it is a single object referred when needed by containers
  10. // does not leave anything on the trace
  11. Empty_producer Dummy(Dummy_event);
  12. //=======================================
  13. // print uses event_name_string[]
  14. //-----------------------------------------
  15. void Composite_producer::harvest(){
  16. // calls traverse to fill the segments list
  17. Traversal_result result;
  18. int my_total = 0;
  19. int min_trace = 10000000;
  20. int max_trace = 0;
  21. do {
  22. // reset Stack and relation lists to start new trace assembly
  23. Stack.clear();
  24. Follows.clear();
  25. Inside.clear();
  26. Equals.clear();
  27. tails.clear();
  28. heads.clear();
  29. // prepare stacks for traversal
  30. predecessor.clear();
  31. predecessor.push_back(-1);
  32. // no predecessor for the event at beginning of a segment
  33. // it will be brought by containers in add_relations_for_leader()
  34. // add a Composite event instance event to the trace: name, index, and length
  35. // the length of segment will be adjusted later
  36. Stack.push_back(new Composite_event_instance(name, segments.size()));
  37. Stack[0]->type = target_event;
  38. result = traverse(); // fills the Stack and relation lists
  39. // relations are assembled/processed in the container objects
  40. predecessor.pop_back(); // restore ordering for the previous nesting level
  41. if(result == failed){
  42. if(completeness_count == element_count) break;
  43. // there are no more options to try
  44. else continue;
  45. }
  46. // store the assembled segment, its relation lists and event stats
  47. segments.push_back(Stack);
  48. follows_lists.push_back(Follows);
  49. inside_lists.push_back(Inside);
  50. equals_lists.push_back(Equals);
  51. // do statistics: for total number of events stored <<<<<<<<<<<<
  52. int segment_len = Stack.size();
  53. total_events += segment_len;
  54. my_total += segment_len;
  55. if(segment_len < min_trace) min_trace = segment_len;
  56. if(segment_len > max_trace) max_trace = segment_len;
  57. storage += (sizeof Stack) + sizeof(Event_producer_ref) * segment_len +
  58. 3 * sizeof(pair_list) +
  59. sizeof (pair<int, int>) * (Follows.size() + Inside.size() + Equals.size());
  60. } while(result != success_and_completed);
  61. if(segments.size())
  62. cout<<"completed "<<event_name_string[name]<<": \t"<<segments.size()<<" traces \t"<<
  63. my_total<<" events \n\t\taverage "<<(double)my_total/segments.size()<<
  64. " ev/trace \tmin "<< min_trace<< " \tmax "<<max_trace<<endl<<endl;
  65. else cout<<"no traces found for "<<event_name_string[name]<<endl;
  66. }// end harvest()
  67. //-----------------------------------------------------
  68. void Event_producer::print_event(){
  69. cout<< " Event " << event_name_string[name] << " \ttype= " << event_type_string[type]
  70. <<endl;
  71. }
  72. void Composite_event_instance::print_event(){
  73. cout<< " Event " << event_name_string[name] << " \ttype= " << event_type_string[type] <<
  74. " index= "<< index<< endl;
  75. }
  76. //------------- debugging print subroutines -----------------
  77. void show_map(pair_list &x){
  78. for(multimap<int, int>:: iterator q = x.begin(); q != x.end(); q++){
  79. cout<<" ("<< q->first<<", "<<q->second<<")\n";
  80. }
  81. }
  82. //----------------------------------------------------------
  83. void Composite_producer::show_traces(){
  84. cout<< "\nTotal "<< segments.size()<< " traces for Composite "<< event_name_string[name] << endl;
  85. cout<<"=========================\n";
  86. for(int k =0; k < segments.size(); k++){
  87. cout<< "trace #"<< k+1 <<" with " << segments[k].size() << " events\n";
  88. for(int i = 0; i < segments[k].size(); i++){
  89. cout<<'('<< i << ") ";
  90. segments[k][i] ->print_event();
  91. }
  92. multimap <int, int>:: iterator p;
  93. cout<<"\n FOLLOWS list for trace #"<< k+1<<endl;
  94. for(p = follows_lists[k].begin(); p != follows_lists[k].end(); p++){
  95. cout<< " "<< p->first<< " follows "<< p->second<<endl;
  96. }
  97. cout<<"\n IN list for trace #"<< k+1<<endl;
  98. for(p = inside_lists[k].begin(); p != inside_lists[k].end(); p++){
  99. cout<< " "<< p->first<< " inside "<< p->second<<endl;
  100. }
  101. cout<<"\n EQUALS list for trace #"<< k+1<<endl;
  102. for(p = equals_lists[k].begin(); p != equals_lists[k].end(); p++){
  103. cout<< " "<< p->first<< " equals "<< p->second<<endl;
  104. }
  105. cout<<endl;
  106. }
  107. }
  108. //-----------------------------------------------------------
  109. void Composite_producer::output_JSON(){
  110. string comma, comma2;
  111. JSON<< "{\"traces\":[" << endl;
  112. comma2 = "";
  113. for(int kk =0; kk < segments.size(); kk++){
  114. JSON<< comma2;
  115. comma2 = ",\n";
  116. JSON<< "[["; // start trace and event list
  117. // in preparation for equality cleaning
  118. int len = segments[kk].size();
  119. int matrix_len = len * len;
  120. char eq_matrx[matrix_len];
  121. char invalid[len]; // list of invalidated events
  122. for(int j = 0; j < matrix_len; j++){
  123. eq_matrx[j] = 0;
  124. }
  125. for(int j = 0; j < len; j++){
  126. invalid[j] = 0;
  127. }
  128. invalid[0] = 1;// invalidate the main schema event
  129. multimap <int, int>:: iterator p;
  130. multimap <int, int>:: iterator q = equals_lists[kk].end();
  131. // fill eq_matrx
  132. for(p = equals_lists[kk].begin(); p != q; p++){
  133. eq_matrx[p->first * len + p->second ] =
  134. eq_matrx[p->second * len + p->first ] = 1;
  135. }
  136. // transitive closure is based on Floyd-Warshall algorithm
  137. // [Cormen et al. 3rd Edition, pp.699]
  138. //--------------------------------------------------------------
  139. for(int t = 0; t < len; t++){
  140. for(int i = 0; i < len; i++){
  141. for(int j = 0; j < len; j++){
  142. eq_matrx[i * len + j] =
  143. eq_matrx[i * len + j] ||
  144. (eq_matrx[i * len + t] && eq_matrx[t * len + j]);
  145. }
  146. }
  147. }
  148. // fill the list of invalidated events
  149. // all but earliest equal are marked by 1
  150. for(int k = 1; k < len; k++){
  151. if(invalid[k]) continue;
  152. for(int i = 1; i < len; i++){
  153. if(eq_matrx[k * len + i] && k != i){
  154. invalid[i] = 1;
  155. }
  156. }
  157. }
  158. // print event list
  159. comma = "";
  160. for(int i = 1; i < len; i++){
  161. if(!invalid[i]){
  162. JSON<< comma;
  163. comma = ",";
  164. JSON<<"[\""<< // start event pair
  165. event_name_string[segments[kk][i] ->name]<<"\",\"";
  166. switch(segments[kk][i] ->type){
  167. case Composite_event_instance_node:
  168. JSON<<'C'; break;
  169. case Atom:
  170. JSON<<'A'; break;
  171. case ROOT_node:
  172. JSON<<'R'; break;
  173. case Schema_node:
  174. JSON<<'S'; break;
  175. default: JSON<< "unknown event type: "<< segments[kk][i] ->type;
  176. }
  177. JSON<<"\","<<i<<"]"; // end event pair
  178. }
  179. }
  180. JSON<<"],\n["; // end event list and start inside list
  181. // print IN relations
  182. int prev_first, prev_second; // to avoid duplications
  183. comma = "";
  184. prev_first = prev_second = -1;
  185. for(p = inside_lists[kk].begin(); p != inside_lists[kk].end(); p++){
  186. if(!invalid[p->first] && !invalid[p->second] &&
  187. !(p->first == prev_first && p->second == prev_second)){
  188. JSON<< comma;
  189. comma = ",";
  190. JSON<< "["<< p->first<< ","<< p->second<<"]";
  191. prev_first = p->first;
  192. prev_second = p->second;
  193. }
  194. }
  195. JSON<<"],\n["; // end inside list and start follows list
  196. // print FOLLOWS relations
  197. comma = "";
  198. prev_first = prev_second = -1;
  199. for(p = follows_lists[kk].begin(); p != follows_lists[kk].end(); p++){
  200. if(!invalid[p->first] && !invalid[p->second] &&
  201. !(p->first == prev_first && p->second == prev_second)){
  202. JSON<< comma;
  203. comma = ",";
  204. JSON<< "["<< p->first<< ","<< p->second<<"]";
  205. prev_first = p->first;
  206. prev_second = p->second;
  207. }
  208. }
  209. JSON<<"]]"; // end follows list and trace
  210. }
  211. JSON<<"]}"<<endl;
  212. }