|
From: <tm...@us...> - 2013-03-22 09:12:20
|
Revision: 1729
http://sourceforge.net/p/scstudio/code/1729
Author: tmarton
Date: 2013-03-22 09:12:16 +0000 (Fri, 22 Mar 2013)
Log Message:
-----------
added basic version of absolute time tightenig
Modified Paths:
--------------
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/Z120/z120_load.cpp
trunk/src/data/dfs_events_traverser.cpp
trunk/src/data/dfs_events_traverser.h
trunk/src/data/time_relevant_ordering/dfs_backward_traverser.cpp
trunk/src/data/time_relevant_ordering/time_order_optimizer.cpp
trunk/src/data/time_relevant_ordering/time_order_optimizer.h
trunk/src/data/time_relevant_ordering/time_relevant_ordering.cpp
trunk/tests/time_relevant_ordering/time_relevant_ordering_test.cpp
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/Z120/CMakeLists.txt 2013-03-22 09:12:16 UTC (rev 1729)
@@ -34,6 +34,7 @@
TARGET_LINK_LIBRARIES(scZ120
scmsc
${PARSER_LIBRARIES}
+ sctimerelevantordering
)
INSTALL(TARGETS scZ120
Modified: trunk/src/data/Z120/z120_load.cpp
===================================================================
--- trunk/src/data/Z120/z120_load.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/Z120/z120_load.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -108,7 +108,7 @@
ImportFormatter::TransformationList Z120::get_transformations(MscPtr msc) const
{
ImportFormatter::TransformationList result;
- result.push_back(L"Beautify");
+ result.push_back(L"TimeRelevantOrdering");
return result;
}
Modified: trunk/src/data/dfs_events_traverser.cpp
===================================================================
--- trunk/src/data/dfs_events_traverser.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/dfs_events_traverser.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -184,6 +184,13 @@
(*l)->on_send_receive_pair(send, receive);
}
+void DFSEventsTraverser::instance_finished(Instance *i)
+{
+ InstanceFinishedListenerPList::iterator l;
+ for(l = instance_finished_listeners.begin(); l != instance_finished_listeners.end(); l++ )
+ (*l)->on_instance_finished(i);
+}
+
MessageEventPListPtr DFSEventsTraverser::topology_order(BMscPtr b)
{
MessageEventPListPtr topology(new MessageEventPList);
Modified: trunk/src/data/dfs_events_traverser.h
===================================================================
--- trunk/src/data/dfs_events_traverser.h 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/dfs_events_traverser.h 2013-03-22 09:12:16 UTC (rev 1729)
@@ -114,12 +114,28 @@
virtual void on_send_receive_pair(MessageEvent* send, MessageEvent* receive)=0;
};
+/**
+ * Listener of finished Instance
+ */
+class InstanceFinishedListener
+{
+public:
+
+ virtual ~InstanceFinishedListener()
+ {
+
+ }
+
+ virtual void on_instance_finished(Instance* i)=0;
+};
+
typedef std::list<EventFinishedListener*> EventFinishedListenerPList;
typedef std::list<WhiteEventFoundListener*> WhiteEventFoundListenerPList;
typedef std::list<GrayEventFoundListener*> GrayEventFoundListenerPList;
typedef std::list<BlackEventFoundListener*> BlackEventFoundListenerPList;
typedef std::list<EventSuccessorListener*> EventSuccessorListenerPList;
typedef std::list<SendReceivePairListener*> SendReceivePairListenerPList;
+typedef std::list<InstanceFinishedListener*> InstanceFinishedListenerPList;
/**
* Processes Events during traversing BMsc's Events in depth first search manner.
@@ -196,6 +212,14 @@
{
send_receive_pair_listeners.push_back(l);
}
+
+ /**
+ * Adds InstanceFinishedListener
+ */
+ void add_instance_fineshed_listener(InstanceFinishedListener* l)
+ {
+ instance_finished_listeners.push_back(l);
+ }
/**
* Cleans up set attributes.
@@ -215,6 +239,7 @@
void remove_event_finished_listeners();
void remove_event_successor_listeners();
void remove_send_receive_pair_listeners();
+ void remove_instance_finished_listeners();
void remove_all_listeners();
protected:
Modified: trunk/src/data/time_relevant_ordering/dfs_backward_traverser.cpp
===================================================================
--- trunk/src/data/time_relevant_ordering/dfs_backward_traverser.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/time_relevant_ordering/dfs_backward_traverser.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -52,9 +52,9 @@
return;
}
- MessageEventPList minimals = area->get_minimal_events();
- for(MessageEventPList::const_iterator min = minimals.begin(); min != minimals.end(); min++)
- traverse_event(*min);
+ MessageEventPSet maximals = area->get_maximal_events();
+ for(MessageEventPSet::const_iterator max = maximals.begin(); max != maximals.end(); max++)
+ traverse_event(*max);
}
void DFSBackwardTraverser::traverse_event(MessageEvent* event)
Modified: trunk/src/data/time_relevant_ordering/time_order_optimizer.cpp
===================================================================
--- trunk/src/data/time_relevant_ordering/time_order_optimizer.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/time_relevant_ordering/time_order_optimizer.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -1,26 +1,74 @@
#include "time_order_optimizer.h"
-#include "math.h"
-double get_absolute_time(MessageEventPtr e)
+
+double get_absolute_endpoint(MessageEventPtr e,bool left_endpoint /* = true*/)
{
if(e == NULL) return NULL_EVENT;
AbsoluteTimePtrList list = e->get_absolut_times();
if(list.size() == 0) return NO_ABSOLUTE_TIME;
AbsoluteTimePtr absolute_time_ptr = list.front();
MscTimeInterval<double> msc_time_interval = absolute_time_ptr->get_interval_set().get_set().front();
- return msc_time_interval.get_begin_value();
+ return left_endpoint ? msc_time_interval.get_begin_value() : msc_time_interval.get_end_value();
}
-bool is_absolute_interval(MessageEventPtr e)
+
+void set_absolute_endpoint(MessageEventPtr e,bool left_endpoint, double endpoint)
{
- if(e == NULL) return false;
+ if(e == NULL) return;
AbsoluteTimePtrList list = e->get_absolut_times();
- if(list.size() == 0) return NO_ABSOLUTE_TIME;
AbsoluteTimePtr absolute_time_ptr = list.front();
MscTimeInterval<double> msc_time_interval = absolute_time_ptr->get_interval_set().get_set().front();
- return msc_time_interval.get_begin_value() != msc_time_interval.get_end_value();
+ MscTimeIntervalSet<double> absolute_time_set;
+ MscIntervalCouple<double> endpoint_couple = MscIntervalCouple<double>(true,endpoint);
+ if(left_endpoint)
+ absolute_time_set.insert(MscTimeInterval<double>(endpoint_couple,msc_time_interval.get_end()));
+ else
+ absolute_time_set.insert(MscTimeInterval<double>(msc_time_interval.get_begin(),endpoint_couple));
+ AbsoluteTime* new_time = new AbsoluteTime(absolute_time_set);
+ AbsoluteTimePtr new_time_ptr = boost::intrusive_ptr<AbsoluteTime>(new_time);
+ list.pop_front();
+ list.push_front(new_time_ptr);
+ e->set_absolut_time(list);
}
+Transformer::PreconditionList AbsoluteTimeTightener::get_preconditions(MscPtr msc) const
+{
+ Transformer::PreconditionList result;
+ // no preconditions
+ return result;
+}
+MscPtr AbsoluteTimeTightener::transform(MscPtr msc)
+{
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ if(bmsc)
+ {
+ DFSEventsTraverser forward_traverser;
+ DFSBackwardTraverser backward_traverser;
+ TightenLeftEndpointListener left_endpoint_listener(true);
+ backward_traverser.add_black_event_found_listener(left_endpoint_listener);
+ backward_traverser.add_event_finished_listener(left_endpoint_listener);
+ backward_traverser.add_instance_finished_listener(left_endpoint_listener);
+ backward_traverser.traverse(bmsc.get());
+ TightenRightEndpointListener right_endpoint_listener;
+ forward_traverser.add_black_event_found_listener(right_endpoint_listener);
+ forward_traverser.add_event_finished_listener(right_endpoint_listener);
+ forward_traverser.add_instance_finished_listener(right_endpoint_listener);
+ forward_traverser.traverse(bmsc.get());
+ return msc;
+ }
+
+ return NULL;
+}
+
+
+
+
+
+
+
+
+
+
Modified: trunk/src/data/time_relevant_ordering/time_order_optimizer.h
===================================================================
--- trunk/src/data/time_relevant_ordering/time_order_optimizer.h 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/time_relevant_ordering/time_order_optimizer.h 2013-03-22 09:12:16 UTC (rev 1729)
@@ -24,8 +24,11 @@
#include "data/beautify/time_transformer.h"
#include "data/msc.h"
#include "data/time.h"
+#include "data/transformer.h"
+#include "math.h"
#include <iostream>
#include <string>
+#include <limits>
#include <map>
#include <set>
@@ -37,9 +40,9 @@
typedef std::map<MessageEventPtr,MscTimeIntervalSet<double> > MissingTimeMap;
-double get_absolute_time(MessageEventPtr e);
+double get_absolute_endpoint(MessageEventPtr e,bool left_endpoint = true);
-bool is_absolute_interval(MessageEventPtr e);
+void set_absolute_endpoint(MessageEventPtr e,bool left_endpoint, double endpoint);
class InstanceWidthComparator
{
@@ -128,42 +131,55 @@
};
//work on timestamps only
-class TimelessEventListener : public EventFinishedListener, public InstanceFinishedListener, public BlackEventFoundListener
+class TightenLeftEndpointListener : public EventFinishedListener, public InstanceFinishedListener, public BlackEventFoundListener
{
public:
- TimelessEventListener():m_black_event_timestamp(-1),m_black_event_interval(0){ }
+ TightenLeftEndpointListener():m_black_event_timestamp(-1),m_black_event_interval(0),m_is_tightened(false){ }
+ TightenLeftEndpointListener(bool is_tightened):m_black_event_timestamp(-1),m_black_event_interval(0),m_is_tightened(is_tightened){ }
+
virtual void on_event_finished(MessageEvent *e)
{
- if(is_absolute_interval(e))
+ double absolute_time = get_absolute_endpoint(e);
+ if((m_black_event_interval != 0) && (absolute_time != NO_ABSOLUTE_TIME) && (absolute_time < m_black_event_interval))
{
- if((m_black_event_interval != 0) && (get_absolute_time(e) < m_black_event_interval))
+ if(m_is_tightened)
{
+ set_absolute_endpoint(e,true,m_black_event_interval);
+ }
+ else
+ {
MscTimeIntervalSet<double> absolute_time_set;
absolute_time_set.insert(MscTimeInterval<double>(m_black_event_interval));
m_missing_time_map[e] = absolute_time_set;
}
+
}
- if(get_absolute_time(e) == NO_ABSOLUTE_TIME)
+
+ if(absolute_time == NO_ABSOLUTE_TIME)
{
double time = ( m_black_event_timestamp < 0) ? 0 : m_black_event_timestamp;
MscTimeIntervalSet<double> absolute_time_set;
absolute_time_set.insert(MscTimeInterval<double>(time));
m_missing_time_map[e] = absolute_time_set;
}
- if(get_absolute_time(e) > m_black_event_timestamp)
- m_black_event_timestamp = get_absolute_time(e);
- if(get_absolute_time(e) > m_black_event_interval)
- m_black_event_interval = get_absolute_time(e);
+ if(absolute_time > m_black_event_timestamp)
+ m_black_event_timestamp = get_absolute_endpoint(e);
+ if(absolute_time > m_black_event_interval)
+ m_black_event_interval = get_absolute_endpoint(e);
}
virtual void on_instance_finished(Instance *i){
m_black_event_timestamp = -1;
+ m_black_event_interval = 0;
}
virtual void on_black_event_found(MessageEvent *e){
- if(get_absolute_time(e) > m_black_event_timestamp)
- m_black_event_timestamp = get_absolute_time(e);
+ double absolute_time = get_absolute_endpoint(e);
+ if(absolute_time > m_black_event_timestamp)
+ m_black_event_timestamp = get_absolute_endpoint(e);
+ if(absolute_time > m_black_event_interval)
+ m_black_event_interval = get_absolute_endpoint(e);
}
const MissingTimeMap& getMissingTimeMap()const{
@@ -175,10 +191,46 @@
private:
double m_black_event_timestamp;
double m_black_event_interval;
+ bool m_is_tightened;
MissingTimeMap m_missing_time_map;
};
+class TightenRightEndpointListener : public EventFinishedListener, public InstanceFinishedListener, public BlackEventFoundListener
+{
+public:
+ TightenRightEndpointListener():m_black_event_interval(std::numeric_limits<double>::infinity()){ }
+
+ TightenRightEndpointListener(bool is_tightened)
+ :m_black_event_interval(std::numeric_limits<double>::infinity()){ }
+
+
+
+ virtual void on_event_finished(MessageEvent *e)
+ {
+ double absolute_time = get_absolute_endpoint(e,false);
+ if((m_black_event_interval != std::numeric_limits<double>::infinity()) && (absolute_time != NO_ABSOLUTE_TIME) && (absolute_time > m_black_event_interval))
+ {
+ set_absolute_endpoint(e,false,m_black_event_interval);
+ }
+ if(absolute_time < m_black_event_interval)
+ m_black_event_interval = absolute_time;
+ }
+
+ virtual void on_instance_finished(Instance *i)
+ {
+ m_black_event_interval = std::numeric_limits<double>::infinity();
+ }
+
+ virtual void on_black_event_found(MessageEvent *e){
+ if(get_absolute_endpoint(e,false) < m_black_event_interval)
+ m_black_event_interval = get_absolute_endpoint(e);
+ }
+
+private:
+ double m_black_event_interval;
+};
+
class TimestampConsistencyListener : public WhiteEventFoundListener
{
public:
@@ -220,10 +272,28 @@
int i;
MissingTimeMap m_missing_time_map;
double getTime(MessageEventPtr e){
- double time = get_absolute_time(e);
+ double time = get_absolute_endpoint(e);
return (time == NO_ABSOLUTE_TIME) ? m_missing_time_map[e].get_set().front().get_begin_value() : time;
}
};
+class AbsoluteTimeTightener : public Transformer
+{
+public:
+ AbsoluteTimeTightener();
+ virtual ~AbsoluteTimeTightener {}
+
+ //! Human readable name of the transformation.
+ virtual std::wstring get_name()
+ { return L"AbsoluteTimeTightener"; }
+
+
+ //! Returns a list of preconditions for this transformation.
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
+ //! Transform a MSC drawing.
+ virtual MscPtr transform(MscPtr msc);
+};
+
#endif // _TIME_ORDER_OPTIMIZER_H
Modified: trunk/src/data/time_relevant_ordering/time_relevant_ordering.cpp
===================================================================
--- trunk/src/data/time_relevant_ordering/time_relevant_ordering.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/src/data/time_relevant_ordering/time_relevant_ordering.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -92,7 +92,7 @@
Beautify b;
// add missing timestamps
- TimelessEventListener timeless_events_listener;
+ TightenLeftEndpointListener timeless_events_listener(true);
backward_traverser.add_event_finished_listener(&timeless_events_listener);
backward_traverser.add_instance_fineshed_listener(&timeless_events_listener);
backward_traverser.add_black_event_found_listener(&timeless_events_listener);
@@ -232,7 +232,7 @@
}
double TimeRelevantOrdering::get_time(MessageEventPtr e){
- double time = get_absolute_time(e);
+ double time = get_absolute_endpoint(e);
return (m_missing_time_map.find(e) != m_missing_time_map.end()) ? m_missing_time_map[e].get_set().front().get_begin_value() : time;
}
@@ -278,7 +278,7 @@
}
start_position += min_shift;
- last_absolute_time = get_absolute_time(*it);
+ last_absolute_time = get_time(*it);
last_instance = ins;
}
Modified: trunk/tests/time_relevant_ordering/time_relevant_ordering_test.cpp
===================================================================
--- trunk/tests/time_relevant_ordering/time_relevant_ordering_test.cpp 2013-03-21 23:38:42 UTC (rev 1728)
+++ trunk/tests/time_relevant_ordering/time_relevant_ordering_test.cpp 2013-03-22 09:12:16 UTC (rev 1729)
@@ -69,13 +69,8 @@
return 1;
}
- TimeRelevantOrdering tr_ordering;
- msc[0] = beautify.transform(msc[0]);
- /*BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc[0]);
- InstancePtrList instance_list = bmsc->get_instances();
- InstancePtr instance = *(instance_list.begin()++);
- instance->set_line_begin(MscPoint(instance->get_line_begin().get_x(),instance->get_line_begin().get_y()+10));
- msc[0] = tr_ordering.transform(msc[0]);*/
+ TimeRelevantOrdering tr_ordering;
+ msc[0] = tr_ordering.transform(msc[0]);
try
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|