/* * mp2_print_subroutines.h * * Created by Mike Auguston on 02/05/15. * last modified 03/22/15 */ //======================================= // this declaration uses Event_name enum // it is a single object referred when needed by containers // does not leave anything on the trace Empty_producer Dummy(Dummy_event); //======================================= // print uses event_name_string[] //----------------------------------------- void Composite_producer::harvest(){ // calls traverse to fill the segments list Traversal_result result; int my_total = 0; int min_trace = 10000000; int max_trace = 0; do { // reset Stack and relation lists to start new trace assembly Stack.clear(); Follows.clear(); Inside.clear(); Equals.clear(); tails.clear(); heads.clear(); // prepare stacks for traversal predecessor.clear(); predecessor.push_back(-1); // no predecessor for the event at beginning of a segment // it will be brought by containers in add_relations_for_leader() // add a Composite event instance event to the trace: name, index, and length // the length of segment will be adjusted later Stack.push_back(new Composite_event_instance(name, segments.size())); Stack[0]->type = target_event; result = traverse(); // fills the Stack and relation lists // relations are assembled/processed in the container objects predecessor.pop_back(); // restore ordering for the previous nesting level if(result == failed){ if(completeness_count == element_count) break; // there are no more options to try else continue; } // store the assembled segment, its relation lists and event stats segments.push_back(Stack); follows_lists.push_back(Follows); inside_lists.push_back(Inside); equals_lists.push_back(Equals); // do statistics: for total number of events stored <<<<<<<<<<<< int segment_len = Stack.size(); total_events += segment_len; my_total += segment_len; if(segment_len < min_trace) min_trace = segment_len; if(segment_len > max_trace) max_trace = segment_len; storage += (sizeof Stack) + sizeof(Event_producer_ref) * segment_len + 3 * sizeof(pair_list) + sizeof (pair) * (Follows.size() + Inside.size() + Equals.size()); } while(result != success_and_completed); if(segments.size()) cout<<"completed "<first<<", "<second<<")\n"; } } //---------------------------------------------------------- void Composite_producer::show_traces(){ cout<< "\nTotal "<< segments.size()<< " traces for Composite "<< event_name_string[name] << endl; cout<<"=========================\n"; for(int k =0; k < segments.size(); k++){ cout<< "trace #"<< k+1 <<" with " << segments[k].size() << " events\n"; for(int i = 0; i < segments[k].size(); i++){ cout<<'('<< i << ") "; segments[k][i] ->print_event(); } multimap :: iterator p; cout<<"\n FOLLOWS list for trace #"<< k+1<first<< " follows "<< p->second<first<< " inside "<< p->second<first<< " equals "<< p->second<:: iterator p; multimap :: iterator q = equals_lists[kk].end(); // fill eq_matrx for(p = equals_lists[kk].begin(); p != q; p++){ eq_matrx[p->first * len + p->second ] = eq_matrx[p->second * len + p->first ] = 1; } // transitive closure is based on Floyd-Warshall algorithm // [Cormen et al. 3rd Edition, pp.699] //-------------------------------------------------------------- for(int t = 0; t < len; t++){ for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ eq_matrx[i * len + j] = eq_matrx[i * len + j] || (eq_matrx[i * len + t] && eq_matrx[t * len + j]); } } } // fill the list of invalidated events // all but earliest equal are marked by 1 for(int k = 1; k < len; k++){ if(invalid[k]) continue; for(int i = 1; i < len; i++){ if(eq_matrx[k * len + i] && k != i){ invalid[i] = 1; } } } // print event list comma = ""; for(int i = 1; i < len; i++){ if(!invalid[i]){ JSON<< comma; comma = ","; JSON<<"[\""<< // start event pair event_name_string[segments[kk][i] ->name]<<"\",\""; switch(segments[kk][i] ->type){ case Composite_event_instance_node: JSON<<'C'; break; case Atom: JSON<<'A'; break; case ROOT_node: JSON<<'R'; break; case Schema_node: JSON<<'S'; break; default: JSON<< "unknown event type: "<< segments[kk][i] ->type; } JSON<<"\","<first] && !invalid[p->second] && !(p->first == prev_first && p->second == prev_second)){ JSON<< comma; comma = ","; JSON<< "["<< p->first<< ","<< p->second<<"]"; prev_first = p->first; prev_second = p->second; } } JSON<<"],\n["; // end inside list and start follows list // print FOLLOWS relations comma = ""; prev_first = prev_second = -1; for(p = follows_lists[kk].begin(); p != follows_lists[kk].end(); p++){ if(!invalid[p->first] && !invalid[p->second] && !(p->first == prev_first && p->second == prev_second)){ JSON<< comma; comma = ","; JSON<< "["<< p->first<< ","<< p->second<<"]"; prev_first = p->first; prev_second = p->second; } } JSON<<"]]"; // end follows list and trace } JSON<<"]}"<