|
From: <ma...@us...> - 2010-09-03 14:15:27
|
Revision: 871
http://scstudio.svn.sourceforge.net/scstudio/?rev=871&view=rev
Author: madzin
Date: 2010-09-03 14:15:21 +0000 (Fri, 03 Sep 2010)
Log Message:
-----------
new time membership algorithm
Modified Paths:
--------------
trunk/src/membership/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/tests/membership/CMakeLists.txt
Modified: trunk/src/membership/CMakeLists.txt
===================================================================
--- trunk/src/membership/CMakeLists.txt 2010-09-03 14:12:59 UTC (rev 870)
+++ trunk/src/membership/CMakeLists.txt 2010-09-03 14:15:21 UTC (rev 871)
@@ -8,6 +8,7 @@
TARGET_LINK_LIBRARIES(scmembership
scmsc
scpseudocode
+ sctime
)
INSTALL(TARGETS scmembership
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-09-03 14:12:59 UTC (rev 870)
+++ trunk/src/membership/membership_alg.cpp 2010-09-03 14:15:21 UTC (rev 871)
@@ -24,6 +24,8 @@
*/
#include "membership/membership_alg.h"
+#include "check/time/time_pseudocode.h"
+#include "check/time/tightening.h"
#include <limits>
#include <map>
@@ -44,7 +46,9 @@
//identification for receive events
int max_id;
+
BMscPtr global_bmsc;
+BMscIntervalSetMatrix* time_matrix;
InstancePtr find_instance(InstancePtrList instances, std::wstring name);
@@ -219,6 +223,11 @@
void remove_events_attributes(std::vector<Event*> vec);
/*
+ * return matrix of time intervals among each nodes
+ */
+BMscIntervalSetMatrix get_bmsc_matrix(BMscPtr bmsc_f);
+
+/*
* Returns precondition list of the membership algorithm
*/
Checker::PreconditionList MembershipAlg::get_preconditions(MscPtr msc) const
@@ -294,6 +303,10 @@
*/
+ //get time matrix
+ BMscIntervalSetMatrix time_matrix2 = get_bmsc_matrix(bmsc_f);
+ time_matrix = &time_matrix2;
+
//creates configuration of defined bMSC
ConfigurationPtr searched_conf = new Configuration(bmsc_f->get_instances());
@@ -1040,77 +1053,48 @@
return compare_events_time_relations(a,b);
}
-//parameters node_e, b_e
-bool compare_events_time_relations(Event* a, Event* b)
+bool compare_events_time_relations(Event* node_a, Event* bmsc_a)
{
- TimeRelationEventPtrList node_intervals = a->get_time_relations();
+ TimeRelationEventPtrList node_intervals = node_a->get_time_relations();
TimeRelationEventPtrList::iterator it;
- int time_b_id;
+ int time_node_b_id;
for(it = node_intervals.begin(); it != node_intervals.end(); it++)
{
- if((*it)->get_event_a() == a)
+ if((*it)->get_event_a() == node_a)
{
- bool time_b_id_set = true;
+ bool time_node_b_id_set = true;
- time_b_id = (*it)->get_event_b()->get_attribute("identification", -1, time_b_id_set);
+ time_node_b_id = (*it)->get_event_b()->get_attribute("identification", -1, time_node_b_id_set);
- if(time_b_id_set)
+ if(time_node_b_id_set)
{
std::cerr << "Error: Unexpected behaviour 3" << std::endl;
return false;
}
- Event* bmsc_b_event = find_event_on_instance_by_id((*it)->get_event_b()->get_instance()->get_label(), time_b_id);
+ Event* bmsc_b = find_event_on_instance_by_id((*it)->get_event_b()->get_instance()->get_label(), time_node_b_id);
- if(bmsc_b_event == NULL)
+ if(bmsc_b == NULL)
return false;
- TimeRelationEventPtrList time_a_intervals = b->get_time_relations();
- TimeRelationEventPtrList time_b_intervals = bmsc_b_event->get_time_relations();
-
- if(time_a_intervals.size() == 0 || time_b_intervals.size() == 0)
- {
- std::cerr << "Error: Events in bmsc has to have time relation." << std::endl;
- return false;
- }
+ MscTimeIntervalSetD result, hmsc_inter, bmsc_inter;
- MscTimeIntervalSetD time_a_set = time_a_intervals.front()->get_interval_set();
- MscTimeIntervalSetD time_b_set = time_b_intervals.front()->get_interval_set();
-
- if(time_a_set.is_empty() || time_b_set.is_empty())
- {
- std::cerr << "Error: Time interval is corrupted" << std::endl;
- return false;
- }
-
- MscTimeInterval<double> a_interval = time_a_set.get_set().front();
- MscTimeInterval<double> b_interval = time_b_set.get_set().front();
+ hmsc_inter = (*it)->get_interval_set();
+ bmsc_inter = time_matrix->operator()(bmsc_a, bmsc_b);
+ result = MscTimeIntervalSetD::set_intersection(hmsc_inter, bmsc_inter);
- double a_time = a_interval.get_begin_value();
- double b_time = b_interval.get_begin_value();
-
-//TODO skontrolovat, nepaci sa mi ze by sa na evente z HMSC nastavovala nula
- if(time_a_intervals.size() > 1)
- a_time = 0;
-
- if(time_b_intervals.size() > 1)
- b_time = 0;
-
- double bmsc_inter = b_time - a_time;
-
- MscTimeIntervalSetD hmsc_inter = (*it)->get_interval_set();
- MscTimeIntervalSetD result, bmsc_inter_set;
-
- //adds MscTimeInterval of bmsc_inter to bmsc_inter_set without memory leak (throught shared pointer)
- bmsc_inter_set.insert(*(boost::shared_ptr<MscTimeInterval<double> >(new MscTimeInterval<double> (bmsc_inter))));
- result = MscTimeIntervalSetD::set_intersection(hmsc_inter, bmsc_inter_set);
-
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;
+ }
}
}
-
+
return true;
}
@@ -2084,6 +2068,20 @@
for(it = vec.begin(); it != vec.end(); it++)
(*it)->remove_attribute<int>("identification");
+}
- //vec.clear();
+BMscIntervalSetMatrix get_bmsc_matrix(BMscPtr bmsc_f)
+{
+ //matrix context inicialization
+ BMscIntervalSetMatrix matrix(bmsc_f);
+ //create matrix
+ matrix.build_up();
+
+ MscSolveTCSP solve;
+ //tight the matrix
+ MscSolveTCSPReport report = solve.solveTCSP(matrix);
+ //get the result of the tightening
+ matrix = report.m_matrix_result;
+
+ return matrix;
}
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-09-03 14:12:59 UTC (rev 870)
+++ trunk/tests/membership/CMakeLists.txt 2010-09-03 14:15:21 UTC (rev 871)
@@ -185,13 +185,13 @@
ADD_TEST(membership_test-78 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/time_cycleWithEmpty_neg_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/time_cycleWithEmpty_neg_pat.mpr 0)
-ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_1.mpr 1)
+ADD_TEST(membership_test-79 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_1.mpr 1)
-ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_2.mpr 1)
+ADD_TEST(membership_test-80 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_2.mpr 1)
-ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_3.mpr 0)
+ADD_TEST(membership_test-81 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_3.mpr 0)
-ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_4.mpr 0)
+ADD_TEST(membership_test-82 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc28_4.mpr 0)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|