|
From: <ma...@us...> - 2010-09-14 23:32:09
|
Revision: 926
http://scstudio.svn.sourceforge.net/scstudio/?rev=926&view=rev
Author: madzin
Date: 2010-09-14 23:32:02 +0000 (Tue, 14 Sep 2010)
Log Message:
-----------
repair membership time algorithm
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/coregion_minimal_pat2.mpr
trunk/tests/membership/coregion_minimal_pat3.mpr
trunk/tests/membership/membership_test.cpp
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-09-14 21:03:53 UTC (rev 925)
+++ trunk/src/membership/membership_alg.cpp 2010-09-14 23:32:02 UTC (rev 926)
@@ -29,6 +29,9 @@
#include <limits>
#include <map>
+//MembershipAlg object to be albe to use print_report
+MembershipAlg* mem;
+
// map of bmsc names and configurations which were checked
std::map<std::wstring, std::set<ConfigurationPtr> > checked;
@@ -193,6 +196,8 @@
//TODO skontrolovat co to vlastne robi, a kde kontrolujem casove obmedzenia v ramci bMSC z dajakeho HMSC nodu
bool check_node_time(ReferenceNodePtr node, ConfigurationPtr conf);
+bool check_node_time_themself(const std::vector<TimeRelationRefNodePtr>& themself_vec, ReferenceNodePtr node, ConfigurationPtr conf);
+
/*
* finds the maximum event of HMSC node and returns time interval value of matching event in bMSC
*/
@@ -212,7 +217,7 @@
/*
* compare absolut position, is the fist parameter before (more minimal) than the second
*
- * return: 0 - it is not decideable
+ * return: 0 - it is not decidable
* 1 - the fist is before the second
* 2 - the second is before the first
*/
@@ -221,14 +226,9 @@
/*
* returns the last event on instance
*/
-std::vector<Event*> get_last_instance_event(Event* start);
+Event* get_last_instance_event(Event* start);
/*
- * returns maximal events of coregion area
- */
-std::vector<Event*> get_last_coregion_events(CoregionArea* cor);
-
-/*
* compares events time relations
*
* paramterers: a - HMSC node
@@ -255,6 +255,13 @@
BMscIntervalSetMatrix get_bmsc_matrix(BMscPtr bmsc_f);
/*
+ *
+ */
+void update_maximum_set(std::set<Event*>& max, Event* new_element);
+
+void update_minimum_set(std::set<Event*>& min, Event* new_element);
+
+/*
* Returns precondition list of the membership algorithm
*/
Checker::PreconditionList MembershipAlg::get_preconditions(MscPtr msc) const
@@ -268,6 +275,8 @@
*/
MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc)
{
+ mem = this;
+
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc > (msc);
BMscPtr bmsc_f = boost::dynamic_pointer_cast<BMsc > (bmsc);
@@ -542,7 +551,7 @@
bool strict_coregion(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
CoregionAreaPtr b_coregion, std::vector<Event*>& b_events)
{
- std::cerr << "unsuported function: finded bMSC cannot contain coregion" << std::endl;
+ mem->print_report(RS_ERROR, L"unsuported function: finded bMSC cannot contain coregion");
return false;
/* if(b_events.size() > 1)
@@ -619,7 +628,7 @@
if(cor == NULL)
{
- std::cerr << "Error: Unexpected behaviour 98" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: Unexpected behaviour 98");
return false;
}
@@ -840,8 +849,12 @@
}
}
+ //when the coregion area describes more that the appropriate strict area
if(b_e->get_successor() == NULL)
- std::cerr << "Error: unexpected behaviour" << std::endl;
+ {
+ b_events.clear();
+ return true;
+ }
b_e = b_e->get_successor().get();
@@ -919,7 +932,7 @@
bool coregion_coretion(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
CoregionAreaPtr b_coregion, std::vector<Event*>& b_events)
{
- std::cerr << "unsuported function: finded bMSC cannot contain coregion" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: unsuported function (bMSC flow cannot contain coregion");
return false;
/*
@@ -1133,7 +1146,7 @@
else
if(result != bmsc_inter)
{
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
+mem->print_report(RS_WARNING, L"Warning: the HMSC interval do not cover whole bMSC interval");
return false;
}
}
@@ -1175,7 +1188,7 @@
//function finds event only in bMSC which is looked for, so coregion area is not allowed
if(str == NULL)
{
- std::cerr << "Error: bMSC which is looked for contains coregion area" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: bMSC which is looked for contains coregion area");
return NULL;
}
@@ -1203,7 +1216,7 @@
if(strict == NULL)
{
- std::cerr << "Error: Node was not found" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: Node was not found");
return NULL;
}
@@ -1211,7 +1224,7 @@
if(str == NULL)
{
- std::cerr << "Error: Node was not found" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: Node was not found");
return NULL;
}
}
@@ -1545,8 +1558,7 @@
if (bmsc == NULL)
{
-// print_report(RS_ERROR, stringize() << "Error: Some reference node does not refers to bMSC");
- std::cerr << "Error: Some reference node does not refers to bMSC." << std::endl;
+ mem->print_report(RS_ERROR, L"Error: Some reference node does not refers to bMSC");
return false;
}
@@ -1758,44 +1770,8 @@
if(!themself_vec.empty())
{
- if(themself_vec.size() > 1)
- {
- std::cerr << "Error: more time intervals between top and bottom of one reference node" << std::endl;
+ if(!check_node_time_themself(themself_vec, node, conf))
return false;
- }
-
- min_a = get_min_event(conf);
- max_b = get_max_event(node, conf);
-
- if(min_a == NULL || max_b == NULL)
- {
- std::cerr << "Error: unexpected behaviour" << std::endl;
- return false;
- }
-
- TimeRelationRefNodePtr relation = themself_vec.front();
-
- if(relation == NULL)
- {
- std::cout<<"Error: Unexpected program's behaviour"<<std::endl;
- return false;
- }
-
- MscTimeIntervalSetD result, hmsc_inter, bmsc_inter;
-
- hmsc_inter = relation->get_interval_set();
- bmsc_inter = time_matrix->operator()(min_a, max_b);
-
- result = MscTimeIntervalSetD::set_intersection(hmsc_inter, bmsc_inter);
-
- if(result.is_empty())
- return false;
- else
- if(result != bmsc_inter)
- {
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
- return false;
- }
}
if(!top_vec.empty())
@@ -1829,7 +1805,7 @@
else
if(result != bmsc_inter)
{
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
+mem->print_report(RS_ERROR, L"Warning: the HMSC interval do not cover whole bMSC interval");
return false;
}
@@ -1855,7 +1831,7 @@
else
if(result != bmsc_inter_set)
{
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
+mem->print_report(RS_ERROR, L"Warning: the HMSC interval do not cover whole bMSC interval");
return false;
}
}
@@ -1884,7 +1860,7 @@
else
if(result != bmsc_inter_set)
{
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
+mem->print_report(RS_ERROR, L"Warning: the HMSC interval do not cover whole bMSC interval");
return false;
}
}
@@ -1909,7 +1885,7 @@
else
if(result != bmsc_inter_set)
{
-std::cerr << "Warning: the HMSC interval do not cover whole bMSC interval" << std::endl;
+mem->print_report(RS_ERROR, L"Warning: the HMSC interval do not cover whole bMSC interval");
return false;
}
}
@@ -1919,6 +1895,59 @@
}
+bool check_node_time_themself(const std::vector<TimeRelationRefNodePtr>& themself_vec, ReferenceNodePtr node, ConfigurationPtr conf)
+{
+ Event* min_a = NULL;
+ Event* max_b = NULL;
+
+ if(themself_vec.size() > 1)
+ {
+ mem->print_report(RS_ERROR, L"Error: more time intervals between top and bottom of one reference node");
+ return false;
+ }
+
+ min_a = get_min_event(conf);
+ max_b = get_max_event(node, conf);
+
+ if(min_a == NULL || max_b == NULL)
+ {
+ if(min_a == NULL)
+ mem->print_report(RS_ERROR, stringize() << L"Error: not decidable which event is the minimal one of the "
+ << node->get_msc()->get_label() << L" node");
+ else
+ mem->print_report(RS_ERROR, stringize() << "Error: not decidable which event is the maximal one of the "
+ << node->get_msc()->get_label() << " node");
+
+ return false;
+ }
+
+ TimeRelationRefNodePtr relation = themself_vec.front();
+
+ if(relation == NULL)
+ {
+ mem->print_report(RS_ERROR, L"Error: Unexpected program's behaviour");
+ return false;
+ }
+
+ MscTimeIntervalSetD result, hmsc_inter, bmsc_inter;
+
+ hmsc_inter = relation->get_interval_set();
+ bmsc_inter = time_matrix->operator()(min_a, max_b);
+
+ result = MscTimeIntervalSetD::set_intersection(hmsc_inter, bmsc_inter);
+
+ if(result.is_empty())
+ return false;
+ else
+ if(result != bmsc_inter)
+ {
+mem->print_report(RS_ERROR, L"Warning: the HMSC interval do not cover whole bMSC interval");
+ return false;
+ }
+
+ return true;
+}
+
Event* get_min_event(ConfigurationPtr conf)
{
std::set<PositionPtr> positions = conf->get_positions();
@@ -1941,7 +1970,7 @@
if(cor == NULL)
{
- std::cerr << "Error: unexpected behaviour" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: unexpected behaviour 406");
return NULL;
}
@@ -1967,8 +1996,8 @@
{
case 0: min.insert(pos_min[i]); break;
case 1: break;
- case 2: min.clear(); min.insert(pos_min[i]); break;
- default: std::cerr << "Error: unexpected behaviour" << std::endl;
+ case 2: update_minimum_set(min, pos_min[i]); break;
+ default: mem->print_report(RS_ERROR, L"Error: unexpected behaviour 407");
}
}
@@ -2032,8 +2061,8 @@
{
case 0: max.insert(pos_max[i]); break;
case 1: break;
- case 2: max.clear(); max.insert(pos_max[i]); break;
- default: std::cerr << "Error: unexpected behaviour" << std::endl;
+ case 2: update_maximum_set(max, pos_max[i]); break;
+ default: std::cerr << "Error: unexpected behaviour 408" << std::endl;
}
}
@@ -2043,10 +2072,58 @@
return *(max.begin());
}
+void update_maximum_set(std::set<Event*>& max, Event* new_element)
+{
+ std::set<Event*> to_delete;
+ std::set<Event*>::iterator it;
+
+ for(it = max.begin(); it != max.end(); it++)
+ {
+ switch (compare_absolut_position(new_element, *it))
+ {
+ case 0: break;
+ case 1: break;
+ case 2: to_delete.insert(*it); break;
+ default: std::cerr << "Error: unexpected behaviour 408" << std::endl;
+ }
+ }
+
+ for(it = to_delete.begin(); it != to_delete.end(); it++)
+ {
+ max.erase(*it);
+ }
+
+ max.insert(new_element);
+}
+
+void update_minimum_set(std::set<Event*>& min, Event* new_element)
+{
+ std::set<Event*> to_delete;
+ std::set<Event*>::iterator it;
+
+ for(it = min.begin(); it != min.end(); it++)
+ {
+ switch (compare_absolut_position(*it, new_element))
+ {
+ case 0: break;
+ case 1: break;
+ case 2: to_delete.insert(*it); break;
+ default: std::cerr << "Error: unexpected behaviour 408" << std::endl;
+ }
+ }
+
+ for(it = to_delete.begin(); it != to_delete.end(); it++)
+ {
+ min.erase(*it);
+ }
+
+ min.insert(new_element);
+}
+
/*
* compare absolut position, is the fist parameter before (more minimal) than the second
*
- * return: 0 - it is not decideable
+ * return: 0 - it is not decidable
* 1 - the fist is before the second
* 2 - the second is before the first
* 3 - error
@@ -2054,27 +2131,29 @@
int compare_absolut_position(Event* first, Event* second)
{
MscTimeIntervalSetD inter = time_matrix->operator()(first, second);
+
const IntervalList intervals = inter.get_set();
bool positive = false;
bool negative = false;
IntervalList::const_iterator it;
- //in interval [0], positive and negative are not set => negative == positive => undecidable
for(it = intervals.begin(); it != intervals.end(); it++)
{
- if(it->get_begin_value() > 0
- || (it->get_begin_value() == 0 && !it->get_begin_closed()))
- {
+ if(((abs(it->get_begin_value()) == 0 && it->get_begin_closed()))
+ || ((abs(it->get_end_value()) == 0 && it->get_end_closed())))
+ return 2;
+
+ if(it->get_begin_value() >= 0)
positive = true;
- }
- if(it->get_begin_value() < 0) negative = true;
+ if(it->get_begin_value() < 0)
+ negative = true;
- if(it->get_end_value() > 0) positive = true;
+ if(it->get_end_value() > 0)
+ positive = true;
- if(it->get_end_value() < 0
- || (it->get_end_value() == 0 && !it->get_end_closed()))
+ if(it->get_end_value() <= 0)
{
negative = true;
}
@@ -2099,14 +2178,14 @@
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
if(bmsc == NULL)
- std::cerr << "Error: Unexpected behaviur 35" << std::endl;
+ mem->print_report(RS_ERROR, L"Error: Unexpected behaviur 35");
InstancePtrList instances = bmsc->get_instances();
InstancePtrList::iterator inst_it;
//name of instance, event identification
std::map<std::wstring, std::vector<int> > node_last_events;
- EventPtr start;
+ EventPtr start = NULL;
EventArea* area;
StrictOrderArea* strict;
CoregionArea* cor;
@@ -2120,9 +2199,7 @@
{
start = strict->get_first();
std::vector<int> identifications;
- std::vector<Event*> e_set = get_last_instance_event(start.get());
-//TODO dopracovat coregiony
- Event* e = e_set.front();
+ Event* e = get_last_instance_event(start.get());
if(e == NULL)
continue;
@@ -2143,19 +2220,43 @@
if(cor != NULL)
{
- std::cout << "Coregion time intervals: This funcion is not currently supported." << std::endl;
+ start = cor->get_minimal_events().front();
+ std::map<CoregionAreaPtr, CoregionOrderingPtr>::iterator cor_order_it;
+ cor_order_it = coregion_ordering.find(cor);
+
+ if(cor_order_it == coregion_ordering.end())
+ {
+ mem->print_report(RS_ERROR, L"Error: unexpected behaviour");
+ return node_last_events;
+ }
+
+ start = cor_order_it->second->getOrdering().front();
+ std::vector<int> identifications;
+ Event* e = get_last_instance_event(start.get());
+
+ if(e == NULL)
+ continue;
+
+ int it_id;
+ bool it_set = true;
+
+ it_id = e->get_attribute("identification", -1, it_set);
+
+ if(!it_set)
+ identifications.push_back(it_id);
+
+ node_last_events.insert(std::make_pair((*inst_it)->get_label(), identifications));
}
}
return node_last_events;
}
-std::vector<Event*> get_last_instance_event(Event* start)
+Event* get_last_instance_event(Event* start)
{
- std::vector<Event*> result;
if(start == NULL)
- return result;
+ return NULL;
EventArea* area = start->get_general_area();
EventArea* not_null_area = area;
@@ -2183,28 +2284,22 @@
cor = dynamic_cast<CoregionArea*>(not_null_area);
if(str != NULL)
+ return str->get_last().get();
+ if(cor != NULL)
{
- result.push_back(str->get_last().get());
- return result;
+ std::map<CoregionAreaPtr, CoregionOrderingPtr>::iterator cor_ord_it;
+
+ cor_ord_it = coregion_ordering.find(cor);
+
+ if(cor_ord_it != coregion_ordering.end())
+ {
+ return cor_ord_it->second->getOrdering().back().get();
+ }
+ else
+ return NULL;
}
- else
- return get_last_coregion_events(cor);
-}
-std::vector<Event*> get_last_coregion_events(CoregionArea* cor)
-{
- std::vector<Event*> result;
-
- CoregionEventPVector vec = cor->get_maximal_events();
- CoregionEventPVector::iterator it;
-
- for(it = vec.begin(); it != vec.end(); it++)
- {
- EventPtr e = *it;
- result.push_back(e.get());
- }
-
- return result;
+ return NULL;
}
void remove_events_attributes(std::vector<Event*> vec)
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-09-14 21:03:53 UTC (rev 925)
+++ trunk/tests/membership/CMakeLists.txt 2010-09-14 23:32:02 UTC (rev 926)
@@ -215,4 +215,19 @@
ADD_TEST(membership_test-92 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/time_hard_bmsc05.mpr ${CMAKE_CURRENT_SOURCE_DIR}/time_hard_bmsc_pat02.mpr 0)
#coregion minimal
-ADD_TEST(membership_test-93 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat1.mpr 1)
+ADD_TEST(membership_test-93 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat1.mpr 0)
+
+ADD_TEST(membership_test-94 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat2.mpr 0)
+
+ADD_TEST(membership_test-95 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat3.mpr )
+
+ADD_TEST(membership_test-96 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat4.mpr )
+
+ADD_TEST(membership_test-97 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat5.mpr 1)
+
+ADD_TEST(membership_test-98 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat6.mpr 1)
+
+ADD_TEST(membership_test-99 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat7.mpr 1)
+
+ADD_TEST(membership_test-100 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal.mpr ${CMAKE_CURRENT_SOURCE_DIR}/coregion_minimal_pat8.mpr 0)
+
Modified: trunk/tests/membership/coregion_minimal_pat2.mpr
===================================================================
--- trunk/tests/membership/coregion_minimal_pat2.mpr 2010-09-14 21:03:53 UTC (rev 925)
+++ trunk/tests/membership/coregion_minimal_pat2.mpr 2010-09-14 23:32:02 UTC (rev 926)
@@ -26,8 +26,3 @@
in Ping_pong,2 from B;
endinstance;
endmsc;
-msc Page_1;
-initial connect L0;
-L0: reference NAME connect L1;
-L1: final;
-endmsc;
Modified: trunk/tests/membership/coregion_minimal_pat3.mpr
===================================================================
--- trunk/tests/membership/coregion_minimal_pat3.mpr 2010-09-14 21:03:53 UTC (rev 925)
+++ trunk/tests/membership/coregion_minimal_pat3.mpr 2010-09-14 23:32:02 UTC (rev 926)
@@ -27,8 +27,3 @@
in Ping_pong,2 from B;
endinstance;
endmsc;
-msc Page_1;
-initial connect L0;
-L0: reference NAME connect L1;
-L1: final;
-endmsc;
Modified: trunk/tests/membership/membership_test.cpp
===================================================================
--- trunk/tests/membership/membership_test.cpp 2010-09-14 21:03:53 UTC (rev 925)
+++ trunk/tests/membership/membership_test.cpp 2010-09-14 23:32:02 UTC (rev 926)
@@ -98,6 +98,7 @@
char *filename = extract_filename(argv[1]);
MembershipAlg mem;
+ mem.set_printer(&printer);
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc_b[0]);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|