|
From: <got...@us...> - 2009-12-29 13:17:09
|
Revision: 538
http://scstudio.svn.sourceforge.net/scstudio/?rev=538&view=rev
Author: gotthardp
Date: 2009-12-29 13:16:59 +0000 (Tue, 29 Dec 2009)
Log Message:
-----------
Added ANTLR_LIBRARY_DEBUG.
Modified Paths:
--------------
trunk/FindANTLR.cmake
trunk/src/data/Z120/CMakeLists.txt
Modified: trunk/FindANTLR.cmake
===================================================================
--- trunk/FindANTLR.cmake 2009-12-28 16:45:51 UTC (rev 537)
+++ trunk/FindANTLR.cmake 2009-12-29 13:16:59 UTC (rev 538)
@@ -15,6 +15,22 @@
${ANTLR_ROOT}/runtime/C
DOC "The ANTLR library")
+FIND_LIBRARY(ANTLR_LIBRARY_DEBUG
+ NAMES antlr3c
+ PATHS
+ ${ANTLR_ROOT}/runtime/C
+ DOC "The ANTLR debug library")
+
+IF(NOT ANTLR_LIBRARY_DEBUG)
+ SET(ANTLR_LIBRARY_DEBUG ${ANTLR_LIBRARY})
+ SET(ANTLR_LIBRARIES ${ANTLR_LIBRARY})
+ELSE()
+ SET(ANTLR_LIBRARIES
+ optimized ${ANTLR_LIBRARY}
+ debug ${ANTLR_LIBRARY_DEBUG}
+ )
+ENDIF()
+
FIND_PATH(ANTLR_INCLUDE_DIR
NAMES antlr3.h
PATHS
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-12-28 16:45:51 UTC (rev 537)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-12-29 13:16:59 UTC (rev 538)
@@ -20,7 +20,7 @@
Z120Parser.c)
SET(PARSER_LIBRARIES
- ${ANTLR_LIBRARY})
+ ${ANTLR_LIBRARIES})
ENDIF(ANTLR_FOUND)
ADD_LIBRARY(scZ120 SHARED
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-01-03 23:38:25
|
Revision: 539
http://scstudio.svn.sourceforge.net/scstudio/?rev=539&view=rev
Author: madzin
Date: 2010-01-03 23:38:14 +0000 (Sun, 03 Jan 2010)
Log Message:
-----------
Membership algorithm without coregion and simple tests
Modified Paths:
--------------
trunk/src/CMakeLists.txt
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/membership/
trunk/src/membership/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/membership_test.cpp
trunk/tests/membership/test_bmsc01.mpr
trunk/tests/membership/test_bmsc02.mpr
trunk/tests/membership/test_bmsc03.mpr
trunk/tests/membership/test_bmsc04.mpr
trunk/tests/membership/test_bmsc05.mpr
trunk/tests/membership/test_bmsc06.mpr
trunk/tests/membership/test_bmsc07.mpr
trunk/tests/membership/test_hmsc01.mpr
trunk/tests/membership/test_hmsc02.mpr
trunk/tests/membership/test_hmsc03.mpr
trunk/tests/membership/test_hmsc04.mpr
trunk/tests/membership/test_hmsc05.mpr
trunk/tests/membership/test_hmsc06.mpr
Modified: trunk/src/CMakeLists.txt
===================================================================
--- trunk/src/CMakeLists.txt 2009-12-29 13:16:59 UTC (rev 538)
+++ trunk/src/CMakeLists.txt 2010-01-03 23:38:14 UTC (rev 539)
@@ -1,4 +1,5 @@
ADD_SUBDIRECTORY(data)
ADD_SUBDIRECTORY(check)
+ADD_SUBDIRECTORY(membership)
# $Id$
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-12-29 13:16:59 UTC (rev 538)
+++ trunk/src/data/msc.h 2010-01-03 23:38:14 UTC (rev 539)
@@ -608,7 +608,7 @@
/**
* \brief Base abstract class for node of HMsc
*/
-class SCMSC_EXPORT HMscNode :
+class SCMSC_EXPORT HMscNode:
public MscElementTmpl<HMscNode>, public Commentable
{
MscPoint m_position;
@@ -1502,7 +1502,7 @@
/**
* \brief Event which occurs in EventArea.
*/
-class SCMSC_EXPORT Event :
+class SCMSC_EXPORT Event:
public MscElementTmpl<Event>, public Commentable
{
protected:
Property changes on: trunk/src/membership
___________________________________________________________________
Added: svn:mergeinfo
+
Added: trunk/src/membership/CMakeLists.txt
===================================================================
--- trunk/src/membership/CMakeLists.txt (rev 0)
+++ trunk/src/membership/CMakeLists.txt 2010-01-03 23:38:14 UTC (rev 539)
@@ -0,0 +1,16 @@
+ADD_LIBRARY(scmembership SHARED
+ membership_alg.cpp
+ membership_alg.h
+)
+
+TARGET_LINK_LIBRARIES(scmembership
+ scmsc
+ scpseudocode
+)
+
+INSTALL(TARGETS scmembership
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+
+# $Id: CMakeLists.txt 206 2009-03-25 17:03:43Z vacek $
Added: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp (rev 0)
+++ trunk/src/membership/membership_alg.cpp 2010-01-03 23:38:14 UTC (rev 539)
@@ -0,0 +1,615 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Matus Madzin <go...@ma...>
+ *
+ */
+
+#include "membership/membership_alg.h"
+#include <map>
+
+std::map<std::wstring, std::set<ConfigurationPtr> > checked; // map of bmsc names and configurations which were checked
+
+InstancePtr find_instance(InstancePtrList instances, std::wstring name);
+
+HMscPtr search_bmsc(BMscPtr bmsc, BMscPtr bmsc_f);
+HMscPtr search_hmsc(HMscPtr hmsc, BMscPtr bmsc_f);
+
+bool check_branch(HMscNodePtr node, ConfigurationPtr b);
+
+void add_checked_branch(ReferenceNodePtr ref_node, ConfigurationPtr searched_conf);
+
+bool is_empty_instance(InstancePtrList node_instances, InstancePtrList b_instances);
+
+bool strict_strict(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
+ StrictOrderAreaPtr b_strict, std::vector<Event*>& b_events);
+
+bool strict_coregion(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
+ CoregionAreaPtr b_coregion, std::vector<Event*>& b_events);
+
+bool coregion_strict(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
+ StrictOrderAreaPtr b_strict, std::vector<Event*>& b_events);
+
+bool coregion_coretion(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
+ CoregionAreaPtr b_coregion, std::vector<Event*>& b_events);
+
+bool compare_events(Event* a, Event* b);
+
+Checker::PreconditionList MembershipAlg::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ return result;
+}
+
+HMscPtr MembershipAlg::find(MscPtr msc, BMscPtr bmsc_f)
+{
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc > (msc);
+
+ if (hmsc != NULL)
+ return search_hmsc(hmsc, bmsc_f);
+ else
+ {
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
+ return search_bmsc(bmsc, bmsc_f);
+ }
+}
+
+HMscPtr search_hmsc(HMscPtr hmsc, BMscPtr bmsc_f)
+{
+ BMscGraphDuplicator duplicator;
+ HMscPtr dup_hmsc;
+
+ dup_hmsc = duplicator.duplicate(hmsc);
+
+ ConfigurationPtr searched_conf = new Configuration(bmsc_f->get_instances()); //vytvorit konfiguraciu z hladaneho BMSC
+ StartNodePtr start_node = dup_hmsc->get_start();
+ NodeRelationPtrVector successors = start_node->get_successors();
+ NodeRelationPtrVector::iterator it;
+
+ if (check_branch(start_node, searched_conf))
+ {
+ return new HMsc(); //replace with path in hmsc
+ }
+ else
+ {
+ return NULL;
+ }
+
+ return NULL;
+
+}
+
+/*
+ * Check branch if the communication is coressponding
+ * parameters :
+ * node - reference node
+ * b - MSC configuration for search
+ */
+bool check_branch(HMscNodePtr hmsc_node, ConfigurationPtr b)
+{
+
+ EndNodePtr end = boost::dynamic_pointer_cast<EndNode > (hmsc_node);
+
+ if (end != NULL)
+ {
+ if(b->is_null())
+ return true;
+ else
+ return false;
+ }
+
+ ReferenceNodePtr node = boost::dynamic_pointer_cast<ReferenceNode > (hmsc_node);
+
+ if (node == NULL)
+ {
+ PredecessorNode* pred = dynamic_cast<PredecessorNode*> (hmsc_node.get());
+
+ if (pred == NULL)
+ return false;
+
+ NodeRelationPtrVector successors = pred->get_successors();
+ NodeRelationPtrVector::iterator it;
+
+ for (it = successors.begin(); it != successors.end(); it++)
+ {
+ HMscNode* succ = dynamic_cast<HMscNode*> ((*it)->get_successor());
+ if (check_branch(succ, b))
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+
+//TODO add this check to while cycle
+if(b->is_null())
+{
+//when deosn't exist empty path to EndNode
+ return false;
+}
+
+ std::map<std::wstring, std::set<ConfigurationPtr> >::iterator it_checked;
+ it_checked = checked.find(node->get_msc()->get_label());
+
+ if (it_checked != checked.end())
+ {
+ std::set<ConfigurationPtr>::iterator conf_it;
+
+ for (conf_it = it_checked->second.begin(); conf_it != it_checked->second.end(); conf_it++)
+ {
+ if (b->compare(*conf_it))
+ {
+ return false;
+ }
+ }
+ }
+
+
+ MscPtr msc = node->get_msc();
+
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
+
+ if (bmsc == NULL)
+ {
+ return false;
+ }
+
+ InstancePtrList node_instances = bmsc->get_instances();
+ InstancePtrList b_instances = b->get_instances();
+
+ InstancePtrList::iterator node_instence_it, b_instance_it;
+
+ std::set<PositionPtr> b_positions = b->get_positions();
+ std::set<PositionPtr>::iterator b_position_it;
+
+ if (node_instances.size() > b_instances.size())
+ {
+ if (!is_empty_instance(node_instances, b_instances))
+ return false;
+ }
+
+ InstancePtr node_instance = NULL;
+ std::vector<Event*> node_events, b_events;
+ EventAreaPtr node_area, b_area;
+ std::wstring name;
+
+
+ for (b_position_it = b_positions.begin(); b_position_it != b_positions.end(); b_position_it++)
+ {
+ b_events = (*b_position_it)->get_events();
+
+ if (b_events.size() == 1)
+ {
+ name = (*b_position_it)->get_name();
+
+ for (node_instence_it = node_instances.begin(); node_instence_it != node_instances.end(); node_instence_it++)
+ {
+ if (name == (*node_instence_it)->get_label())
+ {
+ node_instance = *node_instence_it;
+ break;
+ }
+ }
+
+ if (node_instance != NULL)
+ node_area = node_instance->get_first();
+ else
+ {
+//remember position and continue in cycle
+ continue;
+ }
+
+ StrictEvent* b_event = dynamic_cast<StrictEvent*>(b_events[0]);
+ StrictOrderAreaPtr b_strict;
+ CoregionAreaPtr node_coregion, b_coregion;
+
+ if(b_event != NULL)
+ {
+ b_area = b_strict = b_event->get_area();
+ }
+ else
+ {
+ CoregionEvent* b_cor = dynamic_cast<CoregionEvent*>(b_events[0]);
+ b_area = b_coregion = b_cor->get_area();
+ }
+
+ StrictOrderAreaPtr node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
+
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ if(node_events.empty())
+ node_events.push_back(node_strict->get_first().get());
+ else
+ std::cout << "node_events should be empty" << std::endl;
+ }
+
+ bool result;
+
+ while (node_area != NULL && b_area != NULL)
+ {
+ switch ((node_strict != NULL) + (b_strict != NULL))
+ {
+ case 2:
+ result = strict_strict(node_strict, node_events, b_strict, b_events);
+ break;
+
+ case 1:
+ if (node_strict != NULL)
+ result = strict_coregion(node_strict, node_events, b_coregion, b_events);
+ else
+ result = coregion_strict(node_coregion, node_events, b_strict, b_events);
+ break;
+
+ case 0:
+ result = coregion_coretion(node_coregion, node_events, b_coregion, b_events);
+ break;
+ }
+
+ if (result)
+ {
+ if (node_events.empty())
+ {
+ node_area = node_area->get_next();
+
+ if (node_area != NULL)
+ {
+ node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
+
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ node_events.push_back(node_strict->get_first().get());
+ }
+ }
+ }
+
+ if (b_events.empty())
+ {
+ b_area = b_area->get_next();
+
+ if (b_area != NULL)
+ {
+ b_strict = boost::dynamic_pointer_cast<StrictOrderArea > (b_area);
+
+
+ if (b_strict == NULL)
+ {
+ b_coregion = boost::dynamic_pointer_cast<CoregionArea > (b_area);
+ b_events.insert(b_events.begin(), b_coregion->get_minimal_events().begin(), b_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ b_events.push_back(b_strict->get_first().get());
+ }
+ }
+ }
+ }
+ else
+ {
+ add_checked_branch(node, b);
+ return false;
+ }
+
+ }
+
+ if ((node_area != NULL) && (b_area == NULL))
+ {
+ return false;
+ }
+
+ if (node_area == NULL)
+ {
+ (*b_position_it)->set_events(b_events);
+ }
+ }
+
+ }
+
+ NodeRelationPtrVector successors = node->get_successors();
+ NodeRelationPtrVector::iterator it;
+ SuccessorNode* succ;
+ HMscNode* hmsc_succ;
+
+ for (it = successors.begin(); it != successors.end(); it++)
+ {
+ succ = (*it)->get_successor();
+ hmsc_succ = dynamic_cast<HMscNode*> (succ);
+
+ if (hmsc_succ != NULL)
+ {
+ if(check_branch(hmsc_succ, b))
+ {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+bool strict_strict(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
+ StrictOrderAreaPtr b_strict, std::vector<Event*>& b_events)
+{
+ StrictEvent* node_e = dynamic_cast<StrictEvent*> (node_events.front());
+ StrictEvent* b_e = dynamic_cast<StrictEvent*> (b_events.front());
+
+ while (node_e != NULL && b_e != NULL)
+ {
+ if (compare_events(node_e, b_e))
+ {
+ node_e = node_e->get_successor().get();
+ b_e = b_e->get_successor().get();
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ if (node_e == NULL)
+ node_events.clear();
+
+ if (b_e == NULL)
+ b_events.clear();
+ else
+ {
+ b_events.clear();
+ b_events.push_back(b_e);
+ }
+
+ return true;
+}
+
+bool strict_coregion(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
+ CoregionAreaPtr b_coregion, std::vector<Event*>& b_events)
+{
+ /* if(b_events.size() > 1)
+ {
+ //neni su rovnake
+ }
+ else
+ Event* b_event = b_events.front();
+ Event* node_event = node_events.front();
+
+ while(node_e != NULL && b_e != NULL)
+ {
+ if(compare_events(node_e, b_e))
+ {
+ node_e = node_e->get_successor();
+ b_e = node_e->get_successor();
+ }
+ else
+ {
+ //neni su rovnake
+ }
+ }
+
+ if(node_e == NULL)
+ node_events.clear();
+ else
+ b_events.clear();
+ */
+ return true;
+
+ /*
+ Event* node_e = node_events.front();
+ std::vector<Event*>::iterator it;
+ bool stop = false;
+
+ while(node_e != NULL || b_events.empty())
+ {
+ for(it = b_events.begin(); it! = b_events.end(); it++)
+ {
+ if(compare_events(node_e, *it))
+ {
+ node_e = node_e->get_successor();
+ *it = (*it)->get_successor();
+
+ if(*it == NULL)
+ b_events.remove(it);
+
+ stop = true;
+ break;
+ }
+ }
+
+ if(!stop)
+ //neni su rovnake
+
+ }
+ */
+}
+
+bool coregion_strict(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
+ StrictOrderAreaPtr b_strict, std::vector<Event*>& b_events)
+{
+ return true;
+}
+
+bool coregion_coretion(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
+ CoregionAreaPtr b_coregion, std::vector<Event*>& b_events)
+{
+ std::vector<Event*>::iterator node_it, b_it;
+ CoregionEvent* node_e;
+ CoregionEvent* b_e;
+
+ for (node_it = node_events.begin(); node_it != node_events.end(); node_it++)
+ {
+ for (b_it = b_events.begin(); b_it != b_events.end();)
+ {
+ if (compare_events(*node_it, *b_it))
+ {
+ while (node_e != NULL && b_e != NULL)
+ {
+ if (compare_events(node_e, b_e))
+ {
+ // node_e = node_e->get_successors();
+ // b_e = node_e->get_successors();
+ }
+ else
+ {
+ //neni su rovnake
+ }
+ }
+
+ if ((node_e == NULL) == (b_e == NULL))
+ {
+ //neni su rovnake
+ }
+ else
+ {
+ std::vector<Event*>::iterator a = node_it++;
+ std::vector<Event*>::iterator b = b_it++;
+ node_events.erase(a);
+ b_events.erase(b);
+ }
+
+ }
+ }
+ }
+
+ if (b_events.empty() != node_events.empty())
+ {
+ //neni su rovnake
+ }
+
+ b_events.clear();
+ node_events.clear();
+
+ return true;
+}
+
+InstancePtr find_instance(InstancePtrList instances, std::wstring name)
+{
+
+ InstancePtrList::iterator it;
+
+ for (it = instances.begin(); it != instances.end(); it++)
+ {
+ if (name == (*it)->get_label())
+ return *it;
+ }
+
+ return NULL;
+}
+
+void add_checked_branch(ReferenceNodePtr ref_node, ConfigurationPtr conf)
+{
+}
+
+void MembershipAlg::cleanup_attributes()
+{
+}
+
+bool compare_events(Event* a, Event* b)
+{
+ if(a->get_instance()->get_label() != b->get_instance()->get_label())
+ return false;
+
+ if(a->is_send() != b->is_send())
+ return false;
+
+ if((a->get_complete_message() == NULL) != (b->get_complete_message() == NULL))
+ return false;
+
+ if(a->get_message()->get_label() != b->get_message()->get_label())
+ return false;
+
+ if(a->is_matched() != b->is_matched())
+ return false;
+
+ if(a->is_matched())
+ {
+ if(a->is_send())
+ {
+ if(a->get_receiver_label() != b->get_receiver_label())
+ return false;
+ }
+ else
+ {
+ if(a->get_sender_label() != b->get_sender_label())
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+HMscPtr search_bmsc(BMscPtr bmsc, BMscPtr bmsc_f)
+{
+ return NULL;
+}
+
+bool is_empty_instance(InstancePtrList node_instances, InstancePtrList b_instances)
+{
+ InstancePtrList::iterator node_instence_it, b_instance_it;
+
+ bool in_bmsc_f;
+ EventAreaPtr event_area;
+
+ for (node_instence_it = node_instances.begin(); node_instence_it != node_instances.end(); node_instence_it++)
+ {
+ in_bmsc_f = false;
+
+ for (b_instance_it = b_instances.begin(); b_instance_it != b_instances.end(); b_instance_it++)
+ {
+ if ((*node_instence_it)->get_label() == (*b_instance_it)->get_label())
+ {
+ in_bmsc_f = true;
+ break;
+ }
+ }
+
+ if (!in_bmsc_f)
+ {
+ event_area = (*node_instence_it)->get_first();
+
+ if (event_area != NULL)
+ {
+ StrictOrderAreaPtr strict = boost::dynamic_pointer_cast<StrictOrderArea > (event_area);
+
+ if (strict == NULL)
+ {
+ CoregionAreaPtr coregion = boost::dynamic_pointer_cast<CoregionArea > (event_area);
+ if (coregion != NULL)
+ {
+ if (coregion->get_minimal_events().size() != 0)
+ return false;
+ }
+ }
+ else
+ {
+ if (strict->get_first() != NULL)
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
Added: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h (rev 0)
+++ trunk/src/membership/membership_alg.h 2010-01-03 23:38:14 UTC (rev 539)
@@ -0,0 +1,321 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Matus Madzin <go...@ma...>
+ *
+ */
+
+#include <set>
+#include <vector>
+#include <string>
+#include "data/msc.h"
+//#include "data/membership.h"
+//#include "membership/export.h"
+#include "check/pseudocode/msc_duplicators.h"
+
+class Position;
+class Configuration;
+class Membership;
+
+typedef boost::intrusive_ptr<Position> PositionPtr;
+typedef boost::intrusive_ptr<Configuration> ConfigurationPtr;
+
+//enum node_position {node, position};
+
+class /*SCMEMBERSHIP_EXPORT*/ Position
+{
+
+private:
+ std::wstring name; //name of instance
+ std::vector<Event*> events; //start searching events
+
+ //! Number of references to this object.
+ mutable size_t m_counter;
+
+// see http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/intrusive_ptr.html
+friend void intrusive_ptr_add_ref(const Position *ptr);
+friend void intrusive_ptr_release(const Position *ptr);
+
+public:
+ Position(std::wstring name, EventPtr position)
+ {
+ this->name = name;
+ this->events.push_back(position.get());
+ }
+
+ Position(std::wstring name, CoregionEventPVector vector)
+ {
+ CoregionEventPVector::iterator it;
+
+ for(it = vector.begin(); it!=vector.end(); it++)
+ {
+ events.push_back(*it);
+ }
+ }
+
+ std::wstring get_name()
+ {
+ return name;
+ }
+
+ std::vector<Event*> get_events()
+ {
+ return events;
+ }
+
+ bool compare(PositionPtr a)
+ {
+ if(name != a->get_name()) return false;
+
+ if(events.size() != a->get_events().size()) return false;
+
+ std::vector<Event*>::iterator it;
+ Event* b;
+
+ for(it=events.begin(); it!=events.end(); it++)
+ {
+ b = a->find_event(*it);
+
+ if(b == NULL || !this->compare_events(*it, b))
+ return false;
+ }
+
+ return true;
+ }
+
+ Event* find_event(Event* event)
+ {
+ std::vector<Event*>::iterator it;
+ for(it=events.begin(); it!=events.end(); it++)
+ {
+//osefovat to nepaci sa mi to porovnavanie
+ if(*it == event) return *it;
+ }
+
+ return NULL;
+ }
+
+ bool compare_events(Event* a, Event* b)
+ {
+ if(a->get_instance()->get_label() != b->get_instance()->get_label())
+ return false;
+
+ if(a->is_send() != b->is_send())
+ return false;
+
+ if((a->get_complete_message() == NULL) != (b->get_complete_message() == NULL))
+ return false;
+
+ if(a->get_message()->get_label() != b->get_message()->get_label())
+ return false;
+
+ if(a->is_matched() != b->is_matched())
+ return false;
+
+ if(a->is_matched())
+ {
+ if(a->is_send())
+ {
+ if(a->get_receiver_label() != b->get_receiver_label())
+ return false;
+ }
+ else
+ {
+ if(a->get_sender_label() != b->get_sender_label())
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ void set_events(std::vector<Event*> new_events)
+ {
+ events = new_events;
+ }
+};
+
+inline void intrusive_ptr_add_ref(const Position *ptr)
+{
+ if(ptr != NULL)
+ ++ptr->m_counter;
+}
+
+inline void intrusive_ptr_release(const Position *ptr)
+{
+ if(ptr != NULL)
+ {
+ if(--ptr->m_counter <= 0)
+ delete ptr;
+ }
+}
+
+
+
+class /*SCMEMBERSHIP_EXPORT*/ Configuration
+{
+
+private:
+ InstancePtrList instance_list;
+ std::set<PositionPtr> positions;
+
+ //! Number of references to this object.
+ mutable size_t m_counter;
+
+friend void intrusive_ptr_add_ref(const Configuration *ptr);
+friend void intrusive_ptr_release(const Configuration *ptr);
+
+public:
+
+ Configuration(InstancePtrList instances)
+ {
+//dobrobit null
+ this->instance_list = instances;
+ InstancePtrList::iterator it;
+ EventAreaPtr area;
+ StrictOrderAreaPtr st_area;
+
+ for(it = instances.begin(); it!= instances.end(); ++it)
+ {
+ area = (*it)->get_first();
+ st_area = boost::dynamic_pointer_cast<StrictOrderArea>(area);
+
+ if(st_area != NULL)
+ {
+ positions.insert(new Position((*it)->get_label(), st_area->get_first()));
+ }
+ else
+ {
+
+ }
+ }
+ }
+
+ Configuration(std::set<PositionPtr> positions)
+ {
+ this->positions = positions;
+ }
+
+ PositionPtr find(PositionPtr p)
+ {
+ std::set<PositionPtr>::iterator it;
+
+ for(it = positions.begin(); it != positions.end(); it++)
+ {
+ if((*it)->compare(p)) return *it;
+ }
+
+ return NULL;
+ }
+
+ bool is_null()
+ {
+ std::set<PositionPtr>::iterator it;
+
+ for(it = positions.begin(); it != positions.end(); it++)
+ {
+ if(!(*it)->get_events().empty())
+ return false;
+ }
+
+ return true;
+ }
+
+ bool compare(ConfigurationPtr a)
+ {
+ if(instance_list.size() != a->get_instances().size() || positions.size() != a->get_positions().size())
+ return false;
+
+ std::set<PositionPtr>::iterator set_it;
+ for(set_it = a->get_positions().begin(); set_it != a->get_positions().end(); set_it++)
+ {
+ if(!this->find(*set_it)) return false;
+ }
+ return true;
+ }
+
+ InstancePtrList get_instances()
+ {
+ return instance_list;
+ }
+
+ std::set<PositionPtr> get_positions()
+ {
+ return positions;
+ }
+
+ void set_position_events(std::wstring name, std::vector<Event*> events)
+ {
+ std::set<PositionPtr>::iterator pos_it;
+
+ for(pos_it = positions.begin(); pos_it != positions.end(); pos_it++)
+ {
+ if((*pos_it)->get_name() == name)
+ {
+ (*pos_it)->set_events(events);
+ break;
+ }
+ }
+ }
+
+};
+
+inline void intrusive_ptr_add_ref(const Configuration *ptr)
+{
+ if(ptr != NULL)
+ ++ptr->m_counter;
+}
+
+inline void intrusive_ptr_release(const Configuration *ptr)
+{
+ if(ptr != NULL)
+ {
+ if(--ptr->m_counter <= 0)
+ delete ptr;
+ }
+}
+
+class /*SCMEMBERSHIP_EXPORT*/ MembershipAlg//: public Membership, public HMscMembership
+{
+
+public:
+
+ MembershipAlg(){};
+
+ /**
+ * Human readable name of the property being checked.
+ */
+ // note: DLL in Windows cannot return pointers to static data
+ virtual std::wstring get_property_name() const
+ { return L"MembershipAlg"; }
+
+ /**
+ * Ralative path to a HTML file displayed as help.
+ */
+ virtual std::wstring get_help_filename() const
+ { return L""; }
+
+ virtual Checker::PreconditionList get_preconditions(MscPtr msc) const;
+
+ /**
+ * Checks whether hmsc satisfy universal boundedness property.
+ */
+ HMscPtr find(MscPtr hmsc, BMscPtr bmsc);
+
+ /**
+ * Cleans up no more needed attributes.
+ */
+ void cleanup_attributes();
+
+};
+
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-12-29 13:16:59 UTC (rev 538)
+++ trunk/tests/CMakeLists.txt 2010-01-03 23:38:14 UTC (rev 539)
@@ -84,6 +84,8 @@
ADD_SUBDIRECTORY(z120_test)
+ADD_SUBDIRECTORY(membership)
+
ADD_EXECUTABLE(checker_test
checker_test.cpp
)
Added: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt (rev 0)
+++ trunk/tests/membership/CMakeLists.txt 2010-01-03 23:38:14 UTC (rev 539)
@@ -0,0 +1,26 @@
+ADD_EXECUTABLE(membership_test
+ membership_test.cpp
+)
+
+TARGET_LINK_LIBRARIES(membership_test
+ scmembership
+ scpseudocode
+ scmsc
+ scZ120
+)
+
+#ADD_MEMBERSHIP_TEST(sctime "Correct Time Constraint Syntax" connector_correct0.mpr 1)
+
+#ADD_MEMBERSHIP_TEST(test_hmsc01 test_bmsc01 1)
+
+ADD_TEST(membtest-01 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc01.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc01.mpr 0)
+
+ADD_TEST(membtest-02 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc02.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc02.mpr 1)
+
+ADD_TEST(membtest-03 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc03.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc03.mpr 0)
+
+ADD_TEST(membtest-04 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc04.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc04.mpr 1)
+
+ADD_TEST(membtest-05 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc05.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc05.mpr 0)
+
+ADD_TEST(membtest-06 ${CMAKE_CURRENT_SOURCE_DIR}/membership_test ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc06.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc06.mpr 1)
Added: trunk/tests/membership/membership_test.cpp
===================================================================
--- trunk/tests/membership/membership_test.cpp (rev 0)
+++ trunk/tests/membership/membership_test.cpp 2010-01-03 23:38:14 UTC (rev 539)
@@ -0,0 +1,122 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Matus Madzin <go...@ma...>
+ *
+ */
+
+#include <string.h>
+#include <iostream>
+
+#include "data/Z120/z120.h"
+#include "membership/membership_alg.h"
+
+char* extract_filename(char* filename)
+{
+ char *last_name = filename;
+ char *last_dot = NULL;
+
+ for(char *pos = filename; *pos != '\0'; pos++)
+ {
+ if(*pos == '.')
+ last_dot = pos;
+ else if(*pos == '\\' || *pos == '/')
+ last_name = pos+1;
+ }
+
+ if(last_dot != NULL)
+ *last_dot = '\0'; // strip the extension
+
+ return last_name;
+}
+
+int main(int argc, char** argv)
+{
+ if(argc < 4)
+ {
+ std::cerr << "Usage: " << argv[0] << " <filename> <fil...
[truncated message content] |
|
From: <got...@us...> - 2010-01-04 08:11:38
|
Revision: 540
http://scstudio.svn.sourceforge.net/scstudio/?rev=540&view=rev
Author: gotthardp
Date: 2010-01-04 08:11:28 +0000 (Mon, 04 Jan 2010)
Log Message:
-----------
Win32 build fixed.
Modified Paths:
--------------
trunk/src/membership/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
Added Paths:
-----------
trunk/src/membership/export.h
Property Changed:
----------------
trunk/src/membership/
trunk/src/membership/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/membership_test.cpp
trunk/tests/membership/test_bmsc01.mpr
trunk/tests/membership/test_bmsc02.mpr
trunk/tests/membership/test_bmsc03.mpr
trunk/tests/membership/test_bmsc04.mpr
trunk/tests/membership/test_bmsc05.mpr
trunk/tests/membership/test_bmsc06.mpr
trunk/tests/membership/test_bmsc07.mpr
trunk/tests/membership/test_hmsc01.mpr
trunk/tests/membership/test_hmsc02.mpr
trunk/tests/membership/test_hmsc03.mpr
trunk/tests/membership/test_hmsc04.mpr
trunk/tests/membership/test_hmsc05.mpr
trunk/tests/membership/test_hmsc06.mpr
Property changes on: trunk/src/membership
___________________________________________________________________
Deleted: svn:mergeinfo
-
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Modified: trunk/src/membership/CMakeLists.txt
===================================================================
--- trunk/src/membership/CMakeLists.txt 2010-01-03 23:38:14 UTC (rev 539)
+++ trunk/src/membership/CMakeLists.txt 2010-01-04 08:11:28 UTC (rev 540)
@@ -1,4 +1,5 @@
ADD_LIBRARY(scmembership SHARED
+ export.h
membership_alg.cpp
membership_alg.h
)
@@ -13,4 +14,4 @@
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
-# $Id: CMakeLists.txt 206 2009-03-25 17:03:43Z vacek $
+# $Id$
Property changes on: trunk/src/membership/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/membership/export.h
===================================================================
--- trunk/src/membership/export.h (rev 0)
+++ trunk/src/membership/export.h 2010-01-04 08:11:28 UTC (rev 540)
@@ -0,0 +1,37 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCMEMBERSHIP_EXPORT_H
+#define _SCMEMBERSHIP_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scmembership_EXPORTS)
+#define SCMEMBERSHIP_EXPORT __declspec(dllexport)
+#else
+#define SCMEMBERSHIP_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCMEMBERSHIP_EXPORT
+#endif
+
+#endif /* _SCMEMBERSHIP_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/membership/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-01-03 23:38:14 UTC (rev 539)
+++ trunk/src/membership/membership_alg.cpp 2010-01-04 08:11:28 UTC (rev 540)
@@ -453,8 +453,8 @@
CoregionAreaPtr b_coregion, std::vector<Event*>& b_events)
{
std::vector<Event*>::iterator node_it, b_it;
- CoregionEvent* node_e;
- CoregionEvent* b_e;
+ CoregionEvent* node_e = NULL;
+ CoregionEvent* b_e = NULL;
for (node_it = node_events.begin(); node_it != node_events.end(); node_it++)
{
Property changes on: trunk/src/membership/membership_alg.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-01-03 23:38:14 UTC (rev 539)
+++ trunk/src/membership/membership_alg.h 2010-01-04 08:11:28 UTC (rev 540)
@@ -20,7 +20,7 @@
#include <string>
#include "data/msc.h"
//#include "data/membership.h"
-//#include "membership/export.h"
+#include "membership/export.h"
#include "check/pseudocode/msc_duplicators.h"
class Position;
@@ -285,19 +285,21 @@
}
}
-class /*SCMEMBERSHIP_EXPORT*/ MembershipAlg//: public Membership, public HMscMembership
+class SCMEMBERSHIP_EXPORT MembershipAlg//: public Membership, public HMscMembership
{
public:
MembershipAlg(){};
+ virtual ~MembershipAlg(){};
+
/**
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
virtual std::wstring get_property_name() const
- { return L"MembershipAlg"; }
+ { return L"Membership"; }
/**
* Ralative path to a HTML file displayed as help.
Property changes on: trunk/src/membership/membership_alg.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/membership_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc01.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc02.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc03.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc04.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc05.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc06.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_bmsc07.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc01.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc02.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc03.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc04.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc05.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests/membership/test_hmsc06.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-01-07 19:33:00
|
Revision: 543
http://scstudio.svn.sourceforge.net/scstudio/?rev=543&view=rev
Author: gotthardp
Date: 2010-01-07 19:32:50 +0000 (Thu, 07 Jan 2010)
Log Message:
-----------
Portability enhancements.
Modified Paths:
--------------
trunk/FindANTLR.cmake
trunk/src/view/visio/addon/visualize.cpp
Modified: trunk/FindANTLR.cmake
===================================================================
--- trunk/FindANTLR.cmake 2010-01-05 14:02:05 UTC (rev 542)
+++ trunk/FindANTLR.cmake 2010-01-07 19:32:50 UTC (rev 543)
@@ -4,7 +4,10 @@
ENDIF(NOT ANTLR_ROOT)
FIND_FILE(ANTLR_CLASSPATH
- NAMES antlr-3.1.1.jar
+ NAMES
+ antlr-3.1.1.jar
+ antlr-3.1.2.jar
+ antlr-3.1.3.jar
PATHS
${ANTLR_ROOT}/lib
DOC "The ANTLR class file")
@@ -13,12 +16,14 @@
NAMES antlr3c
PATHS
${ANTLR_ROOT}/runtime/C
+ ${ANTLR_ROOT}/runtime/C/Release
DOC "The ANTLR library")
FIND_LIBRARY(ANTLR_LIBRARY_DEBUG
- NAMES antlr3c
+ NAMES antlr3cd
PATHS
${ANTLR_ROOT}/runtime/C
+ ${ANTLR_ROOT}/runtime/C/Debug
DOC "The ANTLR debug library")
IF(NOT ANTLR_LIBRARY_DEBUG)
Modified: trunk/src/view/visio/addon/visualize.cpp
===================================================================
--- trunk/src/view/visio/addon/visualize.cpp 2010-01-05 14:02:05 UTC (rev 542)
+++ trunk/src/view/visio/addon/visualize.cpp 2010-01-07 19:32:50 UTC (rev 543)
@@ -22,7 +22,6 @@
#include "errors.h"
#include <math.h>
-#include <Visconst.h>
CDrawingVisualizer::CDrawingVisualizer(Visio::IVApplicationPtr vsoApp)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <xr...@us...> - 2010-01-08 12:30:59
|
Revision: 545
http://scstudio.svn.sourceforge.net/scstudio/?rev=545&view=rev
Author: xrehak
Date: 2010-01-08 12:30:49 +0000 (Fri, 08 Jan 2010)
Log Message:
-----------
properties have been changed
Modified Paths:
--------------
trunk/doc/memb_alg.tex
Property Changed:
----------------
trunk/doc/help/localchoice/localchoice.html
trunk/doc/memb_alg.tex
trunk/tests/constrain_check_test.cpp
Property changes on: trunk/doc/help/localchoice/localchoice.html
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/doc/memb_alg.tex
===================================================================
--- trunk/doc/memb_alg.tex 2010-01-07 20:54:45 UTC (rev 544)
+++ trunk/doc/memb_alg.tex 2010-01-08 12:30:49 UTC (rev 545)
@@ -1,4 +1,4 @@
-% $Id:$
+% $Id$
\documentclass{article}
\usepackage[plainpages=false, pdfpagelabels]{hyperref}
Property changes on: trunk/doc/memb_alg.tex
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/constrain_check_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-01-10 14:47:42
|
Revision: 546
http://scstudio.svn.sourceforge.net/scstudio/?rev=546&view=rev
Author: gotthardp
Date: 2010-01-10 14:47:31 +0000 (Sun, 10 Jan 2010)
Log Message:
-----------
Membership integrated with Visio add-on.
Modified Paths:
--------------
trunk/src/data/CMakeLists.txt
trunk/src/membership/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/src/view/visio/addon/aboutdlg.h
trunk/src/view/visio/addon/addon.cpp
trunk/src/view/visio/addon/addon.h
trunk/src/view/visio/addon/dllmodule.cpp
trunk/src/view/visio/addon/dllmodule.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/errors.cpp
trunk/src/view/visio/addon/errors.h
trunk/src/view/visio/addon/eventsink.idl
trunk/src/view/visio/addon/extract.cpp
trunk/src/view/visio/addon/extract.h
trunk/src/view/visio/addon/optionsdlg.cpp
trunk/src/view/visio/addon/optionsdlg.h
trunk/src/view/visio/addon/reportview.cpp
trunk/src/view/visio/addon/reportview.h
trunk/src/view/visio/addon/resource.h
trunk/src/view/visio/addon/scstudio.vcproj
trunk/src/view/visio/addon/visualize.cpp
trunk/src/view/visio/addon/visualize.h
trunk/src/view/visio/scstudio.nsi
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/membership_test.cpp
Added Paths:
-----------
trunk/src/data/searcher.h
trunk/src/membership/module.cpp
trunk/src/view/visio/addon/finddlg.cpp
trunk/src/view/visio/addon/finddlg.h
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/data/CMakeLists.txt 2010-01-10 14:47:31 UTC (rev 546)
@@ -14,6 +14,7 @@
prerequisite_check.h
formatter.h
checker.h
+ searcher.h
transformer.h
session_attribute.cpp
session_attribute.h
Added: trunk/src/data/searcher.h
===================================================================
--- trunk/src/data/searcher.h (rev 0)
+++ trunk/src/data/searcher.h 2010-01-10 14:47:31 UTC (rev 546)
@@ -0,0 +1,48 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SEARCHER_H
+#define _SEARCHER_H
+
+#include <boost/shared_ptr.hpp>
+
+#include "data/msc.h"
+#include "data/reporter.h"
+
+#if defined(_MSC_VER)
+// FIXME: to be removed once the Searcher has some implementation in a .cpp file
+#pragma warning(disable: 4275)
+#endif
+
+class Searcher : public Reporter
+{
+public:
+ virtual ~Searcher() {}
+
+ //! Find the first occurence of needle in haystack.
+ virtual MscPtr find(MscPtr haystack, MscPtr needle) = 0;
+};
+
+typedef boost::shared_ptr<Searcher> SearcherPtr;
+
+//! module initialization function
+typedef Searcher* (*FInitMembership)();
+
+#endif /* _SEARCHER_H */
+
+// $Id$
Property changes on: trunk/src/data/searcher.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/membership/CMakeLists.txt
===================================================================
--- trunk/src/membership/CMakeLists.txt 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/membership/CMakeLists.txt 2010-01-10 14:47:31 UTC (rev 546)
@@ -1,5 +1,6 @@
ADD_LIBRARY(scmembership SHARED
export.h
+ module.cpp
membership_alg.cpp
membership_alg.h
)
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/membership/membership_alg.cpp 2010-01-10 14:47:31 UTC (rev 546)
@@ -51,10 +51,18 @@
return result;
}
-HMscPtr MembershipAlg::find(MscPtr msc, BMscPtr bmsc_f)
+MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc)
{
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc > (msc);
+ BMscPtr bmsc_f = boost::dynamic_pointer_cast<BMsc>(bmsc);
+ if (bmsc_f == NULL)
+ {
+ print_report(RS_ERROR,
+ stringize() << "Searched flow must be a basic MSC.");
+ return NULL;
+ }
+
if (hmsc != NULL)
return search_hmsc(hmsc, bmsc_f);
else
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/membership/membership_alg.h 2010-01-10 14:47:31 UTC (rev 546)
@@ -19,7 +19,7 @@
#include <vector>
#include <string>
#include "data/msc.h"
-//#include "data/membership.h"
+#include "data/searcher.h"
#include "membership/export.h"
#include "check/pseudocode/msc_duplicators.h"
@@ -285,7 +285,7 @@
}
}
-class SCMEMBERSHIP_EXPORT MembershipAlg//: public Membership, public HMscMembership
+class SCMEMBERSHIP_EXPORT MembershipAlg: public Searcher
{
public:
@@ -312,7 +312,7 @@
/**
* Checks whether hmsc satisfy universal boundedness property.
*/
- HMscPtr find(MscPtr hmsc, BMscPtr bmsc);
+ virtual MscPtr find(MscPtr hmsc, MscPtr bmsc);
/**
* Cleans up no more needed attributes.
Added: trunk/src/membership/module.cpp
===================================================================
--- trunk/src/membership/module.cpp (rev 0)
+++ trunk/src/membership/module.cpp 2010-01-10 14:47:31 UTC (rev 546)
@@ -0,0 +1,30 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "data/searcher.h"
+#include "membership/membership_alg.h"
+
+// module initialization function
+// note: the Visio add-on searches for a function of this name
+extern "C" SCMEMBERSHIP_EXPORT
+Searcher* init_membership()
+{
+ return new MembershipAlg();
+}
+
+// $Id$
Property changes on: trunk/src/membership/module.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/view/visio/addon/aboutdlg.h
===================================================================
--- trunk/src/view/visio/addon/aboutdlg.h 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/aboutdlg.h 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
Modified: trunk/src/view/visio/addon/addon.cpp
===================================================================
--- trunk/src/view/visio/addon/addon.cpp 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/addon.cpp 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
@@ -276,9 +276,12 @@
TRACE("CStudioAddon::Run() menu item 'Check--Drawing--Export'");
return pDocumentMonitor->OnMenuExport(vsoApp);
case 205:
+ TRACE("CStudioAddon::Run() menu item 'Check--Drawing--Find Flow'");
+ return pDocumentMonitor->OnMenuFindFlow(vsoApp);
+ case 206:
TRACE("CStudioAddon::Run() menu item 'Check--Drawing--Repaint'");
return pDocumentMonitor->OnMenuRepaint(vsoApp);
- case 206:
+ case 207:
TRACE("CStudioAddon::Run() menu item 'Check--Options'");
return DisplayOptions();
Modified: trunk/src/view/visio/addon/addon.h
===================================================================
--- trunk/src/view/visio/addon/addon.h 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/addon.h 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
Modified: trunk/src/view/visio/addon/dllmodule.cpp
===================================================================
--- trunk/src/view/visio/addon/dllmodule.cpp 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/dllmodule.cpp 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
Modified: trunk/src/view/visio/addon/dllmodule.h
===================================================================
--- trunk/src/view/visio/addon/dllmodule.h 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/dllmodule.h 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/dllmodule.rc 2010-01-10 14:47:31 UTC (rev 546)
@@ -37,7 +37,7 @@
DEFPUSHBUTTON "&OK",IDOK,184,60,50,14
END
-IDD_OPTIONS DIALOGEX 0, 0, 205, 135
+IDD_OPTIONS DIALOGEX 0, 0, 200, 135
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Options"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
@@ -50,7 +50,20 @@
COMBOBOX IDC_OUTPUTLEVEL,5,118,130,61,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END
+IDD_FIND_FLOW DIALOGEX 0, 0, 275, 111
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Find"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "Start",IDOK,220,72,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,220,92,50,14
+ LTEXT "Find flow",IDC_STATIC,5,5,100,8
+ CONTROL "",IDC_DRAWING1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,5,14,100,92
+ LTEXT "In drawing",IDC_STATIC,110,5,100,8
+ CONTROL "",IDC_DRAWING2,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,110,14,100,92
+END
+
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
@@ -139,6 +152,14 @@
TOPMARGIN, 5
BOTTOMMARGIN, 130
END
+
+ IDD_FIND_FLOW, DIALOG
+ BEGIN
+ LEFTMARGIN, 5
+ RIGHTMARGIN, 270
+ TOPMARGIN, 5
+ BOTTOMMARGIN, 106
+ END
END
#endif // APSTUDIO_INVOKED
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/document.cpp 2010-01-10 14:47:31 UTC (rev 546)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2007-2008 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2007-2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
@@ -23,6 +23,7 @@
#include "errors.h"
#include "extract.h"
#include "visualize.h"
+#include "finddlg.h"
#include "optionsdlg.h"
#include <fstream>
@@ -79,6 +80,7 @@
// terminate all module functions
m_formatters.clear();
m_checkers.clear();
+ m_membership = SearcherPtr(); // NULL
m_transformers.clear();
// close extension modules
for(std::vector<HINSTANCE>::const_iterator mpos = m_open_modules.begin();
@@ -193,10 +195,17 @@
continue;
}
- FInitFormatters init_formatters = (FInitFormatters)GetProcAddress(module, "init_formatters");
- FInitCheckers init_checkers = (FInitCheckers)GetProcAddress(module, "init_checkers");
- FInitTransformers init_transformers = (FInitTransformers)GetProcAddress(module, "init_transformers");
- if(init_formatters == NULL && init_checkers == NULL && init_transformers == NULL)
+ FInitFormatters init_formatters =
+ (FInitFormatters)GetProcAddress(module, "init_formatters");
+ FInitCheckers init_checkers =
+ (FInitCheckers)GetProcAddress(module, "init_checkers");
+ FInitMembership init_membership =
+ (FInitMembership)GetProcAddress(module, "init_membership");
+ FInitTransformers init_transformers =
+ (FInitTransformers)GetProcAddress(module, "init_transformers");
+
+ if(init_formatters == NULL && init_checkers == NULL
+ && init_membership == NULL && init_transformers == NULL)
{
DisplayException(m_vsoApp, basic_stringize<TCHAR>()
<< _T("Cannot open module '") << valData << _T("'"), MB_OK | MB_ICONEXCLAMATION);
@@ -234,6 +243,9 @@
delete[] checkers;
}
+ if(init_membership != NULL)
+ m_membership = boost::shared_ptr<Searcher>(init_membership());
+
if(init_transformers != NULL)
{
Transformer **transformers = init_transformers();
@@ -324,6 +336,11 @@
page = GetOrCreatePage(vsoDocument->Pages, vsoShape->Text);
// switch to the found page
m_vsoApp->ActiveWindow->Page = (IDispatch *)page;
+
+ // if the page is empty, set zoom to 100%
+ if (page->Shapes->Count == 0)
+ m_vsoApp->ActiveWindow->Zoom = 1;
+
return VAORC_SUCCESS;
}
@@ -391,11 +408,19 @@
menuItem32->Enabled = m_formatters.size() > 0;
Visio::IVMenuItemPtr menuItem33 = menuItem3->MenuItems->Add();
- menuItem33->Caption = "&Repaint";
+ menuItem33->Caption = "&Find Flow...";
menuItem33->AddOnName = ADDON_NAME;
menuItem33->AddOnArgs = "/event=205";
menuItem33->BeginGroup = true;
+ // enable only if membership is available
+ menuItem33->Enabled = m_membership != NULL;
+ Visio::IVMenuItemPtr menuItem34 = menuItem3->MenuItems->Add();
+ menuItem34->Caption = "&Repaint";
+ menuItem34->AddOnName = ADDON_NAME;
+ menuItem34->AddOnArgs = "/event=206";
+ menuItem34->BeginGroup = true;
+
for(TransformerPtrList::const_iterator tpos = m_transformers.begin();
tpos != m_transformers.end(); tpos++)
{
@@ -413,7 +438,7 @@
Visio::IVMenuItemPtr menuItem4 = menu->MenuItems->Add();
menuItem4->Caption = "&Options...";
menuItem4->AddOnName = ADDON_NAME;
- menuItem4->AddOnArgs = "/event=206";
+ menuItem4->AddOnArgs = "/event=207";
vsoDocument->SetCustomMenus(vsoMenus);
}
@@ -891,188 +916,94 @@
return result;
}
-std::wstring filter_to_wstring(const std::string& str)
+VAORC CDocumentMonitor::OnMenuImport(Visio::IVApplicationPtr vsoApp)
{
- std::wstring res;
+ // clear the verification report
+ m_reportView->Reset();
- const char *spos = str.data();
- size_t ssize = str.length();
- while(ssize > 0)
- {
- int inc;
- // this converts '@' to '\0'
- // note: this function is intended only for CFileDialog filter strings
- if(*spos == '\0' || *spos == '@')
- {
- res.push_back(wchar_t('\0'));
- inc = 1;
- }
- else
- {
- wchar_t wc;
- inc = mbtowc(&wc, spos, ssize);
- res.push_back(wc);
- }
+ char fileName[_MAX_PATH];
+ // ask user for the filename
+ if (GetInputFile(fileName) < 0)
+ return VAORC_FAILURE;
- spos += inc;
- ssize -= inc;
- }
- return res;
+ ImportFormatterPtr formatter = GetImportFormatter(fileName);
+ if(formatter == NULL)
+ return VAORC_FAILURE;
+
+ // import the drawing
+ ImportDocument(formatter, fileName);
+ return VAORC_SUCCESS;
}
-VAORC CDocumentMonitor::OnMenuImport(Visio::IVApplicationPtr vsoApp)
+VAORC CDocumentMonitor::OnMenuExport(Visio::IVApplicationPtr vsoApp)
{
// clear the verification report
m_reportView->Reset();
- std::string extension;
- std::stringstream filter;
+ char fileName[_MAX_PATH];
+ // ask user for the filename
+ if (GetOutputFile(fileName) < 0)
+ return VAORC_FAILURE;
- // construct the filter string
- // _T("Text Documents (*.txt)\0*.txt\0All Files (*.*)\0*.*\0")
- for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
- fpos != m_formatters.end(); fpos++)
- {
- ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
- if(formatter == NULL)
- continue;
+ ExportFormatterPtr formatter = GetExportFormatter(fileName);
+ if(formatter == NULL)
+ return VAORC_FAILURE;
- filter << (*fpos)->get_description()
- << " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
-
- if(extension.empty())
- extension = (*fpos)->get_extension();
- }
- // append a filter to display all files
- filter << "All Files (*.*)@*.*@";
- // translate char --> TCHAR and '@' --> '\0'
- // note: Windows stringstream cannot handle '\0' inside a string
- std::wstring extension_w = filter_to_wstring(extension);
- std::wstring filter_w = filter_to_wstring(filter.str());
-
- CFileDialog dialog(TRUE /* open */,
- extension_w.c_str(), NULL,
- OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST,
- filter_w.c_str());
- INT_PTR res = dialog.DoModal();
-
- if(res != IDOK)
- return VAORC_SUCCESS;
-
- TRACE("OnMenuImport() loading " << dialog.m_szFileTitle << " from " << dialog.m_szFileName);
-
- char fileName[MAX_PATH];
- wcstombs(fileName, dialog.m_szFileName, MAX_PATH);
-
- char *fileExtension = strrchr(fileName, '.');
- if(fileExtension == NULL || *fileExtension == '\0')
+ std::ofstream stream;
+ stream.open(fileName, std::ios::out | std::ios::trunc);
+ if(!stream.good())
{
MessageBox(GetActiveWindow(),
- _T("No extension given. Cannot determine file type."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ _T("Cannot export given file."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
return VAORC_FAILURE;
}
- // look for the appropriate export formatter
- for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
- fpos != m_formatters.end(); fpos++)
- {
- if(_stricmp(fileExtension+1, (*fpos)->get_extension().c_str()) != 0)
- continue;
+ // export the drawing
+ ExportActiveDocument(formatter, stream);
+ stream.close();
- ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
- if(formatter == NULL)
- continue;
-
- ImportDocument(formatter, fileName);
- return VAORC_SUCCESS;
- }
-
- MessageBox(GetActiveWindow(),
- _T("No suitable import filter found."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
- return VAORC_FAILURE;
+ return VAORC_SUCCESS;
}
-VAORC CDocumentMonitor::OnMenuExport(Visio::IVApplicationPtr vsoApp)
+VAORC CDocumentMonitor::OnMenuFindFlow(Visio::IVApplicationPtr vsoApp)
{
+ CFindDlg dlg(vsoApp);
+ // ask user for the drawings to be compared
+ if (dlg.DoModal() != IDOK)
+ return VAORC_FAILURE;
+
// clear the verification report
m_reportView->Reset();
- std::string extension;
- std::stringstream filter;
+ CDrawingExtractor extractor(m_reportView);
+ // obtain MSC to search for (needle)
+ MscPtr msc_needle = extractor.extract_msc(dlg.m_page1);
- // construct the filter string
- // _T("Text Documents (*.txt)\0*.txt\0All Files (*.*)\0*.*\0")
- for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
- fpos != m_formatters.end(); fpos++)
- {
- ExportFormatterPtr formatter = boost::dynamic_pointer_cast<ExportFormatter>(*fpos);
- if(formatter == NULL)
- continue;
+ MscPtr msc_haystack;
+ // obtain MSC to search in (haystack)
+ if (dlg.m_page2 != dlg.m_page1)
+ msc_haystack = extractor.extract_msc(dlg.m_page2);
+ else
+ msc_haystack = msc_needle;
- filter << (*fpos)->get_description()
- << " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
+ if (msc_haystack == NULL || msc_needle == NULL)
+ return VAORC_FAILURE;
- if(extension.empty())
- extension = (*fpos)->get_extension();
- }
- // append a filter to display all files
- filter << "All Files (*.*)@*.*@";
- // translate char --> TCHAR and '@' --> '\0'
- // note: Windows stringstream cannot handle '\0' inside a string
- std::wstring extension_w = filter_to_wstring(extension);
- std::wstring filter_w = filter_to_wstring(filter.str());
-
- CFileDialog dialog(FALSE /* save as */,
- extension_w.c_str(), NULL,
- OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT,
- filter_w.c_str());
- INT_PTR res = dialog.DoModal();
-
- if(res != IDOK)
- return VAORC_SUCCESS;
-
- TRACE("OnMenuExport() saving " << dialog.m_szFileTitle << " as " << dialog.m_szFileName);
-
- char fileName[MAX_PATH];
- wcstombs(fileName, dialog.m_szFileName, MAX_PATH);
-
- char *fileExtension = strrchr(fileName, '.');
- if(fileExtension == NULL || *fileExtension == '\0')
+ MscPtr result = m_membership->find(msc_haystack, msc_needle);
+ if (result != NULL)
{
- MessageBox(GetActiveWindow(),
- _T("No extension given. Cannot determine file type."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
- return VAORC_FAILURE;
+ m_reportView->Print(RS_NOTICE, stringize()
+ << "Flow " << msc_needle->get_label() << " in drawing " << msc_haystack->get_label()
+ << " found.", result);
}
-
- // look for the appropriate export formatter
- for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
- fpos != m_formatters.end(); fpos++)
+ else
{
- if(_stricmp(fileExtension+1, (*fpos)->get_extension().c_str()) != 0)
- continue;
-
- ExportFormatterPtr formatter = boost::dynamic_pointer_cast<ExportFormatter>(*fpos);
- if(formatter == NULL)
- continue;
-
- std::ofstream stream;
- stream.open(fileName, std::ios::out | std::ios::trunc);
- if(!stream.good())
- {
- MessageBox(GetActiveWindow(),
- _T("Cannot export given file."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
- return VAORC_FAILURE;
- }
-
- ExportActiveDocument(formatter, stream);
-
- stream.close();
- return VAORC_SUCCESS;
+ m_reportView->Print(RS_NOTICE, stringize()
+ << "Flow " << msc_needle->get_label() << " in drawing " << msc_haystack->get_label()
+ << " not found.");
}
- MessageBox(GetActiveWindow(),
- _T("No suitable export filter found."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
- return VAORC_FAILURE;
+ return VAORC_SUCCESS;
}
VAORC CDocumentMonitor::OnMenuRepaint(Visio::IVApplicationPtr vsoApp)
@@ -1212,6 +1143,106 @@
m_reportVisible = false;
}
+std::wstring filter_to_wstring(const std::string& str)
+{
+ std::wstring res;
+
+ const char *spos = str.data();
+ size_t ssize = str.length();
+ while(ssize > 0)
+ {
+ int inc;
+ // this converts '@' to '\0'
+ // note: this function is intended only for CFileDialog filter strings
+ if(*spos == '\0' || *spos == '@')
+ {
+ res.push_back(wchar_t('\0'));
+ inc = 1;
+ }
+ else
+ {
+ wchar_t wc;
+ inc = mbtowc(&wc, spos, ssize);
+ res.push_back(wc);
+ }
+
+ spos += inc;
+ ssize -= inc;
+ }
+ return res;
+}
+
+int CDocumentMonitor::GetInputFile(char* fileName)
+{
+ std::string extension;
+ std::stringstream filter;
+
+ // construct the filter string
+ // _T("Text Documents (*.txt)\0*.txt\0All Files (*.*)\0*.*\0")
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
+ filter << (*fpos)->get_description()
+ << " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
+
+ if(extension.empty())
+ extension = (*fpos)->get_extension();
+ }
+ // append a filter to display all files
+ filter << "All Files (*.*)@*.*@";
+ // translate char --> TCHAR and '@' --> '\0'
+ // note: Windows stringstream cannot handle '\0' inside a string
+ std::wstring extension_w = filter_to_wstring(extension);
+ std::wstring filter_w = filter_to_wstring(filter.str());
+
+ CFileDialog dialog(TRUE /* open */,
+ extension_w.c_str(), NULL,
+ OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST,
+ filter_w.c_str());
+ INT_PTR res = dialog.DoModal();
+
+ if(res != IDOK)
+ return -1; // failure
+
+ TRACE("GetInputFile() loading " << dialog.m_szFileTitle << " from " << dialog.m_szFileName);
+
+ wcstombs(fileName, dialog.m_szFileName, _MAX_PATH);
+ return 0; // success
+}
+
+ImportFormatterPtr CDocumentMonitor::GetImportFormatter(const char* fileName)
+{
+ const char *fileExtension = strrchr(fileName, '.');
+ if(fileExtension == NULL || *fileExtension == '\0')
+ {
+ MessageBox(GetActiveWindow(),
+ _T("No extension given. Cannot determine file type."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return ImportFormatterPtr(); // NULL
+ }
+
+ // look for the appropriate export formatter
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ if(_stricmp(fileExtension+1, (*fpos)->get_extension().c_str()) != 0)
+ continue;
+
+ ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
+ return formatter;
+ }
+
+ MessageBox(GetActiveWindow(),
+ _T("No suitable import filter found."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return ImportFormatterPtr(); // NULL
+}
+
void CDocumentMonitor::ImportDocument(const ImportFormatterPtr& formatter, const std::string& filename)
{
// load the document
@@ -1252,6 +1283,77 @@
m_vsoApp->EndUndoScope(scope_id, true);
}
+int CDocumentMonitor::GetOutputFile(char* fileName)
+{
+ std::string extension;
+ std::stringstream filter;
+
+ // construct the filter string
+ // _T("Text Documents (*.txt)\0*.txt\0All Files (*.*)\0*.*\0")
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ ExportFormatterPtr formatter = boost::dynamic_pointer_cast<ExportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
+ filter << (*fpos)->get_description()
+ << " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
+
+ if(extension.empty())
+ extension = (*fpos)->get_extension();
+ }
+ // append a filter to display all files
+ filter << "All Files (*.*)@*.*@";
+ // translate char --> TCHAR and '@' --> '\0'
+ // note: Windows stringstream cannot handle '\0' inside a string
+ std::wstring extension_w = filter_to_wstring(extension);
+ std::wstring filter_w = filter_to_wstring(filter.str());
+
+ CFileDialog dialog(FALSE /* save as */,
+ extension_w.c_str(), NULL,
+ OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT,
+ filter_w.c_str());
+ INT_PTR res = dialog.DoModal();
+
+ if(res != IDOK)
+ return -1; // failure
+
+ TRACE("GetOutputFile() saving " << dialog.m_szFileTitle << " as " << dialog.m_szFileName);
+
+ wcstombs(fileName, dialog.m_szFileName, _MAX_PATH);
+ return 0; // success
+}
+
+ExportFormatterPtr CDocumentMonitor::GetExportFormatter(const char* fileName)
+{
+ const char *fileExtension = strrchr(fileName, '.');
+ if(fileExtension == NULL || *fileExtension == '\0')
+ {
+ MessageBox(GetActiveWindow(),
+ _T("No extension given. Cannot determine file type."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return ExportFormatterPtr(); // NULL
+ }
+
+ // look for the appropriate export formatter
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ if(_stricmp(fileExtension+1, (*fpos)->get_extension().c_str()) != 0)
+ continue;
+
+ ExportFormatterPtr formatter = boost::dynamic_pointer_cast<ExportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
+ return formatter;
+ }
+
+ MessageBox(GetActiveWindow(),
+ _T("No suitable export filter found."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return ExportFormatterPtr(); // NULL
+}
+
void CDocumentMonitor::ExportActiveDocument(const ExportFormatterPtr& formatter, std::ostream& stream)
{
CDrawingExtractor extractor(m_reportView);
Modified: trunk/src/view/visio/addon/document.h
===================================================================
--- trunk/src/view/visio/addon/document.h 2010-01-08 12:30:49 UTC (rev 545)
+++ trunk/src/view/visio/addon/document.h 2010-01-10 14:47:31 UTC (rev 546)
@@...
[truncated message content] |
|
From: <ma...@us...> - 2010-01-14 22:02:13
|
Revision: 552
http://scstudio.svn.sourceforge.net/scstudio/?rev=552&view=rev
Author: madzin
Date: 2010-01-14 22:02:04 +0000 (Thu, 14 Jan 2010)
Log Message:
-----------
Add coregion to membership (without message ordering) and new tests
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/cycleWithEmpty_pos_hmsc.mpr
trunk/tests/membership/cycleWithEmpty_pos_pat.mpr
trunk/tests/membership/cycle_neg_hmsc.mpr
trunk/tests/membership/cycle_neg_pat.mpr
trunk/tests/membership/cycle_pos_hmsc.mpr
trunk/tests/membership/cycle_pos_pat.mpr
trunk/tests/membership/membership_test.cpp
trunk/tests/membership/test_bmsc01.mpr
trunk/tests/membership/test_bmsc02.mpr
trunk/tests/membership/test_bmsc03.mpr
trunk/tests/membership/test_bmsc04.mpr
trunk/tests/membership/test_bmsc06.mpr
Added Paths:
-----------
trunk/tests/membership/test_bmsc08.mpr
trunk/tests/membership/test_bmsc09.mpr
trunk/tests/membership/test_bmsc10.mpr
trunk/tests/membership/test_bmsc11_1.mpr
trunk/tests/membership/test_bmsc11_2.mpr
trunk/tests/membership/test_bmsc11_3.mpr
trunk/tests/membership/test_bmsc11_4.mpr
trunk/tests/membership/test_bmsc11_5.mpr
trunk/tests/membership/test_bmsc12_1.mpr
trunk/tests/membership/test_bmsc12_2.mpr
trunk/tests/membership/test_bmsc12_3.mpr
trunk/tests/membership/test_bmsc12_4.mpr
trunk/tests/membership/test_bmsc12_5.mpr
trunk/tests/membership/test_bmsc13_1.mpr
trunk/tests/membership/test_bmsc13_2.mpr
trunk/tests/membership/test_bmsc13_3.mpr
trunk/tests/membership/test_bmsc14_1.mpr
trunk/tests/membership/test_bmsc14_2.mpr
trunk/tests/membership/test_bmsc14_3.mpr
trunk/tests/membership/test_bmsc14_4.mpr
trunk/tests/membership/test_bmsc15_1.mpr
trunk/tests/membership/test_bmsc15_2.mpr
trunk/tests/membership/test_bmsc16_1.mpr
trunk/tests/membership/test_bmsc16_2.mpr
trunk/tests/membership/test_bmsc16_3.mpr
trunk/tests/membership/test_hmsc08.mpr
trunk/tests/membership/test_hmsc09.mpr
trunk/tests/membership/test_hmsc10.mpr
trunk/tests/membership/test_hmsc11.mpr
trunk/tests/membership/test_hmsc12.mpr
trunk/tests/membership/test_hmsc13.mpr
trunk/tests/membership/test_hmsc14.mpr
trunk/tests/membership/test_hmsc15.mpr
trunk/tests/membership/test_hmsc16.mpr
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/src/membership/membership_alg.cpp 2010-01-14 22:02:04 UTC (rev 552)
@@ -454,7 +454,66 @@
bool coregion_strict(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
StrictOrderAreaPtr b_strict, std::vector<Event*>& b_events)
{
+ StrictEvent* b_e = dynamic_cast<StrictEvent*> (b_events.front());
+ std::vector<Event*>::iterator it;
+ std::vector<CoregionEvent*> possible_events;
+ bool found = false;
+
+ while(b_e != NULL && !node_events.empty())
+ {
+
+ CoregionEvent* node_e = NULL;
+ found = false;
+
+ for(it = node_events.begin(); it!= node_events.end(); it++)
+ {
+ if(compare_events(*it, b_e))
+ {
+ node_e = dynamic_cast<CoregionEvent*>(*it);
+
+ if(node_e == NULL)
+ {
+std::cout << "cor_e was null" << std::endl;
+ return false;
+ }
+
+ found = true;
+ break;
+ }
+ }
+
+ if(found)
+ {
+ CoregEventRelPtrVector succ = node_e->get_successors();
+ CoregEventRelPtrVector::iterator succ_it;
+
+ //remove node which was compared
+ node_events.erase(it);
+ b_e = b_e->get_successor().get();
+
+ //add successors of compared node if the node has got some
+ for(succ_it = succ.begin(); succ_it != succ.end(); succ_it++)
+ {
+ node_events.push_back((*succ_it)->get_successor());
+ }
+ }
+ else
+ return false;
+ }
+
+// if (node_events.size() > 1)
+// return false;
+
+ if (b_e == NULL)
+ b_events.clear();
+ else
+ {
+ b_events.clear();
+ b_events.push_back(b_e);
+ }
+
return true;
+
}
bool coregion_coretion(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/src/membership/membership_alg.h 2010-01-14 22:02:04 UTC (rev 552)
@@ -51,10 +51,13 @@
{
this->name = name;
this->events.push_back(position.get());
+ this->m_counter = 0;
}
Position(std::wstring name, CoregionEventPVector vector)
{
+ this->m_counter = 0;
+
CoregionEventPVector::iterator it;
for(it = vector.begin(); it!=vector.end(); it++)
@@ -179,6 +182,8 @@
Configuration(InstancePtrList instances)
{
+ this->m_counter = 0;
+
//dobrobit null
this->instance_list = instances;
InstancePtrList::iterator it;
@@ -192,7 +197,9 @@
if(st_area != NULL)
{
- positions.insert(new Position((*it)->get_label(), st_area->get_first()));
+ PositionPtr pos = new Position((*it)->get_label(), st_area->get_first());
+ positions.insert(pos);
+// positions.insert(new Position((*it)->get_label(), st_area->get_first()));
}
else
{
@@ -203,6 +210,7 @@
Configuration(std::set<PositionPtr> positions)
{
+ this->m_counter = 0;
this->positions = positions;
}
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/CMakeLists.txt 2010-01-14 22:02:04 UTC (rev 552)
@@ -19,14 +19,65 @@
STRING(REGEX REPLACE "\\$\\(.*\\)" "\${CTEST_CONFIGURATION_TYPE}"
MEMBERSHIP_TEST_EXECUTABLE "${MEMBERSHIP_TEST_EXECUTABLE}")
-ADD_TEST(membtest-01 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc01.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc01.mpr 0)
+ADD_TEST(membership_test-01 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc01.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc01.mpr 1)
-ADD_TEST(membtest-02 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc02.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc02.mpr 1)
+ADD_TEST(membership_test-02 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc02.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc02.mpr 0)
-ADD_TEST(membtest-03 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc03.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc03.mpr 0)
+ADD_TEST(membership_test-03 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc03.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc03.mpr 1)
-ADD_TEST(membtest-04 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc04.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc04.mpr 1)
+ADD_TEST(membership_test-04 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc04.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc04.mpr 0)
-ADD_TEST(membtest-05 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc05.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc05.mpr 0)
+ADD_TEST(membership_test-05 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc05.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc05.mpr 1)
-ADD_TEST(membtest-06 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc06.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc06.mpr 1)
+ADD_TEST(membership_test-06 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc06.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc06.mpr 0)
+
+#coregion tests
+ADD_TEST(membership_test-08 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc08.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc08.mpr 1)
+
+ADD_TEST(membership_test-09 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc09.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc09.mpr 1)
+
+ADD_TEST(membership_test-10 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc10.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc10.mpr 1)
+
+ADD_TEST(membership_test-11 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_1.mpr 1)
+
+ADD_TEST(membership_test-12 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_2.mpr 0)
+
+ADD_TEST(membership_test-13 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_3.mpr 0)
+
+ADD_TEST(membership_test-14 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_4.mpr 0)
+
+ADD_TEST(membership_test-15 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc12.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_1.mpr 1)
+
+ADD_TEST(membership_test-16 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc12.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_2.mpr 1)
+
+ADD_TEST(membership_test-17 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc12.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_3.mpr 0)
+
+ADD_TEST(membership_test-18 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc12.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_4.mpr 0)
+
+ADD_TEST(membership_test-19 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc12.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_5.mpr 0)
+
+ADD_TEST(membership_test-20 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc13.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc13_1.mpr 1)
+
+ADD_TEST(membership_test-21 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc13.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc13_2.mpr 1)
+
+ADD_TEST(membership_test-22 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc13.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc13_3.mpr 0)
+
+ADD_TEST(membership_test-23 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_1.mpr 1)
+
+ADD_TEST(membership_test-24 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_2.mpr 1)
+
+ADD_TEST(membership_test-25 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_3.mpr 0)
+
+ADD_TEST(membership_test-26 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_4.mpr 0)
+
+ADD_TEST(membership_test-27 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc15.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc15_1.mpr 1)
+
+ADD_TEST(membership_test-28 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc15.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc15_2.mpr 0)
+
+ADD_TEST(membership_test-29 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc16.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc16_1.mpr 1)
+
+ADD_TEST(membership_test-30 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc16.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc16_2.mpr 1)
+
+ADD_TEST(membership_test-31 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc16.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc16_3.mpr 0)
+
+ADD_TEST(membership_test-32 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_5.mpr 1)
Modified: trunk/tests/membership/cycleWithEmpty_pos_hmsc.mpr
===================================================================
--- trunk/tests/membership/cycleWithEmpty_pos_hmsc.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycleWithEmpty_pos_hmsc.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycleWithEmpty_pos_hmsc.vsd;
-msc Page-1;
+msc Page1;
initial connect L0;
L0: reference bMSC1 connect L1, L2;
L1: reference empty2 connect L0;
Modified: trunk/tests/membership/cycleWithEmpty_pos_pat.mpr
===================================================================
--- trunk/tests/membership/cycleWithEmpty_pos_pat.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycleWithEmpty_pos_pat.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycleWithEmpty_pos_pat.vsd;
-msc Page-1;
+msc Page1;
inst p;
inst q;
inst r;
Modified: trunk/tests/membership/cycle_neg_hmsc.mpr
===================================================================
--- trunk/tests/membership/cycle_neg_hmsc.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycle_neg_hmsc.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycle_neg_hmsc.vsd;
-msc Page-1;
+msc Page1;
initial connect L0;
L0: reference bMSC1 connect L1, L0;
L1: reference bMSC2 connect L2;
Modified: trunk/tests/membership/cycle_neg_pat.mpr
===================================================================
--- trunk/tests/membership/cycle_neg_pat.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycle_neg_pat.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycle_neg_pat.vsd;
-msc Page-1;
+msc Page1;
inst p;
inst q;
inst r;
Modified: trunk/tests/membership/cycle_pos_hmsc.mpr
===================================================================
--- trunk/tests/membership/cycle_pos_hmsc.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycle_pos_hmsc.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycle_pos_hmsc.vsd;
-msc Page-1;
+msc Page1;
initial connect L0;
L0: reference bMSC1 connect L1, L0;
L1: reference bMSC2 connect L2;
Modified: trunk/tests/membership/cycle_pos_pat.mpr
===================================================================
--- trunk/tests/membership/cycle_pos_pat.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/cycle_pos_pat.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,5 +1,5 @@
mscdocument cycle_pos_pat.vsd;
-msc Page-1;
+msc Page1;
inst p;
inst q;
inst r;
Modified: trunk/tests/membership/membership_test.cpp
===================================================================
--- trunk/tests/membership/membership_test.cpp 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/membership_test.cpp 2010-01-14 22:02:04 UTC (rev 552)
@@ -96,23 +96,24 @@
if(result == NULL)
{
+std::cout << "result was null" << std::endl;
if(satisfied)
- std::cout << "OK: HMSC doesn't contain bMSC" << std::endl;
- else
{
std::cerr << "ERROR: HMSC should contain bMSC" << std::endl;
errors = 1;
}
+ else
+ std::cout << "OK: HMSC doesn't contain bMSC" << std::endl;
}
else
{
if(satisfied)
+ std::cout << "OK: HMSC contains bMSC" << std::endl;
+ else
{
std::cerr << "ERROR: HMSC should not contain bMSC" << std::endl;
errors = 1;
}
- else
- std::cout << "OK: HMSC contains bMSC" << std::endl;
std::cout << std::endl;
Modified: trunk/tests/membership/test_bmsc01.mpr
===================================================================
--- trunk/tests/membership/test_bmsc01.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/test_bmsc01.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,3 +1,10 @@
+
+
+
+
+
+
+
msc bmsc3;
inst A;
inst B;
Modified: trunk/tests/membership/test_bmsc02.mpr
===================================================================
--- trunk/tests/membership/test_bmsc02.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/test_bmsc02.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,3 +1,9 @@
+
+
+
+
+
+
msc bmsc3;
inst A;
inst B;
Modified: trunk/tests/membership/test_bmsc03.mpr
===================================================================
--- trunk/tests/membership/test_bmsc03.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/test_bmsc03.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,3 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
msc Triskac;
inst A;
inst B;
Modified: trunk/tests/membership/test_bmsc04.mpr
===================================================================
--- trunk/tests/membership/test_bmsc04.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/test_bmsc04.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,3 +1,10 @@
+
+
+
+
+
+
+
msc mystery;
inst A;
inst B;
Modified: trunk/tests/membership/test_bmsc06.mpr
===================================================================
--- trunk/tests/membership/test_bmsc06.mpr 2010-01-13 22:34:09 UTC (rev 551)
+++ trunk/tests/membership/test_bmsc06.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -1,3 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
msc mystery;
inst A;
inst B;
Added: trunk/tests/membership/test_bmsc08.mpr
===================================================================
--- trunk/tests/membership/test_bmsc08.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc08.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+msc Setup;
+inst NAME1;
+inst NAME2;
+NAME1: instance;
+out FTP,0 to NAME2;
+in HTTP,1 from NAME2;
+endinstance;
+NAME2: instance;
+in FTP,0 from NAME1;
+out HTTP,1 to NAME1;
+endinstance;
+endmsc;
+
Added: trunk/tests/membership/test_bmsc09.mpr
===================================================================
--- trunk/tests/membership/test_bmsc09.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc09.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,17 @@
+msc feature;
+inst server;
+inst client;
+
+
+server: instance;
+out aaa,0 to client;
+in bbb,1 from client;
+in ccc,2 from client;
+endinstance;
+
+client: instance;
+in aaa,0 from server;
+out bbb,1 to server;
+out ccc,2 to server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc10.mpr
===================================================================
--- trunk/tests/membership/test_bmsc10.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc10.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,17 @@
+msc feature;
+inst server;
+inst client;
+
+
+server: instance;
+in bbb,1 from client;
+out aaa,0 to client;
+in ccc,2 from client;
+endinstance;
+
+client: instance;
+in aaa,0 from server;
+out bbb,1 to server;
+out ccc,2 to server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc11_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc11_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc11_1.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+Lock: instance;
+in aaa,0 from Key;
+out bbb,1 to Key;
+endinstance;
+Key: instance;
+out aaa,0 to Lock;
+in bbb,1 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc11_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc11_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc11_2.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+Lock: instance;
+out bbb,0 to Key;
+in aaa,1 from Key;
+endinstance;
+Key: instance;
+in bbb,0 from Lock;
+out aaa,1 to Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc11_3.mpr
===================================================================
--- trunk/tests/membership/test_bmsc11_3.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc11_3.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+Lock: instance;
+out bbb,0 to Key;
+out aaa,1 to Key;
+endinstance;
+Key: instance;
+in bbb,0 from Lock;
+in aaa,1 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc11_4.mpr
===================================================================
--- trunk/tests/membership/test_bmsc11_4.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc11_4.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+Lock: instance;
+in bbb,0 from Key;
+in aaa,1 from Key;
+endinstance;
+Key: instance;
+out bbb,0 to Lock;
+out aaa,1 to Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc11_5.mpr
===================================================================
--- trunk/tests/membership/test_bmsc11_5.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc11_5.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,13 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+Lock: instance;
+out bbb,0 to Key;
+in aaa,1 from Key;
+endinstance;
+Key: instance;
+out aaa,1 to Lock;
+in bbb,0 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc12_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc12_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc12_1.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ddd,1 from Private;
+in eee,2 from Private;
+out ddd,3 to Private;
+in ccc,4 from Key;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,4 to Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out ddd,1 to Lock;
+out eee,2 to Lock;
+in ddd,3 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc12_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc12_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc12_2.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ddd,1 from Private;
+in ccc,2 from Key;
+in eee,3 from Private;
+out ddd,4 to Private;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,2 to Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out ddd,1 to Lock;
+out eee,3 to Lock;
+in ddd,4 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc12_3.mpr
===================================================================
--- trunk/tests/membership/test_bmsc12_3.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc12_3.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Key;
+in ccc,1 from Private;
+in ddd,2 from Private;
+in eee,3 from Private;
+out ddd,4 to Private;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,0 to Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,1 to Lock;
+out ddd,2 to Lock;
+out eee,3 to Lock;
+in ddd,4 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc12_4.mpr
===================================================================
--- trunk/tests/membership/test_bmsc12_4.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc12_4.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,26 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ccc,1 from Key;
+in ddd,2 from Private;
+in NAME,3 from Key;
+in eee,4 from Private;
+out ddd,5 to Private;
+out bbb,6 to Key;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+out NAME,3 to Lock;
+in bbb,6 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out ddd,2 to Lock;
+out eee,4 to Lock;
+in ddd,5 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc12_5.mpr
===================================================================
--- trunk/tests/membership/test_bmsc12_5.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc12_5.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ccc,1 from Key;
+in ddd,2 from Private;
+out bbb,3 to Key;
+in eee,4 from Private;
+out ddd,5 to Private;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+in bbb,3 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out ddd,2 to Lock;
+out eee,4 to Lock;
+in ddd,5 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc13_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc13_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc13_1.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ccc,1 from Key;
+in eee,2 from Private;
+out bbb,3 to Key;
+out ddd,4 to Private;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+in bbb,3 from Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out eee,2 to Lock;
+in ddd,4 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc13_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc13_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc13_2.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ccc,1 from Key;
+in eee,2 from Private;
+out ddd,3 to Private;
+out bbb,4 to Key;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+in bbb,4 from Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out eee,2 to Lock;
+in ddd,3 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc13_3.mpr
===================================================================
--- trunk/tests/membership/test_bmsc13_3.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc13_3.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,24 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in ccc,0 from Private;
+in ccc,1 from Key;
+out bbb,2 to Key;
+in eee,3 from Private;
+out ddd,4 to Private;
+out bbb,5 to Key;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+in bbb,2 from Lock;
+in bbb,5 from Lock;
+endinstance;
+Private: instance;
+out ccc,0 to Lock;
+out eee,3 to Lock;
+in ddd,4 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc14_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc14_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc14_1.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,20 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in aaa,0 from Private;
+out bbb,1 to Key;
+in ccc,2 from Key;
+out ddd,3 to Private;
+endinstance;
+Key: instance;
+in bbb,1 from Lock;
+out ccc,2 to Lock;
+endinstance;
+Private: instance;
+out aaa,0 to Lock;
+in ddd,3 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc14_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc14_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc14_2.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,20 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in aaa,0 from Private;
+in ccc,1 from Key;
+out ddd,2 to Private;
+out bbb,3 to Key;
+endinstance;
+Key: instance;
+out ccc,1 to Lock;
+in bbb,3 from Lock;
+endinstance;
+Private: instance;
+out aaa,0 to Lock;
+in ddd,2 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc14_3.mpr
===================================================================
--- trunk/tests/membership/test_bmsc14_3.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc14_3.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,20 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in aaa,0 from Private;
+out ddd,1 to Private;
+out bbb,2 to Key;
+in ccc,3 from Key;
+endinstance;
+Key: instance;
+in bbb,2 from Lock;
+out ccc,3 to Lock;
+endinstance;
+Private: instance;
+out aaa,0 to Lock;
+in ddd,1 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc14_4.mpr
===================================================================
--- trunk/tests/membership/test_bmsc14_4.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc14_4.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,20 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Lock;
+inst Key;
+inst Private;
+Lock: instance;
+in aaa,0 from Private;
+out ddd,1 to Private;
+in ccc,2 from Key;
+out bbb,3 to Key;
+endinstance;
+Key: instance;
+out ccc,2 to Lock;
+in bbb,3 from Lock;
+endinstance;
+Private: instance;
+out aaa,0 to Lock;
+in ddd,1 from Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc15_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc15_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc15_1.mpr 2010-01-14 22:02:04 UTC (rev 552)
@@ -0,0 +1,28 @@
+mscdocument Drawing2;
+msc Page_1;
+inst Private;
+inst Lock;
+inst Key;
+Private: instance;
+out aaa,0 to Lock;
+out bbb,1 to Lock;
+in bbb,2 from Lock;
+out aaa,3 to Lock;
+endinstance;
+
+Lock: instance;
+in aaa,0 from Private;
+in bbb,4 from Key;
+in bbb,1 from Private;
+out aaa,5 to Key;
+out bbb,2 to Private;
+in aaa,3 from Private;
+in bbb,6 from Key;
+endinstance;
+
+Key: instance;
+out bbb,4 to Lock;
+in aaa,5 from Lock;
+out bbb,6 to Lock;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc15_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc15_2.mpr (rev...
[truncated message content] |
|
From: <got...@us...> - 2010-01-28 21:36:04
|
Revision: 558
http://scstudio.svn.sourceforge.net/scstudio/?rev=558&view=rev
Author: gotthardp
Date: 2010-01-28 21:35:53 +0000 (Thu, 28 Jan 2010)
Log Message:
-----------
New feature: msc.h time intervals now support textual measurements, i.e. "[a,b] &name".
Modified Paths:
--------------
trunk/src/data/Z120/z120_save.cpp
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/msc_types.h
trunk/src/data/reporter.h
trunk/src/data/time.h
trunk/src/view/visio/addon/extract.cpp
trunk/src/view/visio/addon/visualize.cpp
trunk/tests/interval_test.cpp
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/Z120/z120_save.cpp 2010-01-28 21:35:53 UTC (rev 558)
@@ -390,7 +390,7 @@
if((*rpos)->is_directed())
stream << " origin";
- stream << " " << (*rpos)->get_interval_set();
+ stream << " " << (*rpos)->get_label();
}
if(printed)
@@ -537,7 +537,7 @@
else
stream << ", ";
- stream << (*rpos)->get_interval_set();
+ stream << (*rpos)->get_label();
}
if(printed)
@@ -583,7 +583,7 @@
if((*rpos)->is_directed())
stream << " origin";
- stream << " " << (*rpos)->get_interval_set();
+ stream << " " << (*rpos)->get_label();
}
if(printed)
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/msc.cpp 2010-01-28 21:35:53 UTC (rev 558)
@@ -336,19 +336,27 @@
/////////////////////////////////////////////////////////////////////////////
#ifdef _TIME_H_
-TimeRelation::TimeRelation(MscTimeIntervalSetD set, bool directed):
+TimeRelation::TimeRelation(const MscTimeIntervalSetD& set):
MscElementTmpl<TimeRelation>(NULL),
- m_interval_set(set), m_directed(directed), m_width(0)
+ m_directed(false), m_interval_set(set), m_measurement(), m_width(0)
{
}
+TimeRelation::TimeRelation(const std::string& value):
+ MscElementTmpl<TimeRelation>(NULL),
+ m_directed(false), m_interval_set(), m_measurement(), m_width(0)
+{
+ assign(value);
+}
+
TimeRelation::TimeRelation(TimeRelation* original):
MscElementTmpl<TimeRelation>(original)
{
if(original)
{
- m_interval_set=original->m_interval_set;
m_directed = original->is_directed();
+ m_interval_set = original->m_interval_set;
+ m_measurement = original->m_measurement;
m_width = original->get_width();
}
}
@@ -357,13 +365,163 @@
{
}
+void TimeRelation::assign(const std::string& label)
+{
+ enum ParserState
+ {
+ AWAIT_FIRST,
+ INTERVAL,
+ AWAIT_NEXT,
+ CONJUNCTION,
+ MEASUREMENT_FIRST,
+ MEASUREMENT_NEXT,
+ AWAIT_END
+ };
+
+ ParserState state = AWAIT_FIRST;
+
+ std::string interval;
+ std::string measurement;
+
+ for(std::string::const_iterator pos = label.begin();
+ pos != label.end(); pos++)
+ {
+ switch(state)
+ {
+ case AWAIT_FIRST:
+ if(*pos == '[' || *pos == '(')
+ {
+ state = INTERVAL;
+ interval.push_back(*pos);
+ }
+ else if(*pos == '&')
+ state = MEASUREMENT_FIRST;
+ else if(isspace(*pos))
+ break;
+ else
+ throw MscIntervalStringConversionError("expecting interval or measurement");
+
+ break;
+
+ case INTERVAL:
+ interval.push_back(*pos);
+
+ if(*pos == ']' || *pos == ')')
+ state = AWAIT_NEXT;
+
+ break;
+
+ case AWAIT_NEXT:
+ if(*pos == '+')
+ {
+ state = CONJUNCTION;
+ interval.push_back(*pos);
+ }
+ else if(*pos == '&')
+ state = MEASUREMENT_FIRST;
+ else if(isspace(*pos))
+ break;
+ else
+ throw MscIntervalStringConversionError("expecting interval conjunction or measurement");
+
+ break;
+
+ case CONJUNCTION:
+ if(*pos == '[' || *pos == '(')
+ {
+ state = INTERVAL;
+ interval.push_back(*pos);
+ }
+ else if(isspace(*pos))
+ break;
+ else
+ throw MscIntervalStringConversionError("expecting interval");
+
+ break;
+
+ case MEASUREMENT_FIRST:
+ if(isalpha(*pos))
+ {
+ state = MEASUREMENT_NEXT;
+ measurement.push_back(*pos);
+ }
+ else
+ throw MscIntervalStringConversionError("invalid measurement");
+
+ break;
+
+ case MEASUREMENT_NEXT:
+ if(isalnum(*pos))
+ measurement.push_back(*pos);
+ else if(isspace(*pos))
+ state = AWAIT_END;
+ else
+ throw MscIntervalStringConversionError("invalid measurement name");
+
+ break;
+
+ case AWAIT_END:
+ if(!isspace(*pos))
+ throw MscIntervalStringConversionError("unexpected character");
+
+ break;
+ }
+ }
+
+ switch(state)
+ {
+ case AWAIT_FIRST:
+ throw MscIntervalStringConversionError("empty time interval");
+
+ case INTERVAL:
+ throw MscIntervalStringConversionError("unterminated time interval");
+
+ case AWAIT_NEXT:
+ break; // correct
+
+ case CONJUNCTION:
+ throw MscIntervalStringConversionError("expecting interval conjunction");
+
+ case MEASUREMENT_FIRST:
+ throw MscIntervalStringConversionError("expecting measurement");
+
+ case MEASUREMENT_NEXT:
+ case AWAIT_END:
+ break; // correct
+ }
+
+ if(!interval.empty())
+ m_interval_set.assign(interval);
+ else
+ m_interval_set.set_infinity();
+
+ m_measurement.assign(measurement);
+}
+
+std::string TimeRelation::get_label() const
+{
+ std::stringstream text;
+ // extract textual representation of the constraint
+ if(!m_measurement.empty())
+ {
+ // don't print infinite intervals for measurements
+ if(!m_interval_set.is_infinity())
+ text << m_interval_set << " ";
+
+ text << "&" << m_measurement;
+ }
+ else
+ text << m_interval_set;
+
+ return text.str();
+}
+
const MscTimeIntervalSetD TimeRelation::get_interval_set() const
{
return m_interval_set;
}
-
-void TimeRelation::set_interval_set(const MscTimeIntervalSetD set)
+void TimeRelation::set_interval_set(const MscTimeIntervalSetD& set)
{
m_interval_set = set;
}
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/msc.h 2010-01-28 21:35:53 UTC (rev 558)
@@ -2365,17 +2365,19 @@
class SCMSC_EXPORT TimeRelation:public MscElementTmpl<TimeRelation>
{
protected:
+ bool m_directed; //! indicates directed constraint, see "origin" keyword
MscTimeIntervalSet<double> m_interval_set;
- bool m_directed;
+ std::string m_measurement; //! measurement variable name
Size m_width; //! length of the guide line
public:
- TimeRelation(MscTimeIntervalSetD set, bool directed = false);
+ TimeRelation(const MscTimeIntervalSetD& set);
+ TimeRelation(const std::string& set);
TimeRelation(TimeRelation *original);
virtual ~TimeRelation();
- const MscTimeIntervalSetD get_interval_set() const;
- void set_interval_set(const MscTimeIntervalSetD);
+ void assign(const std::string& label);
+ std::string get_label() const;
bool is_directed() const
{
@@ -2387,6 +2389,19 @@
m_directed = directed;
}
+ const MscTimeIntervalSetD get_interval_set() const;
+ void set_interval_set(const MscTimeIntervalSetD& set);
+
+ const std::string& get_measurement() const
+ {
+ return m_measurement;
+ }
+
+ void set_measurement(std::string& measurement)
+ {
+ m_measurement = measurement;
+ }
+
Size get_width() const
{
return m_width;
@@ -2411,6 +2426,11 @@
{
}
+ TimeRelationEvent(const std::string& set):
+ TimeRelation(set), m_event_origin(NULL), m_event(NULL)
+ {
+ }
+
TimeRelationEvent(TimeRelationEvent *original);
virtual ~TimeRelationEvent()
@@ -2472,6 +2492,11 @@
{
}
+ TimeRelationRefNode(const std::string& set):
+ TimeRelation(set), m_node_origin(NULL), m_node(NULL)
+ {
+ }
+
TimeRelationRefNode(TimeRelationRefNode *original);
ReferenceNode* get_ref_node_a() const
Modified: trunk/src/data/msc_types.h
===================================================================
--- trunk/src/data/msc_types.h 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/msc_types.h 2010-01-28 21:35:53 UTC (rev 558)
@@ -19,6 +19,10 @@
#ifndef _MSC_TYPES_H
#define _MSC_TYPES_H
+#ifndef NOMINMAX
+#define NOMINMAX // disable Windows min and max macros
+#endif
+
#include "data/fcmp.h"
#include "data/export.h"
@@ -26,6 +30,9 @@
#include <list>
#include <map>
#include <string>
+#if defined(_MSC_VER)
+#include <comutil.h> // _bstr_t
+#endif
template <class T>
struct nocase_comparator: public std::binary_function<std::basic_string<T>, std::basic_string<T>, bool>
@@ -47,6 +54,43 @@
std::wstring SCMSC_EXPORT TOWSTRING(const std::string& s);
+//! Helper class to construct a message for Reporter::print()
+/*!
+ * reporter->print(stringize() << "value: " << number);
+ */
+template<typename C>
+struct basic_stringize
+{
+ template<typename T>
+ basic_stringize<C> & operator << (const T& t)
+ {
+ m_s << t;
+ return *this;
+ }
+
+#if defined(_MSC_VER)
+ template<>
+ basic_stringize<C> & operator << (const _bstr_t& t)
+ {
+ // choose conversion
+ // _bstr_t has both char* and wchar_t* operators
+ m_s << (const C*)t;
+ return *this;
+ }
+#endif
+
+ // note: must not return reference
+ operator const std::basic_string<C>() const
+ {
+ return m_s.str();
+ }
+
+private:
+ std::basic_stringstream<C> m_s;
+};
+
+typedef basic_stringize<wchar_t> stringize;
+
typedef double Coordinate;
typedef double Size;
Modified: trunk/src/data/reporter.h
===================================================================
--- trunk/src/data/reporter.h 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/reporter.h 2010-01-28 21:35:53 UTC (rev 558)
@@ -20,9 +20,6 @@
#define _REPORTER_H
#include <sstream>
-#if defined(_MSC_VER)
-#include <comutil.h> // _bstr_t
-#endif
enum TReportSeverity
{
@@ -74,43 +71,6 @@
ReportPrinter* m_printer;
};
-//! Helper class to construct a message for Reporter::print()
-/*!
- * reporter->print(stringize() << "value: " << number);
- */
-template<typename C>
-struct basic_stringize
-{
- template<typename T>
- basic_stringize<C> & operator << (const T& t)
- {
- m_s << t;
- return *this;
- }
-
-#if defined(_MSC_VER)
- template<>
- basic_stringize<C> & operator << (const _bstr_t& t)
- {
- // choose conversion
- // _bstr_t has both char* and wchar_t* operators
- m_s << (const C*)t;
- return *this;
- }
-#endif
-
- // note: must not return reference
- operator const std::basic_string<C>() const
- {
- return m_s.str();
- }
-
-private:
- std::basic_stringstream<C> m_s;
-};
-
-typedef basic_stringize<wchar_t> stringize;
-
#endif /* _REPORTER_H */
// $Id$
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/data/time.h 2010-01-28 21:35:53 UTC (rev 558)
@@ -370,27 +370,27 @@
m_value=value;
}
- const MscIntervalCouple operator+(const MscIntervalCouple& right)
+ const MscIntervalCouple operator+(const MscIntervalCouple& right) const
{
return MscIntervalCouple(m_closed&&right.m_closed,m_value+right.m_value);
}
- const MscIntervalCouple operator-(const MscIntervalCouple& right)
+ const MscIntervalCouple operator-(const MscIntervalCouple& right) const
{
return MscIntervalCouple(m_closed&&right.m_closed,m_value-right.m_value);
}
- const MscIntervalCouple operator+(const T& value)
+ const MscIntervalCouple operator+(const T& value) const
{
return MscIntervalCouple(m_closed,m_value+value);
}
- const MscIntervalCouple operator-(const T& value)
+ const MscIntervalCouple operator-(const T& value) const
{
return MscIntervalCouple(m_closed,m_value-value);
}
- const MscIntervalCouple operator*(const T& value)
+ const MscIntervalCouple operator*(const T& value) const
{
return MscIntervalCouple(m_closed,m_value*value);
}
@@ -489,27 +489,6 @@
else
throw MscIntervalCoupleUncomparable();
}
-
-/**
- * @return smaller of two MscIntervalCouple
- * @throw MscIntervalCoupleUncomparable
- */
-static MscIntervalCouple&
-minimum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleUncomparable)
-{
- return (right<left)?right:left;
-}
-
-/**
- * @return bigger of two MscIntervalCouple
- * @throw MscIntervalCoupleUncomparable
- */
-static MscIntervalCouple&
-maximum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleUncomparable)
-{
- return (right>left)?right:left;
-}
-
};
// end of MscIntervalCouple class
@@ -563,14 +542,23 @@
}
MscTimeInterval(const std::string& interval)
- throw(MscIntervalStringConversionError)
+ throw(MscIntervalStringConversionError)
{
+ assign(interval);
+ }
+
+ void assign(const std::string& interval)
+ throw(MscIntervalStringConversionError)
+ {
// remove spaces and get lowercase of string
std::string tmp = get_small_nospace(interval);
bool b_closed = true;
bool e_closed = true;
+ if(tmp.empty())
+ throw MscIntervalStringConversionError("no time interval");
+
//looking for starting brackets
if(!char_in_string(tmp[0],std::string("([")))
{
@@ -679,9 +667,9 @@
void set(bool& left,T& b,T& e,bool& right)
{
m_begin=b;
- m_begin=left;
+ m_begin.set_closed(left);
m_end=e;
- m_end=right;
+ m_end.set_closed(right);
}
void set_begin(const MscIntervalCouple<T> begin)
@@ -722,12 +710,12 @@
return *this;
}
- const MscTimeInterval operator+(const MscTimeInterval& right)
+ const MscTimeInterval operator+(const MscTimeInterval& right) const
{
return MscTimeInterval(m_begin+right.m_begin,m_end+right.m_end);
}
- const MscTimeInterval operator+(const T& value)
+ const MscTimeInterval operator+(const T& value) const
{
return MscTimeInterval(m_begin+value,m_end+value);
}
@@ -736,17 +724,17 @@
* @warning: inteval minus
* (a,b) - (c,d) = (a-d, b-c)
*/
- const MscTimeInterval operator-(const MscTimeInterval& right)
+ const MscTimeInterval operator-(const MscTimeInterval& right) const
{
return MscTimeInterval(m_begin-right.m_end,m_end-right.m_begin);
}
- const MscTimeInterval operator-(const T& value)
+ const MscTimeInterval operator-(const T& value) const
{
return MscTimeInterval(m_begin-value,m_end-value);
}
- const MscTimeInterval operator*(const T& value)
+ const MscTimeInterval operator*(const T& value) const
{
return MscTimeInterval(m_begin*value,m_end*value);
}
@@ -785,7 +773,7 @@
* \return true if the interval is valid
*/
- bool is_valid()
+ bool is_valid() const
{
try
{
@@ -819,7 +807,20 @@
set(1,0);
}
+ void set_infinity()
+ {
+ m_begin = -std::numeric_limits<T>::infinity();
+ m_begin.set_closed(false);
+ m_end = std::numeric_limits<T>::infinity();
+ m_end.set_closed(false);
+ }
+ bool is_infinity() const
+ {
+ return m_begin.get_value() == -std::numeric_limits<T>::infinity() &&
+ m_end.get_value() == std::numeric_limits<T>::infinity();
+ }
+
/**
* \brief intersection of two interval
* @returns intersection of two intervals
@@ -827,19 +828,19 @@
*/
-static MscTimeInterval interval_inverse(MscTimeInterval& inter)
+static MscTimeInterval interval_inverse(const MscTimeInterval& inter)
{
return MscTimeInterval(inter.get_end_closed(),-inter.get_end_value(), \
-inter.get_begin_value(), inter.get_begin_closed());
}
-static MscTimeInterval interval_intersection(MscTimeInterval left,
- MscTimeInterval right)
+static MscTimeInterval interval_intersection(
+ const MscTimeInterval& left, const MscTimeInterval& right)
{
MscIntervalCouple<T> begin;
try
{
- begin = MscIntervalCouple<T>::maximum(left.m_begin,right.m_begin);
+ begin = std::max(left.m_begin,right.m_begin);
}
catch(MscIntervalCoupleUncomparable){
begin = left.m_begin.get_value();
@@ -848,7 +849,7 @@
MscIntervalCouple<T> end;
try
{
- end = MscIntervalCouple<T>::minimum(left.m_end,right.m_end);
+ end = std::min(left.m_end,right.m_end);
}
catch(MscIntervalCoupleUncomparable){
end = left.m_end.get_value();
@@ -864,8 +865,8 @@
* @warning CHECK if the returned interval is not empty!!!
*/
-static MscTimeInterval interval_union(MscTimeInterval& left,
- MscTimeInterval& right)
+static MscTimeInterval interval_union(
+ const MscTimeInterval& left, const MscTimeInterval& right)
{
// check if they have intersection if not return empty interval
if(!interval_intersection(left,right).is_valid())
@@ -877,7 +878,7 @@
MscIntervalCouple<T> begin;
try
{
- begin = MscIntervalCouple<T>::minimum(left.m_begin,right.m_begin);
+ begin = std::min(left.m_begin,right.m_begin);
}
catch(MscIntervalCoupleUncomparable){
begin = left.m_begin.get_value();
@@ -886,7 +887,7 @@
MscIntervalCouple<T> end;
try
{
- end = MscIntervalCouple<T>::maximum(left.m_end,right.m_end);
+ end = std::max(left.m_end,right.m_end);
}
catch(MscIntervalCoupleUncomparable)
{
@@ -900,14 +901,14 @@
*@brief return max(begins) and max(ends) Interval
* Takes two itervals (a,b) (c,d) and returns Inerval(max(a,c),max(b,d))
*/
-static MscTimeInterval components_max(MscTimeInterval left,
- MscTimeInterval right)
+static MscTimeInterval components_max(
+ const MscTimeInterval& left, const MscTimeInterval& right)
{
MscIntervalCouple<T> begin;
MscIntervalCouple<T> end;
try
{
- begin = MscIntervalCouple<T>::maximum(left.m_begin,right.m_begin);
+ begin = std::max(left.m_begin,right.m_begin);
}
catch(MscIntervalCoupleUncomparable)
{
@@ -917,7 +918,7 @@
try
{
- end = MscIntervalCouple<T>::maximum(left.m_end,right.m_end);
+ end = std::max(left.m_end,right.m_end);
}
catch(MscIntervalCoupleUncomparable)
{
@@ -940,7 +941,7 @@
}
friend std::ostream&
-operator<<(std::ostream& os, const MscTimeInterval<T> interval)
+operator<<(std::ostream& os, const MscTimeInterval<T>& interval)
{
if(interval.get_begin_value() != interval.get_end_value())
{
@@ -987,8 +988,13 @@
public:
MscTimeIntervalSet(){}
- MscTimeIntervalSet(const std::string s_interval)
+ MscTimeIntervalSet(const std::string& s_interval)
{
+ assign(s_interval);
+ }
+
+ void assign(const std::string& s_interval)
+ {
std::string tmp;
for(size_t i=0;i<s_interval.length();i++)
{
@@ -1156,14 +1162,14 @@
return tmp;
}
- const MscTimeIntervalSet operator+(MscTimeIntervalSet& set)
+ const MscTimeIntervalSet operator+(const MscTimeIntervalSet& set)
{
MscTimeIntervalSet<T> new_set;
- for(typename IntervalList::iterator it=m_set.begin();
+ for(typename IntervalList::const_iterator it=m_set.begin();
it != m_set.end(); it++)
{
- for(typename IntervalList::iterator it2 = set.m_set.begin();
+ for(typename IntervalList::const_iterator it2 = set.m_set.begin();
it2 != set.m_set.end(); it2++)
{
new_set.insert(*it+*it2);
@@ -1173,14 +1179,14 @@
return new_set;
}
- MscTimeIntervalSet operator-(MscTimeIntervalSet set)
+ MscTimeIntervalSet operator-(const MscTimeIntervalSet& set)
{
MscTimeIntervalSet<T> new_set;
- for(typename IntervalList::iterator it = m_set.begin();
+ for(typename IntervalList::const_iterator it = m_set.begin();
it != m_set.end(); it++)
{
- for(typename IntervalList::iterator it2 = set.m_set.begin();
+ for(typename IntervalList::const_iterator it2 = set.m_set.begin();
it2 != set.m_set.end(); it2++)
{
new_set.insert(*it-*it2);
@@ -1221,17 +1227,39 @@
return m_set;
}
- bool is_empty()
+ bool is_empty() const
{
return m_set.empty();
}
- static MscTimeIntervalSet<T> set_union(MscTimeIntervalSet left,
- MscTimeIntervalSet right)
+ void set_infinity()
{
+ MscTimeInterval<T> interval;
+ interval.set_infinity();
+
+ m_set.clear();
+ m_set.push_back(interval);
+ }
+
+ bool is_infinity() const
+ {
+ typename IntervalList::const_iterator it;
+ // if at least one of the intervals in the union is infinite
+ for(it=m_set.begin();it!=m_set.end();it++)
+ {
+ if(it->is_infinity())
+ return true;
+ }
+
+ return false;
+ }
+
+ static MscTimeIntervalSet<T> set_union(
+ const MscTimeIntervalSet& left, const MscTimeIntervalSet& right)
+ {
MscTimeIntervalSet<T> new_set;
new_set.m_set = left.m_set;
- for(typename IntervalList::iterator it = right.m_set.begin();
+ for(typename IntervalList::const_iterator it = right.m_set.begin();
it != right.m_set.end(); it++)
{
new_set.insert(*it);
@@ -1239,14 +1267,14 @@
return new_set;
}
- static MscTimeIntervalSet<T> set_intersection(MscTimeIntervalSet left,
- MscTimeIntervalSet right)
+ static MscTimeIntervalSet<T> set_intersection(
+ const MscTimeIntervalSet& left, const MscTimeIntervalSet& right)
{
MscTimeIntervalSet<T> new_set;
- for(typename IntervalList::iterator it = left.m_set.begin();
+ for(typename IntervalList::const_iterator it = left.m_set.begin();
it != left.m_set.end(); it++)
{
- for(typename IntervalList::iterator it2 = right.m_set.begin();
+ for(typename IntervalList::const_iterator it2 = right.m_set.begin();
it2 != right.m_set.end(); it2++)
{
MscTimeInterval<T> tmp;
@@ -1260,14 +1288,14 @@
return new_set;
}
- static MscTimeIntervalSet<T> components_max(MscTimeIntervalSet left,
- MscTimeIntervalSet right)
+ static MscTimeIntervalSet<T> components_max(
+ const MscTimeIntervalSet& left, const MscTimeIntervalSet& right)
{
MscTimeIntervalSet<T> new_set;
- for(typename IntervalList::iterator it = left.m_set.begin();
+ for(typename IntervalList::const_iterator it = left.m_set.begin();
it != left.m_set.end(); it++)
{
- for(typename IntervalList::iterator it2 = right.m_set.begin();
+ for(typename IntervalList::const_iterator it2 = right.m_set.begin();
it2 != right.m_set.end(); it2++)
{
MscTimeInterval<T> tmp;
@@ -1279,10 +1307,10 @@
return new_set;
}
- static MscTimeIntervalSet interval_inverse(MscTimeIntervalSet inter)
+ static MscTimeIntervalSet interval_inverse(const MscTimeIntervalSet& inter)
{
MscTimeIntervalSet<T> new_set;
- for(typename IntervalList::iterator it = inter.m_set.begin();
+ for(typename IntervalList::const_iterator it = inter.m_set.begin();
it != inter.m_set.end(); it++)
{
new_set.insert(MscTimeInterval<T>::interval_inverse(*it));
@@ -1298,8 +1326,8 @@
* appropriate right boundary ("]" or ")")
*
*/
- static MscTimeIntervalSet<T> zero_max_interval(MscTimeIntervalSet left,
- MscTimeIntervalSet right)
+ static MscTimeIntervalSet<T> zero_max_interval(
+ const MscTimeIntervalSet& left, const MscTimeIntervalSet& right)
{
MscTimeIntervalSet<T> inter = set_intersection(left,right);
if(inter.is_empty())
@@ -1332,7 +1360,7 @@
* @return stream with printed interval set
*/
friend std::ostream&
-operator<<(std::ostream& os, const MscTimeIntervalSet<T> interval)
+operator<<(std::ostream& os, const MscTimeIntervalSet<T>& interval)
{
if(interval.m_set.empty())
return os << "";
Modified: trunk/src/view/visio/addon/extract.cpp
===================================================================
--- trunk/src/view/visio/addon/extract.cpp 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/view/visio/addon/extract.cpp 2010-01-28 21:35:53 UTC (rev 558)
@@ -587,7 +587,7 @@
case ST_TIME_INTERVAL:
case ST_TIME_DIRECTED:
{
- TimeRelationEvent *new_relation = new TimeRelationEvent(MscTimeIntervalSetD(std::string(shape->Text)));
+ TimeRelationEvent *new_relation = new TimeRelationEvent((const char*)shape->Text);
new_relation->set_directed(type == ST_TIME_DIRECTED);
new_relation->set_width(GetControlPos(shape, _T("Width")));
time_relations[shape->ID] = new_relation;
@@ -1339,7 +1339,7 @@
case ST_TIME_INTERVAL:
case ST_TIME_DIRECTED:
{
- TimeRelationRefNode *new_relation = new TimeRelationRefNode(MscTimeIntervalSetD(std::string(shape->Text)));
+ TimeRelationRefNode *new_relation = new TimeRelationRefNode((const char*)shape->Text);
new_relation->set_directed(type == ST_TIME_DIRECTED);
new_relation->set_width(GetControlPos(shape, _T("Width")));
time_relations[shape->ID] = new_relation;
Modified: trunk/src/view/visio/addon/visualize.cpp
===================================================================
--- trunk/src/view/visio/addon/visualize.cpp 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/src/view/visio/addon/visualize.cpp 2010-01-28 21:35:53 UTC (rev 558)
@@ -346,10 +346,7 @@
if(time_relation->get_marked())
MarkShape(result);
- std::stringstream text;
- // extract textual representation of the constraint
- text << time_relation->get_interval_set();
- result->Text = text.str().c_str();
+ result->Text = time_relation->get_label().c_str();
return result;
}
Modified: trunk/tests/interval_test.cpp
===================================================================
--- trunk/tests/interval_test.cpp 2010-01-25 19:28:16 UTC (rev 557)
+++ trunk/tests/interval_test.cpp 2010-01-28 21:35:53 UTC (rev 558)
@@ -25,8 +25,8 @@
catch(MscIntervalCoupleUncomparable ex)
{
}
- TEST_ASSERT(couple1==MscIntervalCouple<double>::minimum(couple1,couple2))
- TEST_ASSERT(couple2==MscIntervalCouple<double>::maximum(couple1,couple2))
+ TEST_ASSERT(couple1==std::min(couple1,couple2))
+ TEST_ASSERT(couple2==std::max(couple1,couple2))
MscIntervalCouple<double> couple4(false,0);
couple4=couple1+couple2;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-02-04 11:54:10
|
Revision: 564
http://scstudio.svn.sourceforge.net/scstudio/?rev=564&view=rev
Author: madzin
Date: 2010-02-04 11:54:01 +0000 (Thu, 04 Feb 2010)
Log Message:
-----------
Changes remove_minimal_events, remove_maximal_events
Modified Paths:
--------------
trunk/src/data/msc.h
trunk/tests/z120_test/z120_test11.mpr.result
trunk/tests/z120_test/z120_test69.mpr.result
trunk/tests/z120_test/z120_test86.mpr.result
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2010-02-03 13:44:07 UTC (rev 563)
+++ trunk/src/data/msc.h 2010-02-04 11:54:01 UTC (rev 564)
@@ -2299,8 +2299,21 @@
*/
void remove_minimal_event(CoregionEvent* e)
{
- std::remove_if(m_minimal_events.begin(), m_minimal_events.end(),
- std::bind2nd(std::equal_to<CoregionEvent*>(), e));
+ CoregionEventPVector::iterator it,it_d;
+
+ bool remove = false;
+
+ for(it = m_minimal_events.begin(); it != m_minimal_events.end(); it++)
+ {
+ if(*it == e)
+ {
+ it_d = it;
+ remove = true;
+ }
+ }
+
+ if(remove)
+ m_minimal_events.erase(it_d);
}
/**
@@ -2318,8 +2331,21 @@
*/
void remove_maximal_event(CoregionEvent* e)
{
- std::remove_if(m_maximal_events.begin(), m_maximal_events.end(),
- std::bind2nd(std::equal_to<CoregionEvent*>(), e));
+ CoregionEventPVector::iterator it,it_d;
+
+ bool remove = false;
+
+ for(it = m_maximal_events.begin(); it != m_maximal_events.end(); it++)
+ {
+ if(*it == e)
+ {
+ it_d = it;
+ remove = true;
+ }
+ }
+
+ if(remove)
+ m_maximal_events.erase(it_d);
}
bool is_empty()
Modified: trunk/tests/z120_test/z120_test11.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test11.mpr.result 2010-02-03 13:44:07 UTC (rev 563)
+++ trunk/tests/z120_test/z120_test11.mpr.result 2010-02-04 11:54:01 UTC (rev 564)
@@ -18,9 +18,9 @@
in ACK,2 from PC;
concurrent;
in request_a,3 from PC before e0;
+in request_b,4 from PC;
label e0;
out result,5 to PC;
-in request_b,4 from PC;
endconcurrent;
endinstance;
endmsc;
Modified: trunk/tests/z120_test/z120_test69.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test69.mpr.result 2010-02-03 13:44:07 UTC (rev 563)
+++ trunk/tests/z120_test/z120_test69.mpr.result 2010-02-04 11:54:01 UTC (rev 564)
@@ -20,11 +20,11 @@
in ACK,2 from PC;
concurrent;
in request_a,3 from PC before e0, e1;
+in request_b,4 from PC;
label e0;
out result,5 to PC;
label e1;
;
-in request_b,4 from PC;
endconcurrent;
endinstance;
endmsc;
Modified: trunk/tests/z120_test/z120_test86.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test86.mpr.result 2010-02-03 13:44:07 UTC (rev 563)
+++ trunk/tests/z120_test/z120_test86.mpr.result 2010-02-04 11:54:01 UTC (rev 564)
@@ -11,12 +11,12 @@
inst NAME2;
NAME1: instance;
concurrent;
+in a,0 from NAME2;
+in a,1 from found before e0;
label e0;
+out b,2 to NAME2 before e1;
+label e1;
;
-in a,0 from NAME2;
-in a,1 from found before e1;
-label e1;
-out b,2 to NAME2 before e0;
endconcurrent;
endinstance;
NAME2: instance;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-02-06 18:15:51
|
Revision: 572
http://scstudio.svn.sourceforge.net/scstudio/?rev=572&view=rev
Author: madzin
Date: 2010-02-06 18:15:30 +0000 (Sat, 06 Feb 2010)
Log Message:
-----------
Adds tests for membership and refactoring
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/test_bmsc14_2.mpr
trunk/tests/membership/test_hmsc14.mpr
Added Paths:
-----------
trunk/tests/membership/test_bmsc17_1.mpr
trunk/tests/membership/test_bmsc17_2.mpr
trunk/tests/membership/test_bmsc18_1.mpr
trunk/tests/membership/test_bmsc18_2.mpr
trunk/tests/membership/test_bmsc18_3.mpr
trunk/tests/membership/test_bmsc19.mpr
trunk/tests/membership/test_hmsc17.mpr
trunk/tests/membership/test_hmsc18.mpr
trunk/tests/membership/test_hmsc19.mpr
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-02-06 17:25:43 UTC (rev 571)
+++ trunk/src/membership/membership_alg.cpp 2010-02-06 18:15:30 UTC (rev 572)
@@ -46,6 +46,8 @@
bool look_at_checked_conf(ReferenceNodePtr node, ConfigurationPtr b);
+bool check_instance(InstancePtr node_instance, PositionPtr b_position);
+
/*
* Returns precondition list of the membership algorithm
*/
@@ -194,11 +196,6 @@
for (b_position_it = b_positions.begin(); b_position_it != b_positions.end();
b_position_it++)
{
- b_events = (*b_position_it)->get_events();
-
- if (!b_events.size() == 1)
- return false;
-
name = (*b_position_it)->get_name();
for (node_instence_it = node_instances.begin();
@@ -211,126 +208,14 @@
}
}
- if (node_instance != NULL)
- node_area = node_instance->get_first();
- else
- {
- //remember position and continue in cycle
- continue;
- }
+ if (node_instance == NULL)
+ continue; //remember position and continue in cycle
- StrictEvent* b_event = dynamic_cast<StrictEvent*> (b_events[0]);
- StrictOrderAreaPtr b_strict;
- CoregionAreaPtr node_coregion, b_coregion;
-
- if (b_event != NULL)
+ if(!check_instance(node_instance, *b_position_it))
{
- b_area = b_strict = b_event->get_area();
+ add_checked_branch(node, b);
+ return false;
}
- else
- {
- CoregionEvent* b_cor = dynamic_cast<CoregionEvent*> (b_events[0]);
- b_area = b_coregion = b_cor->get_area();
- }
-
- StrictOrderAreaPtr node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
-
- if (node_strict == NULL)
- {
- node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
- node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
- node_coregion->get_minimal_events().end());
- }
- else
- {
- if (node_events.empty())
- node_events.push_back(node_strict->get_first().get());
- else
- std::cout << "node_events should be empty" << std::endl;
- }
-
- bool result;
-
- while (node_area != NULL && b_area != NULL)
- {
- switch ((node_strict != NULL) + (b_strict != NULL))
- {
- case 2:
- result = strict_strict(node_events, b_events);
- break;
-
- case 1:
- if (node_strict != NULL)
- result = strict_coregion(node_strict, node_events, b_coregion, b_events);
- else
- result = coregion_strict(node_events, b_events);
- break;
-
- case 0:
- result = coregion_coretion(node_coregion, node_events, b_coregion, b_events);
- break;
- }
-
- if (result)
- {
- if (node_events.empty())
- {
- node_area = node_area->get_next();
-
- if (node_area != NULL)
- {
- node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
-
- if (node_strict == NULL)
- {
- node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
- node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
- node_coregion->get_minimal_events().end());
- }
- else
- {
- node_events.push_back(node_strict->get_first().get());
- }
- }
- }
-
- if (b_events.empty())
- {
- b_area = b_area->get_next();
-
- if (b_area != NULL)
- {
- b_strict = boost::dynamic_pointer_cast<StrictOrderArea > (b_area);
-
-
- if (b_strict == NULL)
- {
- b_coregion = boost::dynamic_pointer_cast<CoregionArea > (b_area);
- b_events.insert(b_events.begin(), b_coregion->get_minimal_events().begin(),
- b_coregion->get_minimal_events().end());
- }
- else
- {
- b_events.push_back(b_strict->get_first().get());
- }
- }
- }
- }
- else
- {
- add_checked_branch(node, b);
- return false;
- }
-
- }
-
- if ((node_area != NULL) && (b_area == NULL))
- return false;
-
- if (node_area == NULL)
- (*b_position_it)->set_events(b_events);
-
-
}
NodeRelationPtrVector successors = node->get_successors();
@@ -795,3 +680,131 @@
return true;
}
+
+/*
+ * Checks instance
+ */
+bool check_instance(InstancePtr node_instance, PositionPtr b_position)
+{
+ std::vector<Event*> node_events, b_events;
+ EventAreaPtr node_area, b_area;
+ std::wstring name;
+
+ b_events = b_position->get_events();
+
+ if (!b_events.size() == 1)
+ return false;
+
+ if (node_instance != NULL)
+ node_area = node_instance->get_first();
+
+ StrictEvent* b_event = dynamic_cast<StrictEvent*> (b_events[0]);
+ StrictOrderAreaPtr b_strict;
+ CoregionAreaPtr node_coregion, b_coregion;
+
+ if (b_event != NULL)
+ {
+ b_area = b_strict = b_event->get_area();
+ }
+ else
+ {
+ CoregionEvent* b_cor = dynamic_cast<CoregionEvent*> (b_events[0]);
+ b_area = b_coregion = b_cor->get_area();
+ }
+
+ StrictOrderAreaPtr node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
+
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ if (node_events.empty())
+ node_events.push_back(node_strict->get_first().get());
+ else
+ std::cout << "node_events should be empty" << std::endl;
+ }
+
+ bool result;
+
+ while (node_area != NULL && b_area != NULL)
+ {
+ switch ((node_strict != NULL) + (b_strict != NULL))
+ {
+ case 2:
+ result = strict_strict(node_events, b_events);
+ break;
+
+ case 1:
+ if (node_strict != NULL)
+ result = strict_coregion(node_strict, node_events, b_coregion, b_events);
+ else
+ result = coregion_strict(node_events, b_events);
+ break;
+
+ case 0:
+ result = coregion_coretion(node_coregion, node_events, b_coregion, b_events);
+ break;
+ }
+
+ if (result)
+ {
+ if (node_events.empty())
+ {
+ node_area = node_area->get_next();
+
+ if (node_area != NULL)
+ {
+ node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
+
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ node_events.push_back(node_strict->get_first().get());
+ }
+ }
+ }
+
+ if (b_events.empty())
+ {
+ b_area = b_area->get_next();
+
+ if (b_area != NULL)
+ {
+ b_strict = boost::dynamic_pointer_cast<StrictOrderArea > (b_area);
+
+
+ if (b_strict == NULL)
+ {
+ b_coregion = boost::dynamic_pointer_cast<CoregionArea > (b_area);
+ b_events.insert(b_events.begin(), b_coregion->get_minimal_events().begin(),
+ b_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ b_events.push_back(b_strict->get_first().get());
+ }
+ }
+ }
+ }
+ else
+ return false;
+
+ }
+
+ if ((node_area != NULL) && (b_area == NULL))
+ return false;
+
+ if (node_area == NULL)
+ b_position->set_events(b_events);
+
+ return true;
+}
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-02-06 17:25:43 UTC (rev 571)
+++ trunk/src/membership/membership_alg.h 2010-02-06 18:15:30 UTC (rev 572)
@@ -325,7 +325,7 @@
/**
* Cleans up no more needed attributes.
*/
- void cleanup_attributes();
+ void cleanup_attributes() {}
};
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-02-06 17:25:43 UTC (rev 571)
+++ trunk/tests/membership/CMakeLists.txt 2010-02-06 18:15:30 UTC (rev 572)
@@ -64,7 +64,7 @@
ADD_TEST(membership_test-23 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_1.mpr 1)
-ADD_TEST(membership_test-24 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_2.mpr 1)
+ADD_TEST(membership_test-24 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_2.mpr 0)
ADD_TEST(membership_test-25 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc14.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc14_3.mpr 0)
@@ -81,3 +81,26 @@
ADD_TEST(membership_test-31 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc16.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc16_3.mpr 0)
ADD_TEST(membership_test-32 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc11.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc11_5.mpr 1)
+
+ADD_TEST(membership_test-33 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc17.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc17_1.mpr 1)
+
+ADD_TEST(membership_test-34 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc17.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc17_2.mpr 0)
+
+ADD_TEST(membership_test-35 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_1.mpr 1)
+
+ADD_TEST(membership_test-36 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_2.mpr 1)
+
+ADD_TEST(membership_test-37 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_3.mpr 0)
+
+ADD_TEST(membership_test-38 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc19.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc19.mpr 1)
+
+#test bMSC x bMSC
+ADD_TEST(membership_test-39 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc19.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc19.mpr 1)
+
+ADD_TEST(membership_test-40 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_1.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc12_1.mpr 1)
+
+ADD_TEST(membership_test-41 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc13_1.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc13_1.mpr 1)
+
+ADD_TEST(membership_test-42 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc15_1.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc15_1.mpr 1)
+
+
Modified: trunk/tests/membership/test_bmsc14_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc14_2.mpr 2010-02-06 17:25:43 UTC (rev 571)
+++ trunk/tests/membership/test_bmsc14_2.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -3,16 +3,19 @@
inst Lock;
inst Key;
inst Private;
+
Lock: instance;
in aaa,0 from Private;
in ccc,1 from Key;
out ddd,2 to Private;
out bbb,3 to Key;
endinstance;
+
Key: instance;
out ccc,1 to Lock;
in bbb,3 from Lock;
endinstance;
+
Private: instance;
out aaa,0 to Lock;
in ddd,2 from Lock;
Added: trunk/tests/membership/test_bmsc17_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc17_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc17_1.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+msc Test;
+A:instance;
+out a,0 to B;
+out a,1 to B;
+endinstance;
+
+B:instance;
+in a,1 from A;
+in a,0 from A;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc17_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc17_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc17_2.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,11 @@
+msc Test;
+A:instance;
+out a,0 to B;
+out a,1 to B;
+endinstance;
+
+B:instance;
+in a,0 from A;
+in a,1 from A;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc18_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc18_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc18_1.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,24 @@
+mscdocument Drawing1;
+msc print;
+inst Tic;
+inst Tac;
+
+Tic: instance;
+in a,0 from Tac;
+in b,1 from Tac;
+in a,2 from Tac;
+in c,3 from Tac;
+in a,4 from Tac;
+endinstance;
+
+
+
+
+Tac: instance;
+out a,0 to Tic;
+out b,1 to Tic;
+out a,2 to Tic;
+out c,3 to Tic;
+out a,4 to Tic;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc18_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc18_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc18_2.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,24 @@
+mscdocument Drawing1;
+msc print;
+inst Tic;
+inst Tac;
+
+Tic: instance;
+in a,0 from Tac;
+in c,1 from Tac;
+in a,2 from Tac;
+in b,3 from Tac;
+in a,4 from Tac;
+endinstance;
+
+
+
+
+Tac: instance;
+out a,0 to Tic;
+out b,3 to Tic;
+out a,4 to Tic;
+out c,1 to Tic;
+out a,2 to Tic;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc18_3.mpr
===================================================================
--- trunk/tests/membership/test_bmsc18_3.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc18_3.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,24 @@
+mscdocument Drawing1;
+msc print;
+inst Tic;
+inst Tac;
+
+Tic: instance;
+in a,0 from Tac;
+in c,1 from Tac;
+in a,2 from Tac;
+in b,3 from Tac;
+in a,4 from Tac;
+endinstance;
+
+
+
+
+Tac: instance;
+out a,0 to Tic;
+out c,1 to Tic;
+out a,2 to Tic;
+out b,3 to Tic;
+out a,4 to Tic;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc19.mpr
===================================================================
--- trunk/tests/membership/test_bmsc19.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc19.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,24 @@
+mscdocument rozcvicka_bmsc.vsd;
+msc cele;
+inst Client;
+inst Proxy;
+inst Application_server;
+Client: instance;
+out Register,0 to Proxy;
+in Response,1 from Proxy;
+out Message,2 to Application_server;
+in Response,3 from Application_server;
+endinstance;
+Proxy: instance;
+in Register,0 from Client;
+out Response,1 to Client;
+out Register,4 to Application_server;
+in Response,5 from Application_server;
+endinstance;
+Application_server: instance;
+in Register,4 from Proxy;
+out Response,5 to Proxy;
+in Message,2 from Client;
+out Response,3 to Client;
+endinstance;
+endmsc;
Modified: trunk/tests/membership/test_hmsc14.mpr
===================================================================
--- trunk/tests/membership/test_hmsc14.mpr 2010-02-06 17:25:43 UTC (rev 571)
+++ trunk/tests/membership/test_hmsc14.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -3,6 +3,7 @@
inst Lock;
inst Private;
inst Key;
+
Lock: instance;
concurrent;
in aaa,0 from Private before e0;
@@ -13,15 +14,18 @@
out ddd,3 to Private;
endconcurrent;
endinstance;
+
Private: instance;
out aaa,0 to Lock;
in ddd,3 from Lock;
endinstance;
+
Key: instance;
in bbb,2 from Lock;
out ccc,1 to Lock;
endinstance;
endmsc;
+
msc Page_1;
initial connect L0;
L0: reference Test connect L1;
Added: trunk/tests/membership/test_hmsc17.mpr
===================================================================
--- trunk/tests/membership/test_hmsc17.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc17.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,17 @@
+msc Page_1;
+initial connect L0;
+L0: reference Test connect L1;
+L1: final;
+endmsc;
+
+msc Test;
+A:instance;
+out a,0 to B;
+out a,1 to B;
+endinstance;
+
+B:instance;
+in a,1 from A;
+in a,0 from A;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_hmsc18.mpr
===================================================================
--- trunk/tests/membership/test_hmsc18.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc18.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,30 @@
+mscdocument Drawing1;
+msc print;
+inst Tic;
+inst Tac;
+Tic: instance;
+concurrent;
+in a,0 from Tac before e0;
+in a,1 from Tac before e1;
+in a,2 from Tac;
+label e0;
+in b,3 from Tac;
+label e1;
+in c,4 from Tac;
+endconcurrent;
+endinstance;
+
+Tac: instance;
+out a,0 to Tic;
+out b,3 to Tic;
+out a,1 to Tic;
+out c,4 to Tic;
+out a,2 to Tic;
+endinstance;
+
+endmsc;
+msc Page_1;
+initial connect L0;
+L0: reference print connect L1;
+L1: final;
+endmsc;
Added: trunk/tests/membership/test_hmsc19.mpr
===================================================================
--- trunk/tests/membership/test_hmsc19.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc19.mpr 2010-02-06 18:15:30 UTC (rev 572)
@@ -0,0 +1,54 @@
+mscdocument rozcvicka_hmsc.vsd;
+msc HMSC;
+initial connect L0;
+L0: reference Registration connect L1;
+L1: connect L2, L3;
+L2: reference Query_OK connect L1;
+L3: final;
+endmsc;
+
+msc Registration;
+initial connect L0;
+L0: reference Client_registration connect L1;
+L1: reference Server_registration connect L2;
+L2: final;
+endmsc;
+
+msc Client_registration;
+inst Client;
+inst Proxy;
+Client: instance;
+out Register,0 to Proxy;
+in Response,1 from Proxy;
+endinstance;
+Proxy: instance;
+in Register,0 from Client;
+out Response,1 to Client;
+endinstance;
+endmsc;
+
+msc Server_registration;
+inst Application_server;
+inst Proxy;
+Application_server: instance;
+in Register,0 from Proxy;
+out Response,1 to Proxy;
+endinstance;
+Proxy: instance;
+out Register,0 to Application_server;
+in Response,1 from Application_server;
+endinstance;
+endmsc;
+
+msc Query_OK;
+inst Client;
+inst Application_server;
+Client: instance;
+out Message,0 to Application_server;
+in Response,1 from Application_server;
+endinstance;
+Application_server: instance;
+in Message,0 from Client;
+out Response,1 to Client;
+endinstance;
+endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <va...@us...> - 2010-02-10 20:47:07
|
Revision: 582
http://scstudio.svn.sourceforge.net/scstudio/?rev=582&view=rev
Author: vacek
Date: 2010-02-10 20:46:58 +0000 (Wed, 10 Feb 2010)
Log Message:
-----------
Halfway to multiple results of checkers - interface change. Behaviour to be done.
Modified Paths:
--------------
trunk/src/check/boundedness/universal_boundedness_checker.cpp
trunk/src/check/boundedness/universal_boundedness_checker.h
trunk/src/check/liveness/deadlock_checker.cpp
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/localchoice/local_choice_checker.cpp
trunk/src/check/localchoice/local_choice_checker.h
trunk/src/check/order/acyclic_checker.cpp
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/check/realizability/realizability_checker.cpp
trunk/src/check/realizability/realizability_checker.h
trunk/src/check/structure/name_checker.cpp
trunk/src/check/structure/name_checker.h
trunk/src/check/structure/nonrecursivity_checker.cpp
trunk/src/check/structure/nonrecursivity_checker.h
trunk/src/check/time/constraint_syntax.cpp
trunk/src/check/time/constraint_syntax.h
trunk/src/check/time/time_consistency.h
trunk/src/data/checker.h
trunk/src/data/hmsc_reference_checker.h
trunk/src/view/visio/addon/document.cpp
trunk/tests/acyclic_checker_test.cpp
trunk/tests/checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
trunk/tests/local_choice_checker_test.cpp
trunk/tests/race_checker_test.cpp
trunk/tests/universal_boundedness_checker_test.cpp
Modified: trunk/src/check/boundedness/universal_boundedness_checker.cpp
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/boundedness/universal_boundedness_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -147,7 +147,7 @@
return p;
}
-HMscPtr UniversalBoundednessChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> UniversalBoundednessChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
DFSHMscTraverser name_traverser("UB_color");
NameCollector name_collector;
@@ -191,8 +191,9 @@
msc_traverser.add_white_node_found_listener(&cleaner);
msc_traverser.traverse(transformed);
-
- return p;
+ std::list<HMscPtr> result;
+ result.push_back(p);
+ return result;
}
void UniversalBoundednessChecker::cleanup_attributes()
Modified: trunk/src/check/boundedness/universal_boundedness_checker.h
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/boundedness/universal_boundedness_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -155,7 +155,7 @@
/**
* Checks whether hmsc satisfy universal boundedness property.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/liveness/deadlock_checker.cpp
===================================================================
--- trunk/src/check/liveness/deadlock_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/liveness/deadlock_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -145,7 +145,7 @@
return example;
}
-HMscPtr DeadlockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> DeadlockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
//this will be used do show eventual counterexample
HMscPtr p;
@@ -163,7 +163,9 @@
p = create_counter_example(traverser.get_reached_elements());
traverser.cleanup_traversing_attributes();
}
- return p;
+ std::list<HMscPtr> result;
+ result.push_back(p);
+ return result;
}
void DeadlockChecker::cleanup_attributes()
Modified: trunk/src/check/liveness/deadlock_checker.h
===================================================================
--- trunk/src/check/liveness/deadlock_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/liveness/deadlock_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -142,7 +142,7 @@
/**
* Checks whether hmsc satisfy deadlock free property.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/liveness/livelock_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -66,7 +66,7 @@
return result;
}
-HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
//mark nodes that path to EndNode exists from
@@ -87,7 +87,9 @@
{
p = create_counter_example(traverser.get_reached_elements());
}
- return p;
+ std::list<HMscPtr> result;
+ result.push_back(p);
+ return result;
}
LivelockChecker::LivelockChecker()
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/liveness/livelock_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -119,7 +119,7 @@
~LivelockChecker();
- HMscPtr check(HMscPtr h, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr h, ChannelMapperPtr chm);
void cleanup_attributes();
Modified: trunk/src/check/localchoice/local_choice_checker.cpp
===================================================================
--- trunk/src/check/localchoice/local_choice_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/localchoice/local_choice_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -205,7 +205,7 @@
}
-HMscPtr LocalChoiceChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> LocalChoiceChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr transformed = m_graph_duplicator.duplicate_hmsc(hmsc);
DFSRefNodeHMscTraverser ref_traverser;
@@ -241,7 +241,10 @@
ref_traverser.add_white_node_found_listener(&cl_list);
ref_traverser.traverse(transformed);
m_graph_duplicator.cleanup_attributes();
- return p;
+
+ std::list<HMscPtr> result;
+ result.push_back(p);
+ return result;
}
void LocalChoiceChecker::cleanup_attributes(void)
Modified: trunk/src/check/localchoice/local_choice_checker.h
===================================================================
--- trunk/src/check/localchoice/local_choice_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/localchoice/local_choice_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -144,7 +144,7 @@
/**
* Checks whether hmsc satisfy universal boundedness property.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/order/acyclic_checker.cpp
===================================================================
--- trunk/src/check/order/acyclic_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/order/acyclic_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -47,7 +47,7 @@
return new_bmsc;
}
-BMscPtr AcyclicChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
+std::list<BMscPtr> AcyclicChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
{
AcyclicCheckerListener listener;
DFSEventsTraverser traverser;
@@ -61,7 +61,9 @@
{
result = create_counter_example(bmsc,traverser.get_reached_elements());
}
- return result;
+ std::list<BMscPtr> res;
+ res.push_back(result);
+ return res;
}
void AcyclicChecker::cleanup_attributes()
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/order/acyclic_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -80,7 +80,7 @@
/**
* Checks whether bmsc has acyclic events' dependecy
*/
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr chm);
+ std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/order/fifo_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -45,7 +45,7 @@
return new_bmsc;
}
-BMscPtr FifoChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
+std::list<BMscPtr> FifoChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
ChannelMapperPtr chm = mapper->copy();
VisualClosureInitiator closure_initiator;
@@ -73,12 +73,16 @@
{
result = create_counter_example(bmsc,topology[e],topology[f]);
cleanup_attributes();
- return result;
+ std::list<BMscPtr> res;
+ res.push_back(result);
+ return res;
}
}
}
cleanup_attributes();
- return result;
+ std::list<BMscPtr> res;
+ res.push_back(result);
+ return res;
}
void FifoChecker::cleanup_attributes()
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/order/fifo_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -114,7 +114,7 @@
/**
* Checks whether bmsc contains overtaking messages.
*/
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper);
+ std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr mapper);
void cleanup_attributes();
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/race/race_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -305,11 +305,13 @@
return result;
}
-BMscPtr RaceChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
+std::list<BMscPtr> RaceChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
BMscPtr b = check_bmsc(bmsc,mapper);
cleanup_attributes();
- return b;
+ std::list<BMscPtr> result;
+ result.push_back(b);
+ return result;
}
void RaceChecker::cleanup_attributes()
@@ -337,7 +339,7 @@
}
-HMscPtr RaceChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
+std::list<HMscPtr> RaceChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
{
//transform hmsc into BMsc graph
HMscPtr transformed = m_graph_duplicator.duplicate_hmsc(hmsc);
@@ -346,14 +348,18 @@
if(res.get())
{
cleanup_attributes();
- return res;
+ std::list<HMscPtr> result;
+ result.push_back(res);
+ return result;
}
//precompute possible things for race checking - e.g. MinP
prepare_hmsc(transformed,mapper);
//check hmsc to be race free
HMscPtr error = check_hmsc(transformed,mapper);
cleanup_attributes();
- return error;
+ std::list<HMscPtr> result;
+ result.push_back(error);
+ return result;
}
HMscPtr RaceChecker::check_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper)
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/race/race_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -238,9 +238,9 @@
BMscPtr check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper);
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper);
+ std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr mapper);
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr mapper);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr mapper);
void cleanup_attributes();
Modified: trunk/src/check/realizability/realizability_checker.cpp
===================================================================
--- trunk/src/check/realizability/realizability_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/realizability/realizability_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -22,9 +22,11 @@
-HMscPtr RealizabilityChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> RealizabilityChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
- return NULL;
+ std::list<HMscPtr> result;
+ result.push_back(NULL);
+ return result;
}
Modified: trunk/src/check/realizability/realizability_checker.h
===================================================================
--- trunk/src/check/realizability/realizability_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/realizability/realizability_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -59,7 +59,7 @@
/**
* Checks whether hmsc satisfy universal boundedness property.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/structure/name_checker.cpp
===================================================================
--- trunk/src/check/structure/name_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/structure/name_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -158,7 +158,7 @@
}
-BMscPtr NameChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
+std::list<BMscPtr> NameChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
{
HMscPtr hmsc1(new HMsc(L"HMsc1"));
StartNodePtr start1 = new StartNode();
@@ -170,8 +170,9 @@
start1->add_successor(r1_1.get());
r1_1->add_successor(end1.get());
r1_1->set_msc(bmsc);
+ std::list<BMscPtr> result;
- HMscPtr r = check(hmsc1, chm);
+ HMscPtr r = check(hmsc1, chm).front();
if(r)
{
DFSHMscTraverser first_node_traverser;
@@ -183,14 +184,20 @@
}
catch(FirstNodeFoundException)
{
- return dynamic_cast<ReferenceNode*>(first_node_traverser.get_reached_elements().back().back())->get_bmsc();
+ result.push_back(dynamic_cast<ReferenceNode*>(first_node_traverser.get_reached_elements().back().back())->get_bmsc());
+ return result;
+
}
- return NULL; //just to avoid compiler warning - this line is actually not reachable
+ result.push_back(NULL);
+ return result; //just to avoid compiler warning - this line is actually not reachable
}
else
- return NULL;
+ {
+ result.push_back(NULL);
+ return result;
+ }
}
-HMscPtr NameChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> NameChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
DFSHMscTraverser name_traverser, first_node_traverser;
NameListener n_ch;
@@ -199,7 +206,7 @@
MscElementPListList path_to_first;
name_traverser.add_white_node_found_listener(&n_ch);
first_node_traverser.add_white_node_found_listener(&ffnl);
-
+ std::list<HMscPtr> result;
try
{
first_node_traverser.traverse(hmsc);
@@ -219,7 +226,8 @@
p = create_duplicate_counter_example(name_traverser.get_reached_elements(), err.get_name());
name_traverser.cleanup_traversing_attributes();
m_graph_duplicator.cleanup_attributes();
- return p;
+ result.push_back(p);
+ return result;
}
catch(InconsistentNamesException)
@@ -227,9 +235,10 @@
p = create_inconsistent_counter_example(name_traverser.get_reached_elements(), path_to_first);
name_traverser.cleanup_traversing_attributes();
m_graph_duplicator.cleanup_attributes();
- return p;
+ result.push_back(p);
+ return result;
}
- return NULL;
+ return result;
}
void NameChecker::cleanup_attributes()
Modified: trunk/src/check/structure/name_checker.h
===================================================================
--- trunk/src/check/structure/name_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/structure/name_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -146,9 +146,9 @@
/**
* Checks whether a given hmsc contains consistent set of instances.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr chm);
+ std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/structure/nonrecursivity_checker.cpp
===================================================================
--- trunk/src/check/structure/nonrecursivity_checker.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/structure/nonrecursivity_checker.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -53,14 +53,14 @@
return example;
}
-HMscPtr NonrecursivityChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
+std::list<HMscPtr> NonrecursivityChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
DFSHMscTraverser recursive_traverser;
RecursivityListener rec_listener;
HMscPtr p(NULL);
recursive_traverser.add_gray_node_found_listener(&rec_listener);
+ std::list<HMscPtr> result;
-
try
{
recursive_traverser.traverse(hmsc);
@@ -69,10 +69,11 @@
{
p = create_counter_example(recursive_traverser.get_reached_elements());
recursive_traverser.cleanup_traversing_attributes();
- return p;
+ result.push_back(p);
+ return result;
}
-
- return NULL;
+ result.push_back(NULL);
+ return result;
}
void NonrecursivityChecker::cleanup_attributes()
Modified: trunk/src/check/structure/nonrecursivity_checker.h
===================================================================
--- trunk/src/check/structure/nonrecursivity_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/structure/nonrecursivity_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -77,7 +77,7 @@
/**
* Checks whether a given hmsc contains consistent set of instances.
*/
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm);
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm);
/**
* Cleans up no more needed attributes.
Modified: trunk/src/check/time/constraint_syntax.cpp
===================================================================
--- trunk/src/check/time/constraint_syntax.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/time/constraint_syntax.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -42,11 +42,12 @@
}
}
-HMscPtr ConstraintsChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
+std::list<HMscPtr> ConstraintsChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
{
+ std::list<HMscPtr> result;
// empty hmsc handler
if(!hmsc.get())
- return NULL;
+ return result;
m_changed = false;
DFSHMscFlatTraverser traverser("ConstraintsChecker");
@@ -62,19 +63,25 @@
inner_hmsc_found(m_copy,NULL);
tra.traverse(m_copy);
if(!m_changed)
- return NULL;
+ {
+ result.push_back(NULL);
+ return result;
+ }
mark();
m_tra=NULL;
- return m_copy;
+ result.push_back(m_copy);
+ return result;
}
- BMscPtr ConstraintsChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
+ std::list<BMscPtr> ConstraintsChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
+ std::list<BMscPtr> result;
BMscPtr ret;
BMscConstraintCheck checker;
ret = checker.check(bmsc);
- return ret;
+ result.push_back(ret);
+ return result;
}
void ConstraintsChecker::mark()
Modified: trunk/src/check/time/constraint_syntax.h
===================================================================
--- trunk/src/check/time/constraint_syntax.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/time/constraint_syntax.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -73,8 +73,8 @@
ConstraintsChecker(): m_changed(false)
{}
- BMscPtr check(BMscPtr, ChannelMapperPtr);
- HMscPtr check(HMscPtr, ChannelMapperPtr);
+ std::list<BMscPtr> check(BMscPtr, ChannelMapperPtr);
+ std::list<HMscPtr> check(HMscPtr, ChannelMapperPtr);
void on_new_inner_bmsc_found(BMscPtr bmsc, ReferenceNode* refNode);
Modified: trunk/src/check/time/time_consistency.h
===================================================================
--- trunk/src/check/time/time_consistency.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/check/time/time_consistency.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -215,15 +215,16 @@
return precon_list;
}
- virtual BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper)
+ virtual std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
BMscIntervalSetMatrix matrix(bmsc);
MscSolveTCSP solve;
MscSolveTCSPReport report = solve.solveTCSP(matrix);
+ std::list<BMscPtr> res_list;
// there was at least one matrix found -> consistent
if(report.csp_mtxs.size()!=0)
- return NULL;
+ return res_list;
/* ok, incosistency was found, so pick the last inconsistent
@@ -265,7 +266,8 @@
throw std::runtime_error("More than one time relation between two events");
}
- return matrix.get_modified_bmsc();
+ res_list.push_back(matrix.get_modified_bmsc());
+ return res_list;
}
virtual void cleanup_attributes()
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/data/checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -106,12 +106,12 @@
/**
* Checks HMsc against specific property.
*
- * Returns MscPathPtr with violating example if there is any in hmsc
- * otherwise HMscPathPtr is undefined.
+ * Returns a list of MscPathPtr with violating examples if there are any in hmsc
+ * otherwise the list is empty.
* @param hmsc - HMsc to be checked
* @param mapper - ChannelMapper which is chosen as delivery semantic
*/
- virtual HMscPtr check(HMscPtr hmsc, ChannelMapperPtr mapper)=0;
+ virtual std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr mapper)=0;
};
/**
@@ -133,12 +133,12 @@
/**
* Checks BMsc against specific property.
*
- * Returns BMscPtr with violating example if there is any in bmsc otherwise
- * BMscPtr is undefined.
+ * Returns a list of BMscPtr with violating examples if there are any in bmsc otherwise
+ * the list is empty.
* @param bmsc - BMsc to be checked
* @param mapper - ChannelMapper which is chosen as delivery semantic
*/
- virtual BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper)=0;
+ virtual std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr mapper)=0;
};
/**
Modified: trunk/src/data/hmsc_reference_checker.h
===================================================================
--- trunk/src/data/hmsc_reference_checker.h 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/data/hmsc_reference_checker.h 2010-02-10 20:46:58 UTC (rev 582)
@@ -64,7 +64,7 @@
if(reference_node != NULL && reference_node->get_bmsc().get() != NULL)
{
BMscPtr bmsc = reference_node->get_bmsc();
- BMscPtr counterexample = m_checker->check(bmsc, m_mapper);
+ BMscPtr counterexample = m_checker->check(bmsc, m_mapper).front(); //Warning
if(counterexample != NULL)
throw ReferenceException(reference_node, counterexample);
}
@@ -82,7 +82,7 @@
class HMscReferenceChecker: public HMscChecker
{
public:
- HMscPtr check(HMscPtr hmsc, ChannelMapperPtr chm)
+ std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr example;
@@ -104,8 +104,9 @@
reference->set_marked(true);
reference->set_msc(error.get_counterexample());
}
-
- return example;
+ std::list<HMscPtr> result;
+ result.push_back(example);
+ return result;
}
};
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/src/view/visio/addon/document.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -756,7 +756,13 @@
try
{
- BMscPtr bresult = bmsc_checker->check(bmsc, srm);
+ std::list<BMscPtr> lresult = bmsc_checker->check(bmsc, srm);
+ BMscPtr bresult;
+ if(lresult.size() > 0)
+ bresult = lresult.back();
+ else
+ bresult = NULL;
+
// note: the explicit cast is a workaround for a bug in Visual Studio .NET
result = boost::dynamic_pointer_cast<Msc>(bresult);
result_set = true;
@@ -786,7 +792,12 @@
try
{
- HMscPtr hresult = hmsc_checker->check(hmsc, srm);
+ std::list<HMscPtr> lresult = hmsc_checker->check(hmsc, srm);
+ HMscPtr hresult;
+ if(lresult.size() > 0)
+ hresult = lresult.back();
+ else
+ hresult = NULL;
result = boost::dynamic_pointer_cast<Msc>(hresult);
result_set = true;
}
Modified: trunk/tests/acyclic_checker_test.cpp
===================================================================
--- trunk/tests/acyclic_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/acyclic_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -61,8 +61,8 @@
AcyclicCheckerPtr checker = AcyclicChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
- return (print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver") &&
- print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label"));
+ return (print_result(checker->check(bmsc,srm).back(),is_sr_fifo,"sender-receiver") &&
+ print_result(checker->check(bmsc,srlm).back(),is_srl_fifo,"sender-receiver-label"));
}
bool BMscA() {
Modified: trunk/tests/checker_test.cpp
===================================================================
--- trunk/tests/checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -61,7 +61,7 @@
if(bmsc_checker != NULL && bmsc != NULL
&& checker->is_supported(srm))
{
- return bmsc_checker->check(bmsc, srm);
+ return bmsc_checker->check(bmsc, srm).back();
}
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
@@ -69,7 +69,7 @@
if(hmsc_checker != NULL && hmsc != NULL
&& checker->is_supported(srm))
{
- return hmsc_checker->check(hmsc, srm);
+ return hmsc_checker->check(hmsc, srm).back();
}
std::cerr << "ERROR: No relevant checker for " << property << std::endl;
Modified: trunk/tests/deadlock_checker_test.cpp
===================================================================
--- trunk/tests/deadlock_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/deadlock_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -44,7 +44,7 @@
ChannelMapperPtr chm;
DeadlockCheckerPtr dead = DeadlockChecker::instance();
- HMscPtr path_h1 = dead->check(h1,chm);
+ HMscPtr path_h1 = dead->check(h1,chm).back();
if(path_h1.get())
{
std::cerr << "OK: h1 contains deadlock" << std::endl;
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/fifo_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -105,8 +105,8 @@
FifoCheckerPtr checker = FifoChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
- return (print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver") &&
- print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label"));
+ return (print_result(checker->check(bmsc,srm).back(),is_sr_fifo,"sender-receiver") &&
+ print_result(checker->check(bmsc,srlm).back(),is_srl_fifo,"sender-receiver-label"));
}
bool BMscA() {
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/livelock_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -50,7 +50,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm);
+ HMscPtr path_h1 = live->check(h1,chm).back();
if(path_h1.get())
{
std::cerr << "OK: h1 contains livelock" << std::endl;
@@ -84,7 +84,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm);
+ HMscPtr path_h1 = live->check(h1,chm).back();
if(path_h1.get())
{
std::cerr << "ERROR: h1 contains livelock" << std::endl;
@@ -118,7 +118,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm);
+ HMscPtr path_h1 = live->check(h1,chm).back();
if(path_h1.get())
{
std::cerr << "ERROR: h1 contains livelock" << std::endl;
Modified: trunk/tests/local_choice_checker_test.cpp
===================================================================
--- trunk/tests/local_choice_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/local_choice_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -38,7 +38,7 @@
SRChannelMapperPtr srm = SRChannelMapper::instance();
- return print_result(checker->check(hmsc,srm),is_local_choice);
+ return print_result(checker->check(hmsc,srm).back(),is_local_choice);
}
bool HMscA() {
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2010-02-10 15:18:33 UTC (rev 581)
+++ trunk/tests/race_checker_test.cpp 2010-02-10 20:46:58 UTC (rev 582)
@@ -61,8 +61,8 @@
static RaceChecker ch;
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm ...
[truncated message content] |
|
From: <va...@us...> - 2010-02-11 09:42:44
|
Revision: 585
http://scstudio.svn.sourceforge.net/scstudio/?rev=585&view=rev
Author: vacek
Date: 2010-02-11 09:42:30 +0000 (Thu, 11 Feb 2010)
Log Message:
-----------
Multiple results bug fix + correction of tests.
Modified Paths:
--------------
trunk/src/data/hmsc_reference_checker.h
trunk/tests/acyclic_checker_test.cpp
trunk/tests/checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
trunk/tests/local_choice_checker_test.cpp
trunk/tests/race_checker_test.cpp
trunk/tests/universal_boundedness_checker_test.cpp
Modified: trunk/src/data/hmsc_reference_checker.h
===================================================================
--- trunk/src/data/hmsc_reference_checker.h 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/src/data/hmsc_reference_checker.h 2010-02-11 09:42:30 UTC (rev 585)
@@ -85,6 +85,7 @@
std::list<HMscPtr> check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr example;
+ std::list<HMscPtr> result;
DFSBMscGraphTraverser traverser;
// the descendant is expected to be BMscChecker
@@ -98,14 +99,13 @@
{
HMscPathDuplicator duplicator;
example = duplicator.duplicate_path(traverser.get_reached_elements());
+ result.push_back(example);
MscElementPtr element = duplicator.get_copy(error.get_reference().get());
ReferenceNodePtr reference = boost::dynamic_pointer_cast<ReferenceNode>(element);
reference->set_marked(true);
reference->set_msc(error.get_counterexample());
}
- std::list<HMscPtr> result;
- result.push_back(example);
return result;
}
};
Modified: trunk/tests/acyclic_checker_test.cpp
===================================================================
--- trunk/tests/acyclic_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/acyclic_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -61,8 +61,24 @@
AcyclicCheckerPtr checker = AcyclicChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
- return (print_result(checker->check(bmsc,srm).back(),is_sr_fifo,"sender-receiver") &&
- print_result(checker->check(bmsc,srlm).back(),is_srl_fifo,"sender-receiver-label"));
+ std::list<BMscPtr> result;
+ BMscPtr presult;
+ result = checker->check(bmsc,srm);
+ if(result.empty())
+ presult = NULL;
+ else
+ presult = result.back();
+ if(!print_result(presult,is_sr_fifo,"sender-receiver"))
+ return false;
+
+ result = checker->check(bmsc,srlm);
+ if(result.empty())
+ presult = NULL;
+ else
+ presult = result.back();
+ if(!print_result(presult,is_srl_fifo,"sender-receiver-label"))
+ return false;
+ return true;
}
bool BMscA() {
Modified: trunk/tests/checker_test.cpp
===================================================================
--- trunk/tests/checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -61,7 +61,11 @@
if(bmsc_checker != NULL && bmsc != NULL
&& checker->is_supported(srm))
{
- return bmsc_checker->check(bmsc, srm).back();
+ std::list<BMscPtr> result = bmsc_checker->check(bmsc, srm);
+ if(result.empty())
+ return NULL;
+ else
+ return result.back();
}
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
@@ -69,7 +73,11 @@
if(hmsc_checker != NULL && hmsc != NULL
&& checker->is_supported(srm))
{
- return hmsc_checker->check(hmsc, srm).back();
+ std::list<HMscPtr> result = hmsc_checker->check(hmsc, srm);
+ if(result.empty())
+ return NULL;
+ else
+ return result.back();
}
std::cerr << "ERROR: No relevant checker for " << property << std::endl;
Modified: trunk/tests/deadlock_checker_test.cpp
===================================================================
--- trunk/tests/deadlock_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/deadlock_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -44,7 +44,9 @@
ChannelMapperPtr chm;
DeadlockCheckerPtr dead = DeadlockChecker::instance();
- HMscPtr path_h1 = dead->check(h1,chm).back();
+ std::list<HMscPtr> result;
+ result = dead->check(h1,chm);
+ HMscPtr path_h1 = result.empty()?NULL:result.back();
if(path_h1.get())
{
std::cerr << "OK: h1 contains deadlock" << std::endl;
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/fifo_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -105,8 +105,9 @@
FifoCheckerPtr checker = FifoChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
- return (print_result(checker->check(bmsc,srm).back(),is_sr_fifo,"sender-receiver") &&
- print_result(checker->check(bmsc,srlm).back(),is_srl_fifo,"sender-receiver-label"));
+ std::list<BMscPtr> result;
+ return (print_result((result = checker->check(bmsc,srm)).empty()?NULL:result.back(),is_sr_fifo,"sender-receiver") &&
+ print_result((result = checker->check(bmsc,srlm)).empty()?NULL:result.back(),is_srl_fifo,"sender-receiver-label"));
}
bool BMscA() {
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/livelock_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -50,8 +50,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm).back();
- if(path_h1.get())
+ if(!live->check(h1,chm).empty())
{
std::cerr << "OK: h1 contains livelock" << std::endl;
return true;
@@ -84,8 +83,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm).back();
- if(path_h1.get())
+ if(!live->check(h1,chm).empty())
{
std::cerr << "ERROR: h1 contains livelock" << std::endl;
return false;
@@ -118,8 +116,7 @@
ChannelMapperPtr chm;
LivelockCheckerPtr live = LivelockChecker::instance();
- HMscPtr path_h1 = live->check(h1,chm).back();
- if(path_h1.get())
+ if(!live->check(h1,chm).empty())
{
std::cerr << "ERROR: h1 contains livelock" << std::endl;
return false;
Modified: trunk/tests/local_choice_checker_test.cpp
===================================================================
--- trunk/tests/local_choice_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/local_choice_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -38,7 +38,11 @@
SRChannelMapperPtr srm = SRChannelMapper::instance();
- return print_result(checker->check(hmsc,srm).back(),is_local_choice);
+ std::list<HMscPtr> result = checker->check(hmsc,srm);
+ if(!result.empty())
+ return print_result(result.back(),is_local_choice);
+ else
+ return print_result(NULL,is_local_choice);
}
bool HMscA() {
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/race_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -61,9 +61,25 @@
static RaceChecker ch;
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
- bool result = (print_result(ch.check(hmsc,srm).back(),is_sr_race_free,"sender-receiver") &&
- print_result(ch.check(hmsc,srlm).back(),is_srl_race_free,"sender-receiver-label"));
- return result;
+ std::list<HMscPtr> res;
+ HMscPtr presult;
+ res = ch.check(hmsc,srm);
+ if(res.empty())
+ presult = NULL;
+ else
+ presult = res.back();
+
+ if(!print_result(presult,is_sr_race_free,"sender-receiver"))
+ return false;
+
+ res = ch.check(hmsc,srlm);
+ if(res.empty())
+ presult = NULL;
+ else
+ presult = res.back();
+ if(!print_result(presult,is_srl_race_free,"sender-receiver-label"))
+ return false;
+ return true;
}
bool HMscA()
Modified: trunk/tests/universal_boundedness_checker_test.cpp
===================================================================
--- trunk/tests/universal_boundedness_checker_test.cpp 2010-02-11 09:32:03 UTC (rev 584)
+++ trunk/tests/universal_boundedness_checker_test.cpp 2010-02-11 09:42:30 UTC (rev 585)
@@ -63,8 +63,15 @@
UniversalBoundednessCheckerPtr checker = UniversalBoundednessChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
+ HMscPtr presult;
+ std::list<HMscPtr> result;
+ result = checker->check(hmsc,srm);
+ if(result.empty())
+ presult = NULL;
+ else
+ presult = result.back();
- return print_result(checker->check(hmsc,srm).back(),is_bounded);
+ return print_result(presult,is_bounded);
}
bool HMscA() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-02-11 14:54:55
|
Revision: 587
http://scstudio.svn.sourceforge.net/scstudio/?rev=587&view=rev
Author: madzin
Date: 2010-02-11 14:54:47 +0000 (Thu, 11 Feb 2010)
Log Message:
-----------
New msc ordering in parser result
Modified Paths:
--------------
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Context_Impl.h
trunk/tests/z120_test/z120_test25.mpr.result
trunk/tests/z120_test/z120_test26.mpr.result
trunk/tests/z120_test/z120_test40.mpr.result
trunk/tests/z120_test/z120_test79.mpr.result
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/src/data/Z120/Context.cpp 2010-02-11 14:54:47 UTC (rev 587)
@@ -143,6 +143,7 @@
std::vector<std::string>::iterator order_it;
Context::MscPtrMap::const_iterator mscs_it;
+
//add nonpointed HMSC
for(order_it = context->hmscs_order.begin(); order_it != context->hmscs_order.end(); order_it++)
{
@@ -150,7 +151,7 @@
if(nonpointed_it != context->nonpointed.end())
{
- for(Context::MscPtrMap::iterator mscs_it = context->mscs.lower_bound(*nonpointed_it);
+ for(mscs_it = context->mscs.lower_bound(*nonpointed_it);
mscs_it != context->mscs.upper_bound(*nonpointed_it); mscs_it++)
{
Msc* my_msc = mscs_it->second.get();
@@ -180,14 +181,21 @@
}
}
}
-
+
//add others MSC
- for(mscs_it = context->mscs.begin(); mscs_it != context->mscs.end(); mscs_it++)
+ for(order_it = context->msc_file_order.begin();
+ order_it != context->msc_file_order.end();
+ order_it++)
{
// msc's listed nonpointed have already been processed above
- if(context->nonpointed.find(mscs_it->first) != context->nonpointed.end())
+ if(context->nonpointed.find(*order_it) != context->nonpointed.end())
continue;
+
+ mscs_it = context->mscs.find(*order_it);
+ if(mscs_it == context->mscs.end())
+ continue;
+
Msc* my_msc = mscs_it->second.get();
if(my_msc != NULL){
intrusive_ptr_add_ref(my_msc);
@@ -431,7 +439,9 @@
}
if(context->mscs.find(context->msc_name) == context->mscs.end())
- {
+ {
+ context->msc_file_order.push_back(context->msc_name);
+
if(context->myBmsc == NULL)
context->hmscs_order.push_back(context->msc_name);
else
Modified: trunk/src/data/Z120/Context_Impl.h
===================================================================
--- trunk/src/data/Z120/Context_Impl.h 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/src/data/Z120/Context_Impl.h 2010-02-11 14:54:47 UTC (rev 587)
@@ -52,8 +52,11 @@
*/
typedef std::multimap<std::string, MscPtr> MscPtrMap;
MscPtrMap mscs; // map of msc in the file
+
std::vector<std::string> hmscs_order; //HMSCs order in the file
std::vector<std::string> bmscs_order; //BMSCs order in the file
+ std::vector<std::string> msc_file_order; //msc ordering in the file
+
typedef std::set<std::string> MscNameSet;
MscNameSet nonpointed; // msc which is not refered
std::map<std::string, std::set<ReferenceNodePtr> > future_reference; //map of name of nodes on which was refered and does not exist
Modified: trunk/tests/z120_test/z120_test25.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test25.mpr.result 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/tests/z120_test/z120_test25.mpr.result 2010-02-11 14:54:47 UTC (rev 587)
@@ -9,6 +9,16 @@
L1: reference Two connect L2;
L2: final;
endmsc;
+msc Two;
+inst Second;
+inst First;
+Second: instance;
+out true,0 to First;
+endinstance;
+First: instance;
+in true,0 from Second;
+endinstance;
+endmsc;
msc One;
initial connect L0;
L0: condition access connect L1;
@@ -24,13 +34,3 @@
NAME: instance;
endinstance;
endmsc;
-msc Two;
-inst Second;
-inst First;
-Second: instance;
-out true,0 to First;
-endinstance;
-First: instance;
-in true,0 from Second;
-endinstance;
-endmsc;
Modified: trunk/tests/z120_test/z120_test26.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test26.mpr.result 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/tests/z120_test/z120_test26.mpr.result 2010-02-11 14:54:47 UTC (rev 587)
@@ -7,11 +7,6 @@
L1: reference Two connect L2;
L2: final;
endmsc;
-msc One;
-initial connect L0;
-L0: condition access connect L1;
-L1: final;
-endmsc;
msc Two;
inst Second;
inst First;
@@ -22,3 +17,8 @@
in true,0 from Second;
endinstance;
endmsc;
+msc One;
+initial connect L0;
+L0: condition access connect L1;
+L1: final;
+endmsc;
Modified: trunk/tests/z120_test/z120_test40.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test40.mpr.result 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/tests/z120_test/z120_test40.mpr.result 2010-02-11 14:54:47 UTC (rev 587)
@@ -9,11 +9,6 @@
L1: reference Two connect L2;
L2: final;
endmsc;
-msc One;
-initial connect L0;
-L0: condition access connect L1;
-L1: final;
-endmsc;
msc Two;
inst Second;
inst First;
@@ -24,3 +19,8 @@
in true,0 from Second;
endinstance;
endmsc;
+msc One;
+initial connect L0;
+L0: condition access connect L1;
+L1: final;
+endmsc;
Modified: trunk/tests/z120_test/z120_test79.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test79.mpr.result 2010-02-11 10:56:33 UTC (rev 586)
+++ trunk/tests/z120_test/z120_test79.mpr.result 2010-02-11 14:54:47 UTC (rev 587)
@@ -9,6 +9,16 @@
L1: reference Denied connect L2;
L2: final;
endmsc;
+msc Denied;
+inst NAME2;
+inst NAME;
+NAME2: instance;
+out NAME,0 to NAME;
+endinstance;
+NAME: instance;
+in NAME,0 from NAME2;
+endinstance;
+endmsc;
msc Accept;
inst NAME;
inst NAME1;
@@ -19,13 +29,3 @@
out NAME,0 to NAME;
endinstance;
endmsc;
-msc Denied;
-inst NAME2;
-inst NAME;
-NAME2: instance;
-out NAME,0 to NAME;
-endinstance;
-NAME: instance;
-in NAME,0 from NAME2;
-endinstance;
-endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-02-13 20:48:32
|
Revision: 589
http://scstudio.svn.sourceforge.net/scstudio/?rev=589&view=rev
Author: gotthardp
Date: 2010-02-13 20:48:22 +0000 (Sat, 13 Feb 2010)
Log Message:
-----------
New feature: Initial implementation of MonteCarlo simulator and related enhancements. Limited functionality: only BMSC and only in text mode.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/CMakeLists.txt
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Z120.g
trunk/src/data/time.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/montecarlo/
trunk/src/montecarlo/CMakeLists.txt
trunk/src/montecarlo/export.h
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
trunk/tests/montecarlo/
trunk/tests/montecarlo/CMakeLists.txt
trunk/tests/montecarlo/montecarlo_test.cpp
trunk/tests/montecarlo/test_cycle.mpr
trunk/tests/montecarlo/test_simple.mpr
Property Changed:
----------------
trunk/src/check/
trunk/src/data/
trunk/src/membership/
trunk/tests/acyclic/
trunk/tests/deadlock/
trunk/tests/fifo/
trunk/tests/local_choice/
trunk/tests/membership/
trunk/tests/time/
trunk/tests/universal_boundedness/
trunk/tests/z120_test/
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
@@ -38,7 +38,9 @@
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS")
ENDIF(MSVC)
-FIND_PACKAGE(Boost REQUIRED)
+SET(Boost_USE_STATIC_LIBS ON)
+SET(Boost_USE_MULTITHREADED ON)
+FIND_PACKAGE(Boost COMPONENTS date_time thread REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
FIND_PACKAGE(Java)
Modified: trunk/src/CMakeLists.txt
===================================================================
--- trunk/src/CMakeLists.txt 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/src/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
@@ -1,5 +1,6 @@
ADD_SUBDIRECTORY(data)
ADD_SUBDIRECTORY(check)
ADD_SUBDIRECTORY(membership)
+ADD_SUBDIRECTORY(montecarlo)
# $Id$
Property changes on: trunk/src/check
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/src/data
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
.time.h.swp
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/src/data/Z120/Context.cpp 2010-02-13 20:48:22 UTC (rev 589)
@@ -909,7 +909,7 @@
TimeRelationEventPtr relation;
try
{
- relation = new TimeRelationEvent(MscTimeIntervalSet<double>(context->time));
+ relation = new TimeRelationEvent(context->time);
relation->set_directed(context->origin);
context->origin = false;
}
Modified: trunk/src/data/Z120/Z120.g
===================================================================
--- trunk/src/data/Z120/Z120.g 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/src/data/Z120/Z120.g 2010-02-13 20:48:22 UTC (rev 589)
@@ -1103,7 +1103,7 @@
( (('@')? ('(' | '[') (time_point)? ',')=> bounded_time
{
add_time_fun(context, (char*) $bounded_time.text->chars);
- } (measurement)?
+ }
| singular_time
{
add_time_fun(context, (char*) $singular_time.text->chars);
@@ -1139,6 +1139,7 @@
('@')? ('(' | '[')
(time_point)? ',' (time_point)?
(')' | ']')
+ (measurement)?
;
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/src/data/time.h 2010-02-13 20:48:22 UTC (rev 589)
@@ -19,6 +19,7 @@
#ifndef _TIME_H_
#define _TIME_H_
+#include "data/fcmp.h"
#include "data/export.h"
#include<limits.h>
@@ -221,41 +222,14 @@
const DecScaled operator+(const DecScaled& right) const
{
- int division = abs(m_exp-right.m_exp);
- DecScaled a = *this;
- DecScaled b = right;
-
- if(a.m_exp>b.m_exp)
- {
- a.m_mant*=ipow(10,division);
- a.m_exp-=division;
- }
- else
- {
- b.m_mant*=ipow(10,division);
- b.m_exp-=division;
- }
- return DecScaled(a.m_mant+b.m_mant,a.m_exp);
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return DecScaled(norm.first.m_mant+norm.second.m_mant, norm.first.m_exp);
}
const DecScaled operator-(const DecScaled& right) const
{
- long division = abs(m_exp-right.m_exp);
- DecScaled a = *this;
- DecScaled b = right;
-
- if(a.m_exp>b.m_exp)
- {
- a.m_mant*=ipow(10,division);
- a.m_exp-=division;
- }
- else
- {
- b.m_mant*=ipow(10,division);
- b.m_exp-=division;
- }
-
- return DecScaled(a.m_mant-b.m_mant,a.m_exp);
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return DecScaled(norm.first.m_mant-norm.second.m_mant, norm.first.m_exp);
}
const DecScaled operator*(const DecScaled& right) const
@@ -278,30 +252,46 @@
return m_mant!=right.m_mant || m_exp!=right.m_exp;
}
+ bool operator<(const DecScaled& right) const
+ {
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return norm.first.m_mant < norm.second.m_mant;
+ }
+
+ bool operator<=(const DecScaled& right) const
+ {
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return norm.first.m_mant <= norm.second.m_mant;
+ }
+
bool operator>(const DecScaled& right) const
{
- long division = abs(m_exp-right.m_exp);
- DecScaled a = *this;
- DecScaled b = right;
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return norm.first.m_mant > norm.second.m_mant;
+ }
- if(a.m_exp>b.m_exp)
- {
- a.m_mant*=ipow(10,division);
- a.m_exp-=division;
- }
- else
- {
- b.m_mant*=ipow(10,division);
- b.m_exp-=division;
- }
+ bool operator>=(const DecScaled& right) const
+ {
+ std::pair<DecScaled, DecScaled> norm = normalize(*this, right);
+ return norm.first.m_mant >= norm.second.m_mant;
+ }
- return a.m_mant>b.m_mant;
+ /**
+ * Print the number in a scientific notation
+ * http://en.wikipedia.org/wiki/Scientific_notation
+ */
+ friend std::ostream&
+ operator<<(std::ostream& os, const DecScaled& value)
+ {
+ return os << value.m_mant << "E" << value.m_exp;
}
- bool operator<(const DecScaled& right) const
+protected:
+ const std::pair<DecScaled, DecScaled>
+ normalize(const DecScaled &left, const DecScaled &right) const
{
- long division = abs(m_exp-right.m_exp);
- DecScaled a = *this;
+ long division = abs(left.m_exp-right.m_exp);
+ DecScaled a = left;
DecScaled b = right;
if(a.m_exp>b.m_exp)
@@ -315,18 +305,8 @@
b.m_exp-=division;
}
- return a.m_mant<b.m_mant;
+ return std::pair<DecScaled, DecScaled>(a, b);
}
-
- /**
- * Print the number in a scientific notation
- * http://en.wikipedia.org/wiki/Scientific_notation
- */
- friend std::ostream&
- operator<<(std::ostream& os, const DecScaled& value)
- {
- return os << value.m_mant << "E" << value.m_exp;
- }
}; // end of DecScaled class
@@ -443,6 +423,24 @@
return *this;
}
+ bool operator==(const T& right) const
+ { return m_closed && m_value == right; }
+
+ bool operator!=(const T& right) const
+ { return !m_closed || m_value != right; }
+
+ bool operator<(const T& right) const
+ { return m_value < right; }
+
+ bool operator<=(const T& right) const
+ { return (m_closed && m_value <= right) || m_value < right; }
+
+ bool operator>(const T& right) const
+ { return m_value > right; }
+
+ bool operator>=(const T& right) const
+ { return (m_closed && m_value >= right) || m_value > right; }
+
/**
* @warning: does not bother with left and right couple
*/
@@ -490,6 +488,31 @@
throw MscIntervalCoupleUncomparable();
}
};
+
+template<>
+bool MscIntervalCouple<double>::operator==(const double& right) const
+{ return m_closed && fcmp(m_value, right) == 0; }
+
+template<>
+bool MscIntervalCouple<double>::operator!=(const double& right) const
+{ return !m_closed || fcmp(m_value, right) != 0; }
+
+template<>
+bool MscIntervalCouple<double>::operator<(const double& right) const
+{ return fcmp(m_value, right) < 0; }
+
+template<>
+bool MscIntervalCouple<double>::operator<=(const double& right) const
+{ return (m_closed && fcmp(m_value, right) <= 0) || fcmp(m_value, right) < 0; }
+
+template<>
+bool MscIntervalCouple<double>::operator>(const double& right) const
+{ return fcmp(m_value, right) > 0; }
+
+template<>
+bool MscIntervalCouple<double>::operator>=(const double& right) const
+{ return (m_closed && fcmp(m_value, right) >= 0) || fcmp(m_value, right) > 0; }
+
// end of MscIntervalCouple class
template<class P>
@@ -751,6 +774,13 @@
return !((m_begin==right.m_begin)&&(m_end==right.m_end));
}
+ bool includes(const T& value) const
+ {
+ // open and closed intervals are handled by the comparison operators
+ // see MscIntervalCouple<>::operator <=
+ return m_begin <= value && m_end >= value;
+ }
+
/**
* \brief tests if the interval is valid
* Tests beginning and ending value
@@ -1218,6 +1248,19 @@
return set.m_set!=this->m_set;
}
+ bool includes(const T& value) const
+ {
+ for(IntervalList::const_iterator it = m_set.begin();
+ it != m_set.end(); it++)
+ {
+ // if included in at least one of the intervals in the union
+ if(it->includes(value))
+ return true;
+ }
+
+ return false;
+ }
+
void clear(){
m_set.clear();
}
Property changes on: trunk/src/membership
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/src/montecarlo
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Added: trunk/src/montecarlo/CMakeLists.txt
===================================================================
--- trunk/src/montecarlo/CMakeLists.txt (rev 0)
+++ trunk/src/montecarlo/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,18 @@
+ADD_LIBRARY(scmontecarlo SHARED
+ export.h
+# module.cpp
+ montecarlo.cpp
+ montecarlo.h
+)
+
+TARGET_LINK_LIBRARIES(scmontecarlo
+ scmsc
+ ${Boost_LIBRARIES}
+)
+
+INSTALL(TARGETS scmontecarlo
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+
+# $Id$
Property changes on: trunk/src/montecarlo/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/montecarlo/export.h
===================================================================
--- trunk/src/montecarlo/export.h (rev 0)
+++ trunk/src/montecarlo/export.h 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,37 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCMONTECARLO_EXPORT_H
+#define _SCMONTECARLO_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scmontecarlo_EXPORTS)
+#define SCMONTECARLO_EXPORT __declspec(dllexport)
+#else
+#define SCMONTECARLO_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCMONTECARLO_EXPORT
+#endif
+
+#endif /* _SCMONTECARLO_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/montecarlo/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp (rev 0)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,269 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "montecarlo.h"
+
+double MonteCarlo::Dealer::traverse(double time_begin, const MscPtr& msc)
+{
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ if(bmsc)
+ return traverse(time_begin, bmsc);
+
+ return time_begin;
+}
+
+double MonteCarlo::Dealer::traverse(double time_begin, const BMscPtr& bmsc)
+{
+ double time_end = time_begin;
+
+ for(InstancePtrList::const_iterator instance = bmsc->get_instances().begin();
+ instance != bmsc->get_instances().end(); instance++)
+ {
+ // get instance duration
+ double itime = traverse_area(time_begin, (*instance)->get_first().get());
+ // calculate maximal duration of all instances
+ time_end = std::max(time_end, itime);
+ }
+
+ return time_end;
+}
+
+double MonteCarlo::Dealer::traverse_area(double time_begin, EventArea* area)
+{
+ if(!area)
+ return time_begin;
+
+ StrictOrderArea* strict = dynamic_cast<StrictOrderArea*>(area);
+ if(strict)
+ {
+ if(strict->is_empty())
+ // get area duration
+ return traverse_area(time_begin, strict->get_next().get());
+ else
+ // get time of the last event
+ return traverse_event(time_begin, strict->get_first().get());
+ }
+
+ CoregionArea* coregion = dynamic_cast<CoregionArea*>(area);
+ if(coregion)
+ {
+ if(coregion->is_empty())
+ // get area duration
+ return traverse_area(time_begin, coregion->get_next().get());
+ else
+ {
+ double time_end = time_begin;
+
+ for(CoregionEventPVector::const_iterator min = coregion->get_minimal_events().begin();
+ min != coregion->get_minimal_events().end(); min++)
+ {
+ // get time of the last event
+ double etime = traverse_event(time_begin, *min);
+ // find the latest event in this coregion
+ time_end = std::max(time_end, etime);
+ }
+
+ return time_end;
+ }
+ }
+
+ // this point should never be reached
+ return time_begin;
+}
+
+double MonteCarlo::Dealer::traverse_event(double time_begin, Event* event)
+{
+ double event_time = time_begin;
+
+ EventTimeMap::iterator itime = m_timestamps.find(event);
+ if(itime != m_timestamps.end())
+ {
+ if(m_completed_events.find(event) == m_completed_events.end())
+ throw std::runtime_error("Cycle detected");
+
+ event_time = std::max(time_begin, itime->second);
+ }
+
+ // store time of this event
+ m_timestamps[event] = event_time;
+
+ double time_end = event_time;
+
+ StrictEvent* strict = dynamic_cast<StrictEvent*>(event);
+ if(strict)
+ // find the latest event
+ time_end = traverse_strict_event(event_time, strict);
+
+ CoregionEvent* coregion = dynamic_cast<CoregionEvent*>(event);
+ if(coregion)
+ // find the latest event in this coregion
+ time_end = traverse_coregion_event(event_time, coregion);
+
+ m_completed_events.insert(event);
+ return time_end;
+}
+
+double MonteCarlo::Dealer::traverse_strict_event(double time_begin, StrictEvent* event)
+{
+ // store matching event time in m_timestamps
+ traverse_matching_event(time_begin, event);
+
+ if(event->get_successor().get())
+ // get time of the last event
+ return traverse_event(time_begin, event->get_successor().get());
+ else
+ // get area duration
+ return traverse_area(time_begin, event->get_area()->get_next().get());
+}
+
+double MonteCarlo::Dealer::traverse_coregion_event(double time_begin, CoregionEvent* event)
+{
+ // store matching event time in m_timestamps
+ traverse_matching_event(time_begin, event);
+
+ if(event->get_successors().size()!=0)
+ {
+ double time_end = time_begin;
+
+ const CoregEventRelPtrVector& successors = event->get_successors();
+ CoregEventRelPtrVector::const_iterator successor;
+ for(successor=successors.begin(); successor!=successors.end(); successor++)
+ {
+ // get time of the last event
+ double etime = traverse_event(time_begin, (*successor)->get_successor());
+ // find the latest event in this coregion
+ time_end = std::max(time_end, etime);
+ }
+
+ return time_end;
+ }
+ else
+ // get area duration
+ return traverse_area(time_begin, event->get_area()->get_next().get());
+}
+
+void MonteCarlo::Dealer::traverse_matching_event(double time_begin, Event* event)
+{
+ if(event->is_send() && event->get_matching_event())
+ {
+ // generate delay for this message transmission
+ double delay = m_rng();
+
+ traverse_event(time_begin+delay, event->get_matching_event());
+ // event time is stored in m_timestamps
+ }
+}
+
+MonteCarlo::MonteCarlo()
+{
+ m_process_count = 1;
+}
+
+int MonteCarlo::do_sample(boost::mt19937& seeder, const MscPtr& msc)
+{
+ Dealer dealer(seeder);
+
+ // (1) generate random timestamps
+ dealer.traverse(0, msc.get());
+
+ // (2) verify constraints and extract measurements
+ MeasurementsMap measurements;
+
+ const Dealer::EventTimeMap& timestamps = dealer.get_timestamps();
+ // walk through all timestamps
+ for(Dealer::EventTimeMap::const_iterator tpos = timestamps.begin();
+ tpos != timestamps.end(); tpos++)
+ {
+ const TimeRelationEventPtrList& relations = tpos->first->get_time_relations();
+ for(TimeRelationEventPtrList::const_iterator rpos = relations.begin();
+ rpos != relations.end(); rpos++)
+ {
+ if((*rpos)->get_event_a() != tpos->first)
+ continue;
+
+ Dealer::EventTimeMap::const_iterator tpos2 = timestamps.find((*rpos)->get_event_b());
+ assert(tpos2 != timestamps.end());
+
+ double duration = fabs(tpos->second - tpos2->second);
+
+ // directed constraint applies only to events
+ // when they dynamically occur in the direction indicated
+ if(!(*rpos)->is_directed() ||
+ /* (*rpos)->is_directed() && */ tpos->second < tpos2->second)
+ {
+ // if the constraint is violated, reject this trace
+ if(!(*rpos)->get_interval_set().includes(duration))
+ return 1; // rejected
+ }
+
+ if(!(*rpos)->get_measurement().empty())
+ measurements[(*rpos)->get_measurement()] = duration;
+ }
+ }
+
+ // the trace is accepted
+ // copy calculated measurements to the result set
+ boost::mutex::scoped_lock l(m_mutex);
+
+ m_measurements = measurements;
+ m_stoprequested = true;
+
+ return 0; // accepted
+}
+
+const MonteCarlo::MeasurementsMap& MonteCarlo::run(const MscPtr& msc)
+{
+ std::vector<boost::shared_ptr<boost::thread> > threads;
+ m_stoprequested = false;
+
+ boost::variate_generator<boost::mt19937&, boost::uniform_int<> > seed(
+ boost::mt19937((boost::int32_t)time(NULL)),
+ boost::uniform_int<>(0, MAXINT));
+
+ if(m_process_count > 1)
+ {
+ threads.resize(m_process_count-1);
+ // execute additional threads
+ for(int i = 0; i < m_process_count-1; i++)
+ threads[i].reset(new boost::thread(boost::bind(&MonteCarlo::thread_main, this, seed(), msc)));
+ }
+
+ // do also simulation execution
+ thread_main(seed(), msc);
+
+ if(m_process_count > 1)
+ {
+ // wait for the executed threads
+ for(int i = 0; i < m_process_count-1; i++)
+ threads[i]->join();
+ }
+
+ return m_measurements;
+}
+
+void MonteCarlo::thread_main(boost::int32_t seed, const MscPtr& msc)
+{
+ // pseudo-random number generators should not be initialized frequently
+ // to assure reentrance, we have one generator per thread
+ boost::mt19937 seeder(seed);
+
+ while(!m_stoprequested)
+ do_sample(seeder, msc);
+}
+
+// $Id$
Property changes on: trunk/src/montecarlo/montecarlo.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/montecarlo/montecarlo.h
===================================================================
--- trunk/src/montecarlo/montecarlo.h (rev 0)
+++ trunk/src/montecarlo/montecarlo.h 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,79 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <boost/random.hpp>
+#include <boost/thread.hpp>
+
+#include "data/msc.h"
+#include "montecarlo/export.h"
+
+class SCMONTECARLO_EXPORT MonteCarlo
+{
+public:
+
+ class Dealer
+ {
+ public:
+ Dealer(boost::mt19937& seeder) :
+ m_rng(seeder, boost::uniform_real<>(0,10))
+ { }
+
+ double traverse(double time_begin, const MscPtr& msc);
+ double traverse(double time_begin, const BMscPtr& bmsc);
+
+ typedef std::map<EventPtr, double> EventTimeMap;
+ const EventTimeMap& get_timestamps() const
+ { return m_timestamps; }
+
+ private:
+ boost::variate_generator<boost::mt19937&, boost::uniform_real<> > m_rng;
+
+ double traverse_area(double time_begin, EventArea* area);
+ double traverse_event(double time_begin, Event* event);
+ double traverse_strict_event(double time_begin, StrictEvent* event);
+ double traverse_coregion_event(double time_begin, CoregionEvent* event);
+ void traverse_matching_event(double time_begin, Event* event);
+
+ EventTimeMap m_timestamps;
+
+ typedef std::set<EventPtr> EventPtrSet;
+ EventPtrSet m_completed_events;
+ };
+
+ MonteCarlo();
+
+ void set_process_count(int i)
+ { m_process_count = i; }
+
+ int do_sample(boost::mt19937& seeder, const MscPtr& msc);
+
+ typedef std::map<std::string, double> MeasurementsMap;
+ const MeasurementsMap& run(const MscPtr& msc);
+
+ void thread_main(boost::int32_t seed, const MscPtr& msc);
+
+private:
+ int m_process_count;
+
+ volatile bool m_stoprequested;
+ boost::mutex m_mutex;
+
+ MeasurementsMap m_measurements;
+};
+
+// $Id$
Property changes on: trunk/src/montecarlo/montecarlo.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2010-02-12 08:32:16 UTC (rev 588)
+++ trunk/tests/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
@@ -85,6 +85,7 @@
ADD_SUBDIRECTORY(z120_test)
ADD_SUBDIRECTORY(membership)
+ADD_SUBDIRECTORY(montecarlo)
ADD_EXECUTABLE(checker_test
checker_test.cpp
Property changes on: trunk/tests/acyclic
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/tests/deadlock
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/tests/fifo
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/tests/local_choice
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/tests/membership
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Property changes on: trunk/tests/montecarlo
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
*.swp
Added: trunk/tests/montecarlo/CMakeLists.txt
===================================================================
--- trunk/tests/montecarlo/CMakeLists.txt (rev 0)
+++ trunk/tests/montecarlo/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,10 @@
+ADD_EXECUTABLE(montecarlo_test
+ montecarlo_test.cpp
+)
+
+TARGET_LINK_LIBRARIES(montecarlo_test
+ scmontecarlo
+ scmsc
+ scZ120
+)
+
Property changes on: trunk/tests/montecarlo/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/tests/montecarlo/montecarlo_test.cpp
===================================================================
--- trunk/tests/montecarlo/montecarlo_test.cpp (rev 0)
+++ trunk/tests/montecarlo/montecarlo_test.cpp 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,72 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <iostream>
+
+#include "data/Z120/z120.h"
+#include "montecarlo/montecarlo.h"
+
+int main(int argc, char** argv)
+{
+ if(argc < 2)
+ {
+ std::cerr << "Usage: " << argv[0] << " <filename>" << std::endl;
+ return 1;
+ }
+
+ Z120 z120;
+
+ StreamReportPrinter printer(std::wcerr);
+ z120.set_printer(&printer);
+
+ std::vector<MscPtr> msc;
+
+ try
+ {
+ msc = z120.load_msc(argv[1]);
+ }
+ catch(std::exception& exc)
+ {
+ std::cerr << "EXCEPTION: " << exc.what() << std::endl;
+ return 1;
+ }
+
+ try
+ {
+ MonteCarlo simulator;
+
+ // run the simulation
+ const MonteCarlo::MeasurementsMap& measurements = simulator.run(msc[0]);
+
+ // print the measurements
+ for(MonteCarlo::MeasurementsMap::const_iterator mpos = measurements.begin();
+ mpos != measurements.end(); mpos++)
+ {
+ std::cout << mpos->first << " = " << mpos->second << std::endl;
+ }
+ }
+ catch(std::exception& exc)
+ {
+ std::cerr << "EXCEPTION: Simulation failed: " << exc.what() << std::endl;
+ return 2;
+ }
+
+ return 0;
+}
+
+// $Id$
Property changes on: trunk/tests/montecarlo/montecarlo_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/tests/montecarlo/test_cycle.mpr
===================================================================
--- trunk/tests/montecarlo/test_cycle.mpr (rev 0)
+++ trunk/tests/montecarlo/test_cycle.mpr 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,14 @@
+mscdocument Vykres1;
+msc Stranka_1;
+inst Client;
+inst Server;
+Client: instance;
+label e0;
+in Response,1 from Client;
+out Request,0 to Server;
+endinstance;
+Server: instance;
+in Request,0 from Client;
+out Response,1 to Server;
+endinstance;
+endmsc;
Property changes on: trunk/tests/montecarlo/test_cycle.mpr
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/tests/montecarlo/test_simple.mpr
===================================================================
--- trunk/tests/montecarlo/test_simple.mpr (rev 0)
+++ trunk/tests/montecarlo/test_simple.mpr 2010-02-13 20:48:22 UTC (rev 589)
@@ -0,0 +1,14 @@
+mscdocument Vykres1;
+msc Stranka_1;
+inst Client;
+inst Server;
+Client: instance;
+label e0;
+out Request,0 to Server;
+time e1 &t1, e1 (1,2] &t2;
+endinstance;
+Server:...
[truncated message content] |
|
From: <got...@us...> - 2010-02-13 21:48:32
|
Revision: 590
http://scstudio.svn.sourceforge.net/scstudio/?rev=590&view=rev
Author: gotthardp
Date: 2010-02-13 21:48:22 +0000 (Sat, 13 Feb 2010)
Log Message:
-----------
Fix Linux build errors.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/data/time.h
trunk/src/montecarlo/CMakeLists.txt
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
+++ trunk/CMakeLists.txt 2010-02-13 21:48:22 UTC (rev 590)
@@ -38,6 +38,8 @@
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS")
ENDIF(MSVC)
+FIND_PACKAGE(Threads)
+
SET(Boost_USE_STATIC_LIBS ON)
SET(Boost_USE_MULTITHREADED ON)
FIND_PACKAGE(Boost COMPONENTS date_time thread REQUIRED)
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2010-02-13 20:48:22 UTC (rev 589)
+++ trunk/src/data/time.h 2010-02-13 21:48:22 UTC (rev 590)
@@ -360,7 +360,7 @@
return MscIntervalCouple(m_closed&&right.m_closed,m_value-right.m_value);
}
- const MscIntervalCouple operator+(const T& value) const
+ const MscIntervalCouple operator+(const T& value) const
{
return MscIntervalCouple(m_closed,m_value+value);
}
@@ -490,27 +490,27 @@
};
template<>
-bool MscIntervalCouple<double>::operator==(const double& right) const
+inline bool MscIntervalCouple<double>::operator==(const double& right) const
{ return m_closed && fcmp(m_value, right) == 0; }
template<>
-bool MscIntervalCouple<double>::operator!=(const double& right) const
+inline bool MscIntervalCouple<double>::operator!=(const double& right) const
{ return !m_closed || fcmp(m_value, right) != 0; }
template<>
-bool MscIntervalCouple<double>::operator<(const double& right) const
+inline bool MscIntervalCouple<double>::operator<(const double& right) const
{ return fcmp(m_value, right) < 0; }
template<>
-bool MscIntervalCouple<double>::operator<=(const double& right) const
+inline bool MscIntervalCouple<double>::operator<=(const double& right) const
{ return (m_closed && fcmp(m_value, right) <= 0) || fcmp(m_value, right) < 0; }
template<>
-bool MscIntervalCouple<double>::operator>(const double& right) const
+inline bool MscIntervalCouple<double>::operator>(const double& right) const
{ return fcmp(m_value, right) > 0; }
template<>
-bool MscIntervalCouple<double>::operator>=(const double& right) const
+inline bool MscIntervalCouple<double>::operator>=(const double& right) const
{ return (m_closed && fcmp(m_value, right) >= 0) || fcmp(m_value, right) > 0; }
// end of MscIntervalCouple class
@@ -1250,7 +1250,7 @@
bool includes(const T& value) const
{
- for(IntervalList::const_iterator it = m_set.begin();
+ for(typename IntervalList::const_iterator it = m_set.begin();
it != m_set.end(); it++)
{
// if included in at least one of the intervals in the union
Modified: trunk/src/montecarlo/CMakeLists.txt
===================================================================
--- trunk/src/montecarlo/CMakeLists.txt 2010-02-13 20:48:22 UTC (rev 589)
+++ trunk/src/montecarlo/CMakeLists.txt 2010-02-13 21:48:22 UTC (rev 590)
@@ -8,6 +8,7 @@
TARGET_LINK_LIBRARIES(scmontecarlo
scmsc
${Boost_LIBRARIES}
+ ${CMAKE_THREAD_LIBS_INIT}
)
INSTALL(TARGETS scmontecarlo
Modified: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp 2010-02-13 20:48:22 UTC (rev 589)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-13 21:48:22 UTC (rev 590)
@@ -231,9 +231,9 @@
std::vector<boost::shared_ptr<boost::thread> > threads;
m_stoprequested = false;
- boost::variate_generator<boost::mt19937&, boost::uniform_int<> > seed(
+ boost::variate_generator<boost::mt19937, boost::uniform_int<> > seed(
boost::mt19937((boost::int32_t)time(NULL)),
- boost::uniform_int<>(0, MAXINT));
+ boost::uniform_int<>(0, INT_MAX));
if(m_process_count > 1)
{
@@ -256,7 +256,7 @@
return m_measurements;
}
-void MonteCarlo::thread_main(boost::int32_t seed, const MscPtr& msc)
+void MonteCarlo::thread_main(unsigned int seed, const MscPtr& msc)
{
// pseudo-random number generators should not be initialized frequently
// to assure reentrance, we have one generator per thread
Modified: trunk/src/montecarlo/montecarlo.h
===================================================================
--- trunk/src/montecarlo/montecarlo.h 2010-02-13 20:48:22 UTC (rev 589)
+++ trunk/src/montecarlo/montecarlo.h 2010-02-13 21:48:22 UTC (rev 590)
@@ -65,7 +65,7 @@
typedef std::map<std::string, double> MeasurementsMap;
const MeasurementsMap& run(const MscPtr& msc);
- void thread_main(boost::int32_t seed, const MscPtr& msc);
+ void thread_main(unsigned int seed, const MscPtr& msc);
private:
int m_process_count;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2010-02-20 11:38:17
|
Revision: 602
http://scstudio.svn.sourceforge.net/scstudio/?rev=602&view=rev
Author: kocianon
Date: 2010-02-20 11:38:10 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
BMcsIntervalMatrix fix
Modified Paths:
--------------
trunk/src/check/pseudocode/utils.h
trunk/src/check/time/tightening.cpp
trunk/src/check/time/time_consistency.cpp
trunk/src/check/time/time_consistency.h
trunk/src/check/time/time_pseudocode.cpp
trunk/src/check/time/time_pseudocode.h
trunk/src/data/session_attribute.cpp
trunk/src/data/time.cpp
trunk/tests/tighten_msc_test.cpp
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/pseudocode/utils.h 2010-02-20 11:38:10 UTC (rev 602)
@@ -143,6 +143,12 @@
return m_closure_initiator.get_visual_closure(a)[m_closure_initiator.get_topology_index(b)];
}
+ const EventPVector get_topology()
+ {
+ EventPVector topology(m_topology_listener.get_topology().size());
+ topology.assign(m_topology_listener.get_topology().begin(),m_topology_listener.get_topology().end());
+ return topology;
+ }
};
template<class MscElementContainer,class AttributeType>
Modified: trunk/src/check/time/tightening.cpp
===================================================================
--- trunk/src/check/time/tightening.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/time/tightening.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -133,6 +133,7 @@
BMscPtr BMscTighter::transform(BMscPtr bmsc)
{
BMscIntervalSetMatrix matrix(bmsc);
+ matrix.build_up();
MscSolveTCSP solve;
MscSolveTCSPReport report = solve.solveTCSP(matrix);
matrix = report.m_matrix_result;
Modified: trunk/src/check/time/time_consistency.cpp
===================================================================
--- trunk/src/check/time/time_consistency.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/time/time_consistency.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -28,8 +28,7 @@
{
for(unsigned j=0; j < matrix.size1(); j++)
{
- copy(i,j) = MscTimeIntervalD::interval_intersection(copy(i,j), \
- copy(i,k)+copy(k,j));
+ copy(i,j) = MscTimeIntervalD::interval_intersection(copy(i,j), copy(i,k)+copy(k,j));
if(!copy(i,j).is_valid())
{
DEBUG(copy(i,j));
@@ -135,6 +134,7 @@
DEBUG(to_tight);
//tight
IntervalMatrix tmp = m_tightener->tight(to_tight);
+ DEBUG(tmp);
// remember both
m_report->csp_mtxs.push_back(to_tight);
m_report->csp_tighten_mtxs.push_back(tmp);
@@ -151,12 +151,16 @@
m_report= &report;
m_size = matrix.size1();
-
- IntervalMatrix m;
- init_simple_matrix(m);
-
- // start whole process
- insert_interval(m,0,0);
+
+ if(m_size>0)
+ {
+ IntervalMatrix m;
+ init_simple_matrix(m);
+ // start whole process
+
+ insert_interval(m,0,0);
+ }
+
return report;
}
Modified: trunk/src/check/time/time_consistency.h
===================================================================
--- trunk/src/check/time/time_consistency.h 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/time/time_consistency.h 2010-02-20 11:38:10 UTC (rev 602)
@@ -218,9 +218,10 @@
virtual std::list<BMscPtr> check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
BMscIntervalSetMatrix matrix(bmsc);
+ matrix.build_up();
MscSolveTCSP solve;
MscSolveTCSPReport report = solve.solveTCSP(matrix);
- std::list<BMscPtr> res_list;
+ std::list<BMscPtr> res_list;
// there was at least one matrix found -> consistent
if(report.csp_mtxs.size()!=0)
Modified: trunk/src/check/time/time_pseudocode.cpp
===================================================================
--- trunk/src/check/time/time_pseudocode.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/time/time_pseudocode.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -21,95 +21,49 @@
void BMscIntervalSetMatrix::build_up_matrix()
{
- IntervalSetMatrix::resize(m_events.size());
- for (unsigned i=0;i<m_events.size();i++)
+ m_builded = true;
+ IntervalSetMatrix::resize(m_size);
+ for (unsigned i=0;i<m_size;i++)
{
- for (unsigned j=0;j<m_events.size();j++)
+ for (unsigned j=0;j<m_size;j++)
{
if (j==i)
{
- operator()(i,j)=MscTimeIntervalSetD();
- operator()(i,j).insert(MscTimeIntervalD(0,0));
+ operator()(i,j) = MscTimeIntervalD(0,0);
}
else
{
- operator()(i,j) =MscTimeIntervalSetD();
- operator()(i,j).insert(MscTimeIntervalD(-D::infinity(),D::infinity()));
+ operator()(i,j)= MscTimeIntervalD(-D::infinity(),D::infinity());
}
}
}
-
- EventPVector::iterator e_v;
- EventPSet::iterator e_m;
-
- for (e_v=m_events.begin();e_v!=m_events.end();e_v++)
+
+ std::map<std::pair<unsigned,unsigned>, MscTimeIntervalSetD>::const_iterator it;
+ for(it=m_position_to_interval.begin();it!=m_position_to_interval.end();it++)
{
- EventPSet set = EventFirstSuccessors::get(*e_v);
- for (e_m=set.begin();e_m!=set.end();e_m++)
- {
- operator()(*e_v,*e_m) = MscTimeIntervalSetD();
- operator()(*e_v,*e_m).insert(MscTimeIntervalD(0,D::infinity()));
-
- operator()(*e_m,*e_v) = MscTimeIntervalSetD();
- operator()(*e_m,*e_v).insert(MscTimeIntervalD(-D::infinity(),0));
- }
-
- TimeRelationEventPtrList::const_iterator it;
- TimeRelationEventPtrList relations = (*e_v)->get_time_relations();
-
- for (it=relations.begin();it!=relations.end();it++)
- {
- m_time_rel_set.insert(*it);
- EventP a = (*it)->get_event_a();
- EventP b = (*it)->get_event_b();
- if (m_event_topology.is_leq(a,b))
- {
- fill(a,b,(*it)->get_interval_set());
- }
- else
- {
- fill(b,a,(*it)->get_interval_set());
- }
- }
+ fill((it->first).first,(it->first).second,it->second);
}
+ m_matrix_original = *this;
}
BMscPtr BMscIntervalSetMatrix::get_modified_bmsc()
{
- // duplicate bmsc
- BMscPtr copy_bmsc;
- BMscDuplicator duplicator;
- copy_bmsc = duplicator.duplicate_bmsc(m_original_bmsc);
+ // duplicate bmsc
+ BMscPtr copy_bmsc;
+ BMscDuplicator duplicator;
+ copy_bmsc = duplicator.duplicate_bmsc(m_bmsc_original);
- // go through all relations and set copy new values
- std::set<TimeRelationEventPtr>::iterator it;
- for(it=m_time_rel_set.begin();it!=m_time_rel_set.end();it++)
- {
- EventP a = (*it)->get_event_a();
- EventP b = (*it)->get_event_b();
-
-// time relation is empty -> remove
- if(operator()(a,b).is_empty())
- {
- a->remove_time_relation(*it);
- b->remove_time_relation(*it);
- continue;
- }
-
- TimeRelationEvent* relation_copy;
- relation_copy = static_cast<TimeRelationEvent*>(duplicator.get_copy(it->get()));
- // set new value to time relation
- if (m_event_topology.is_leq(a,b))
- {
- relation_copy->set_interval_set(operator()(a,b));
- }
- else
- {
- relation_copy->set_interval_set(operator()(b,a));
- }
- }
- return copy_bmsc;
+ // go through all relations and set copy new values
+ std::map<TimeRelation*, std::pair<unsigned,unsigned> >::const_iterator it;
+ for(it=m_rel_to_position.begin();it!=m_rel_to_position.end();it++)
+ {
+ if(duplicator.get_copy(it->first))
+ ((TimeRelation*)duplicator.get_copy(it->first))->set_interval_set(operator()(it->second.first,it->second.second));
+ else
+ (it->first)->set_interval_set(operator()(it->second.first,it->second.second));
}
+ return copy_bmsc;
+}
// $Id$
Modified: trunk/src/check/time/time_pseudocode.h
===================================================================
--- trunk/src/check/time/time_pseudocode.h 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/check/time/time_pseudocode.h 2010-02-20 11:38:10 UTC (rev 602)
@@ -120,15 +120,22 @@
class BMscIntervalSetMatrix: public IntervalSetMatrix
{
private:
- BMscPtr m_original_bmsc;
- IntervalSetMatrix m_original_matrix;
+ BMscPtr m_bmsc_original;
+
+ bool m_builded;
+ unsigned m_size;
+
+ IntervalSetMatrix m_matrix_original;
+
+ std::map<std::pair<unsigned,unsigned>, MscTimeIntervalSetD> m_position_to_interval;
+
+ std::map<TimeRelation*, std::pair<unsigned,unsigned> > m_rel_to_position;
+ std::map<EventP,unsigned> m_event_to_number; //! the number of event in the matrix
- AllReachableEventPVector m_events; //! Vector of all events: event=matrix[number]
- std::map<EventP,unsigned> m_event_number; //! the number of event in the matrix
- EventTopologyHandler m_event_topology;
- //! set of all time relations,creates in build_up_matrix() function
- std::set<TimeRelationEventPtr> m_time_rel_set;
+ EventPVector m_events; //! Vector of all events: event=matrix[number]
+
+
//! initialization of visual closure
void build_up_matrix();
@@ -137,26 +144,54 @@
{
}
- /**
- * \brief Apply changes from the matrix to the bmsc copy
- */
-
public:
BMscIntervalSetMatrix(BMscPtr bmsc):
- m_original_bmsc(bmsc)
- ,m_events(bmsc)
- ,m_event_topology(bmsc)
+ m_bmsc_original(bmsc)
+ ,m_builded(false)
{
- std::vector<EventP>::iterator it;
- unsigned i;
-
- // set numbers to events and their succs
- for (it=m_events.begin(),i=0;it!=m_events.end();it++,i++)
+ EventTopologyHandler event_topology(m_bmsc_original);
+ m_events = event_topology.get_topology();
+
+ unsigned i; // column and row in matrix
+
+ // for all events in bmsc do:
+ EventPVector::const_iterator e_v;
+ EventPSet::const_iterator e_m;
+ for (e_v=m_events.begin(),i=0;e_v!=m_events.end();e_v++,i++)
{
- m_event_number[*it]=i;
+ m_event_to_number[*e_v]=i; // assign number to the event
}
- build_up_matrix();
- m_original_matrix = *this;
+
+ for (e_v=m_events.begin();e_v!=m_events.end();e_v++)
+ {
+ EventPSet set = EventFirstSuccessors::get(*e_v); // assigned to successors (0,inf) int
+ for (e_m=set.begin();e_m!=set.end();e_m++)
+ {
+ operator()(*e_v,*e_m)=MscTimeIntervalD(0,D::infinity());
+ }
+ }
+
+ for (e_v=m_events.begin();e_v!=m_events.end();e_v++)
+ {
+
+ TimeRelationEventPtrList::const_iterator it;
+ TimeRelationEventPtrList relations = (*e_v)->get_time_relations();
+
+ for (it=relations.begin();it!=relations.end();it++)
+ {
+ EventP a = (*it)->get_event_a();
+ EventP b = (*it)->get_event_b();
+ if (event_topology.is_leq(a,b)) // a<=b
+ {
+ // add time relation to the map
+ m_rel_to_position[it->get()]=std::make_pair(get_number(a),get_number(b));
+ if(m_position_to_interval.find(std::make_pair(get_number(a),get_number(b)))==m_position_to_interval.end())
+ operator()(a,b) = (*it)->get_interval_set();
+ else
+ operator()(a,b) = MscTimeIntervalSetD::set_intersection((*it)->get_interval_set(),operator()(a,b));
+ }
+ }
+ }
}
/*
BMscIntervalSetMatrix(const BMscIntervalSetMatrix& matrix):
@@ -174,22 +209,22 @@
//! return number of event in matrix
unsigned get_number(EventP e)
{
- return m_event_number[e];
+ return m_event_to_number[e];
}
+ //! if matrix was builded -> return reference from matrix, else return reference from map
MscTimeIntervalSetD& operator()(EventP a,EventP b)
{
- return operator()(get_number(a),get_number(b));
+ if(m_builded)
+ return operator()(get_number(a),get_number(b));
+ else
+ return m_position_to_interval[std::make_pair<unsigned,unsigned>(get_number(a),get_number(b))];
}
- MscTimeIntervalSetD& operator()(EventP a)
- {
- return operator()(get_number(a),get_number(a));
- }
BMscIntervalSetMatrix& operator=(const BMscIntervalSetMatrix& matrix)
{
- if(m_original_bmsc!=matrix.m_original_bmsc)
+ if(m_bmsc_original!=matrix.m_bmsc_original)
throw std::invalid_argument("BMscs dont match!");
IntervalSetMatrix::operator=(matrix);
return *this;
@@ -200,13 +235,16 @@
IntervalSetMatrix::operator=(matrix);
return *this;
}
-
-
- //! return all reachable events in bmsc
- const EventPVector get_events()
+ //! return all events in matrix
+ const EventPVector get_events() const
{
return m_events;
}
+
+ const unsigned get_size() const
+ {
+ return m_events.size();
+ }
//! Takes (modificated) matrix of bmsc and changes bmsc
BMscPtr get_modified_bmsc();
@@ -214,7 +252,7 @@
//! return original bmsc (assigned to the matrix)
BMscPtr get_original_bmsc() const
{
- return m_original_bmsc;
+ return m_bmsc_original;
}
~BMscIntervalSetMatrix()
@@ -231,9 +269,22 @@
//! puts IntervalSet in to the matrix to the position of events x,y
void fill(EventP x,EventP y,const MscTimeIntervalSetD& c)
{
+ fill(get_number(x),get_number(y),c);
+ }
+
+ void fill(unsigned x,unsigned y,const MscTimeIntervalSetD& c)
+ {
operator()(x,y)=c;
operator()(y,x)= MscTimeIntervalSetD::interval_inverse(c);
}
+
+ void build_up()
+ {
+ if(m_builded)
+ throw std::runtime_error("Matrix was already builded");
+ m_size = m_events.size();
+ build_up_matrix();
+ }
}; // end of class BMscMatrixConverter
Modified: trunk/src/data/session_attribute.cpp
===================================================================
--- trunk/src/data/session_attribute.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/data/session_attribute.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -13,7 +13,7 @@
*
* Copyright (c) 2009 Ondrej Kocian <koc...@ma...>
*
- * $Id:$
+ * $Id$
*/
#include "data/session_attribute.h"
@@ -37,4 +37,4 @@
cancel_attribute();
}
-// $Id:$
+// $Id$
Modified: trunk/src/data/time.cpp
===================================================================
--- trunk/src/data/time.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/src/data/time.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -52,8 +52,7 @@
}
template <>
-MscIntervalCouple<double>::MscIntervalCouple(const std::string& number, \
-const bool& closed):
+MscIntervalCouple<double>::MscIntervalCouple(const std::string& number, const bool& closed):
m_closed(closed)
,m_value(0)
{
Modified: trunk/tests/tighten_msc_test.cpp
===================================================================
--- trunk/tests/tighten_msc_test.cpp 2010-02-19 19:30:12 UTC (rev 601)
+++ trunk/tests/tighten_msc_test.cpp 2010-02-20 11:38:10 UTC (rev 602)
@@ -19,6 +19,7 @@
#include <iostream>
#include "check/time/tightening.h"
#include "data/Z120/z120.h"
+#include <list>
int main(int argc, char** argv) {
@@ -41,7 +42,7 @@
EventPtr e3 = strict2->add_event();
EventPtr e4 = strict1->add_event();
EventPtr e5 = strict3->add_event();
-
+
CompleteMessagePtr m1 = new CompleteMessage(L"hi1");
m1->glue_events(e0, e1);
CompleteMessagePtr m2 = new CompleteMessage(L"hi2");
@@ -53,7 +54,7 @@
MscTimeIntervalD in7(0,0);
MscTimeIntervalD in8(30,40);
MscTimeIntervalD in9(60,D::infinity());//TODO: infi
- MscTimeIntervalD in10(20,30);
+ MscTimeIntervalD in10(20,30);
MscTimeIntervalD in11(40,50);
MscTimeIntervalD in12(60,120);
MscTimeIntervalD in13(20,70);
@@ -122,11 +123,29 @@
TightenBMsc tighten(bmsc);
std::cerr << "tighten passed " << std::endl;
pair = tighten.tighten_msc(i);*/
+ /*
BMscTighter tightener;
BMscPtr result = tightener.transform(bmsc);
+ */
Z120 z120;
- z120.save_msc(std::cout,L"original",bmsc);
- z120.save_msc(std::cout,L"result",result);
+ // z120.save_msc(std::cout,L"original",bmsc);
+ // z120.save_msc(std::cout,L"result",result);
+ std::vector<MscPtr> mscs = z120.load_msc("cons_neg_1.mpr");
+ std::cout << mscs.size() << std::endl;
+ BMscPtr b = boost::dynamic_pointer_cast<BMsc>(mscs[0]);
+ z120.save_msc(std::cout,L"result",b);
+ ChannelMapperPtr m;
+ ConsistencyChecker checker;
+ std::list<BMscPtr> re = checker.check(b,m);
+ std::cout << re.size() << std::endl;
+
+ if(re.size() > 0){
+ std::cout << "vysledek" << std::endl;
+ z120.save_msc(std::cout,L"result",re.back());
+ }
+ else
+ std::cout << "neni" << std::endl;
+
// tight.max_tightener(min,max,sol.solve(conv.get_matrix()),i,bmsc,conv);
// std::pair<MscTimeIntervalSetD,IntervalSetMatrix> max_tightener(EventPList min, EventPList max,IntervalSetMatrix t_matrix,MscTimeIntervalSetD i,BMsc bmsc)
//
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-02-20 17:01:13
|
Revision: 605
http://scstudio.svn.sourceforge.net/scstudio/?rev=605&view=rev
Author: gotthardp
Date: 2010-02-20 17:01:05 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
New feature: MonteCarlo simulations integrated into the Visio add-on.
Modified Paths:
--------------
trunk/src/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/montecarlo/CMakeLists.txt
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
trunk/src/view/visio/addon/addon.cpp
trunk/src/view/visio/addon/addon.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/document_simulation.cpp
trunk/src/view/visio/addon/stdafx.h
trunk/src/view/visio/build-setup.bat
trunk/src/view/visio/scstudio.nsi
trunk/tests/montecarlo/montecarlo_test.cpp
Added Paths:
-----------
trunk/FindExcel.cmake
trunk/src/config.h.in
trunk/src/data/simulator.h
trunk/src/montecarlo/module.cpp
Property Changed:
----------------
trunk/src/
Added: trunk/FindExcel.cmake
===================================================================
--- trunk/FindExcel.cmake (rev 0)
+++ trunk/FindExcel.cmake 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,23 @@
+FIND_FILE(EXCEL_MSO
+ NAMES mso.dll
+ PATHS
+ "C:/Program Files/Common Files/Microsoft Shared/Office11"
+ DOC "Microsoft Shared Objects, path to mso.dll")
+
+FIND_FILE(EXCEL_VBA
+ NAMES vbe6ext.olb
+ PATHS
+ "C:/Program Files/Common Files/Microsoft Shared/VBA/VBA6"
+ DOC "Microsoft VBA Objects, path to vbe6ext.olb")
+
+FIND_FILE(EXCEL_EXECUTABLE
+ NAMES excel.exe
+ PATHS
+ "C:/Program Files/Microsoft Office/OFFICE11"
+ DOC "Microsoft Excel Application, path to excel.exe")
+
+IF(EXCEL_MSO AND EXCEL_VBA AND EXCEL_EXECUTABLE)
+ SET(EXCEL_FOUND 1)
+ELSE()
+ SET(EXCEL_FOUND 0)
+ENDIF()
Property changes on: trunk/FindExcel.cmake
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
config.h
Modified: trunk/src/CMakeLists.txt
===================================================================
--- trunk/src/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -3,4 +3,12 @@
ADD_SUBDIRECTORY(membership)
ADD_SUBDIRECTORY(montecarlo)
+IF (WIN32)
+ FIND_PACKAGE(Excel)
+ENDIF(WIN32)
+
+CONFIGURE_FILE(
+ ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
# $Id$
Added: trunk/src/config.h.in
===================================================================
--- trunk/src/config.h.in (rev 0)
+++ trunk/src/config.h.in 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,6 @@
+#define EXCEL_FOUND @EXCEL_FOUND@
+#if(EXCEL_FOUND)
+#define EXCEL_MSO "@EXCEL_MSO@"
+#define EXCEL_VBA "@EXCEL_VBA@"
+#define EXCEL_EXECUTABLE "@EXCEL_EXECUTABLE@"
+#endif
Property changes on: trunk/src/config.h.in
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/data/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -15,6 +15,7 @@
formatter.h
checker.h
searcher.h
+ simulator.h
transformer.h
session_attribute.cpp
session_attribute.h
Added: trunk/src/data/simulator.h
===================================================================
--- trunk/src/data/simulator.h (rev 0)
+++ trunk/src/data/simulator.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,77 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SIMULATOR_H
+#define _SIMULATOR_H
+
+#include <boost/shared_ptr.hpp>
+
+#include "data/msc.h"
+#include "data/reporter.h"
+
+#if defined(_MSC_VER)
+// FIXME: to be removed once the Simulator has some implementation in a .cpp file
+#pragma warning(disable: 4275)
+#endif
+
+class SimulationListener;
+typedef boost::shared_ptr<SimulationListener> SimulationListenerPtr;
+
+class Simulator : public Reporter
+{
+public:
+ virtual ~Simulator() {}
+ typedef std::map<std::string, double> MeasurementsMap;
+
+ void set_process_count(int i)
+ { m_process_count = i; }
+
+ void set_listener(SimulationListener* listener)
+ { m_listener = listener; }
+
+ //! Start simulation and measurement calculation.
+ virtual void start(const MscPtr& msc) = 0;
+ //! Continue simulation.
+ virtual void next() = 0;
+ //! Stop simulation.
+ virtual void stop() = 0;
+
+ virtual bool is_running() const = 0;
+
+protected:
+ int m_process_count;
+ SimulationListener* m_listener;
+};
+
+typedef boost::shared_ptr<Simulator> SimulatorPtr;
+
+class SimulationListener
+{
+public:
+ virtual ~SimulationListener() {}
+
+ virtual void on_result(const Simulator::MeasurementsMap& measurements) = 0;
+ virtual void on_error(const std::string& what) = 0;
+};
+
+//! module initialization function
+typedef Simulator* (*FInitSimulator)();
+
+#endif /* _SIMULATOR_H */
+
+// $Id$
Property changes on: trunk/src/data/simulator.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/montecarlo/CMakeLists.txt
===================================================================
--- trunk/src/montecarlo/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -1,6 +1,6 @@
ADD_LIBRARY(scmontecarlo SHARED
export.h
-# module.cpp
+ module.cpp
montecarlo.cpp
montecarlo.h
)
Added: trunk/src/montecarlo/module.cpp
===================================================================
--- trunk/src/montecarlo/module.cpp (rev 0)
+++ trunk/src/montecarlo/module.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,30 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "data/simulator.h"
+#include "montecarlo/montecarlo.h"
+
+// module initialization function
+// note: the Visio add-on searches for a function of this name
+extern "C" SCMONTECARLO_EXPORT
+Simulator* init_simulator()
+{
+ return new MonteCarlo();
+}
+
+// $Id$
Property changes on: trunk/src/montecarlo/module.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -174,6 +174,8 @@
MonteCarlo::MonteCarlo()
{
+ m_stoprequested = true;
+ m_callback_active = false;
m_process_count = 1;
}
@@ -220,43 +222,75 @@
}
// the trace is accepted
- // copy calculated measurements to the result set
- boost::mutex::scoped_lock l(m_mutex);
+ // process the calculated measurements by the listener
+ boost::unique_lock<boost::mutex> lock(m_mutex);
- m_measurements = measurements;
- m_stoprequested = true;
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_result(measurements);
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+
return 0; // accepted
}
-const MonteCarlo::MeasurementsMap& MonteCarlo::run(const MscPtr& msc)
+void MonteCarlo::start(const MscPtr& msc)
{
- std::vector<boost::shared_ptr<boost::thread> > threads;
- m_stoprequested = false;
+ m_measurements.clear();
boost::variate_generator<boost::mt19937, boost::uniform_int<> > seed(
boost::mt19937((boost::int32_t)time(NULL)),
boost::uniform_int<>(0, INT_MAX));
- if(m_process_count > 1)
+ m_stoprequested = false;
+ m_callback_active = false;
+ // execute threads
+ for(int i = 0; i < m_process_count; i++)
{
- threads.resize(m_process_count-1);
- // execute additional threads
- for(int i = 0; i < m_process_count-1; i++)
- threads[i].reset(new boost::thread(boost::bind(&MonteCarlo::thread_main, this, seed(), msc)));
+ ThreadPtr thread(new boost::thread(boost::bind(&MonteCarlo::thread_main, this, seed(), msc)));
+#ifdef WIN32
+ HANDLE th = thread->native_handle();
+ // be nice and keep visio alive
+ SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL);
+#endif
+ m_threads.push_back(thread);
}
+}
- // do also simulation execution
- thread_main(seed(), msc);
+void MonteCarlo::next()
+{
+ // critical section protected by m_mutex
+ {
+ boost::lock_guard<boost::mutex> lock(m_mutex);
+ m_callback_active = false;
+ }
+ // wake up the threads
+ m_callback_condition.notify_one();
+}
- if(m_process_count > 1)
+void MonteCarlo::stop()
+{
+ // critical section protected by m_mutex
{
- // wait for the executed threads
- for(int i = 0; i < m_process_count-1; i++)
- threads[i]->join();
+ boost::lock_guard<boost::mutex> lock(m_mutex);
+ m_stoprequested = true;
+ m_callback_active = false;
}
+ // wake up the threads
+ m_callback_condition.notify_one();
- return m_measurements;
+ // wait for the executed threads
+ for(std::vector<ThreadPtr>::const_iterator tpos = m_threads.begin();
+ tpos != m_threads.end(); tpos++)
+ {
+ (*tpos)->join();
+ }
+
+ m_threads.clear();
}
void MonteCarlo::thread_main(unsigned int seed, const MscPtr& msc)
@@ -266,7 +300,40 @@
boost::mt19937 seeder(seed);
while(!m_stoprequested)
- do_sample(seeder, msc);
+ {
+ try
+ {
+ do_sample(seeder, msc);
+ }
+ catch(std::exception& exc)
+ {
+ boost::unique_lock<boost::mutex> lock(m_mutex);
+
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_error(exc.what());
+
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+ }
+ catch(...)
+ {
+ boost::unique_lock<boost::mutex> lock(m_mutex);
+
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_error("unexpected exception");
+
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+ }
+ }
}
// $Id$
Modified: trunk/src/montecarlo/montecarlo.h
===================================================================
--- trunk/src/montecarlo/montecarlo.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/montecarlo.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -20,9 +20,10 @@
#include <boost/thread.hpp>
#include "data/msc.h"
+#include "data/simulator.h"
#include "montecarlo/export.h"
-class SCMONTECARLO_EXPORT MonteCarlo
+class SCMONTECARLO_EXPORT MonteCarlo : public Simulator
{
public:
@@ -57,21 +58,28 @@
MonteCarlo();
- void set_process_count(int i)
- { m_process_count = i; }
-
int do_sample(boost::mt19937& seeder, const MscPtr& msc);
- typedef std::map<std::string, double> MeasurementsMap;
- const MeasurementsMap& run(const MscPtr& msc);
+ //! Start simulation and measurement calculation.
+ virtual void start(const MscPtr& msc);
+ //! Continue simulation.
+ virtual void next();
+ //! Stop simulation.
+ virtual void stop();
+ //! Returns true if the simulation is started.
+ virtual bool is_running() const
+ { return !m_stoprequested; }
void thread_main(unsigned int seed, const MscPtr& msc);
private:
- int m_process_count;
+ volatile bool m_stoprequested;
+ typedef boost::shared_ptr<boost::thread> ThreadPtr;
+ std::vector<ThreadPtr> m_threads;
- volatile bool m_stoprequested;
boost::mutex m_mutex;
+ boost::condition_variable m_callback_condition;
+ bool m_callback_active;
MeasurementsMap m_measurements;
};
Modified: trunk/src/view/visio/addon/addon.cpp
===================================================================
--- trunk/src/view/visio/addon/addon.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/addon.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -278,9 +278,12 @@
case CDocumentMonitor::MENU_FIND_FLOW:
TRACE("CStudioAddon::Run() menu item 'Check--Drawing--Find Flow'");
return pDocumentMonitor->OnMenuFindFlow(vsoApp);
- case CDocumentMonitor::MENU_SIMULATION:
- TRACE("CStudioAddon::Run() menu item 'Check--Start/Stop Simulation'");
- return pDocumentMonitor->OnMenuSimulation(vsoApp);
+ case CDocumentMonitor::MENU_SIMULATION_START:
+ TRACE("CStudioAddon::Run() menu item 'Check--Start Simulation'");
+ return pDocumentMonitor->OnMenuSimulationStart(vsoApp);
+ case CDocumentMonitor::MENU_SIMULATION_STOP:
+ TRACE("CStudioAddon::Run() menu item 'Check--Stop Simulation'");
+ return pDocumentMonitor->OnMenuSimulationStop(vsoApp);
case CDocumentMonitor::MENU_VERIFY:
TRACE("CStudioAddon::Run() menu item 'Check--Verify'");
return pDocumentMonitor->OnMenuVerify(vsoApp);
@@ -376,6 +379,11 @@
TRACE("CStudioAddon::HandleVisioEvent() visEvtConnectionsDeleted");
break;
+ case visEvtApp|visEvtMarker:
+ TRACE("CStudioAddon::HandleVisioEvent() visEvtMarker");
+ HandleMarker(pSubjectObj);
+ break;
+
default:
TRACE("CStudioAddon::HandleVisioEvent() unexpected event id="
<< std::ios::hex << event);
@@ -447,6 +455,21 @@
}
}
+void CStudioAddon::HandleMarker(Visio::IVApplicationPtr vsoApp)
+{
+ _bstr_t contextString = vsoApp->GetEventInfo(Visio::visEvtIdMostRecent);
+ TRACE("CStudioAddon::HandleMarker() " << contextString);
+
+ CDocumentMonitor *pDocumentMonitor = GetDocumentMonitor(vsoApp, vsoApp->ActiveDocument);
+ if(pDocumentMonitor)
+ {
+ if(_stricmp((const char *)contextString, "SimulationResult") == 0)
+ pDocumentMonitor->OnSimulationResult();
+ else if(_stricmp((const char *)contextString, "SimulationError") == 0)
+ pDocumentMonitor->OnSimulationError();
+ }
+}
+
void CStudioAddon::RegisterPersistentEvents(Visio::IVDocumentPtr vsoDocument)
{
Visio::IVEventPtr vsoDocumentCreateEvent = NULL;
@@ -519,7 +542,6 @@
pDocumentMonitor = new CDocumentMonitor(this, vsoApp, vsoDocument);
pDocumentMonitor->InitMenu(vsoApp, vsoDocument);
pDocumentMonitor->InitToolbar(vsoApp, vsoDocument);
- pDocumentMonitor->InitAccelerators(vsoApp, vsoDocument);
// register BeforeDocumentClose
vsoEvent = vsoDocumentEventList->AddAdvise(visEvtBeforeDocumentClose, varSink, _T(""), _T(""));
Modified: trunk/src/view/visio/addon/addon.h
===================================================================
--- trunk/src/view/visio/addon/addon.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/addon.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -48,6 +48,7 @@
void HandleCellChanged(Visio::IVCellPtr vsoCell);
void HandleConnectionsAdded(Visio::IVConnectsPtr vsoConnects);
+ void HandleMarker(Visio::IVApplicationPtr vsoApp);
void RegisterPersistentEvents(Visio::IVDocumentPtr vsoDocument);
CDocumentMonitor *GetDocumentMonitor(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/dllmodule.rc 2010-02-20 17:01:05 UTC (rev 605)
@@ -96,8 +96,8 @@
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,3,32,0
- PRODUCTVERSION 0,3,32,0
+ FILEVERSION 0,3,34,0
+ PRODUCTVERSION 0,3,34,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
@@ -114,13 +114,13 @@
BEGIN
VALUE "CompanyName", "Masaryk University Brno"
VALUE "FileDescription", "Microsoft Visio add-on for design and verification of Message Sequence Charts (MSC)."
- VALUE "FileVersion", "0.3.32"
+ VALUE "FileVersion", "0.3.34"
VALUE "InternalName", "scstudio.vsl"
VALUE "LegalCopyright", "(c) Petr Gotthard. All rights reserved."
VALUE "OriginalFilename", "scstudio.vsl"
VALUE "PrivateBuild", "$Revision$"
VALUE "ProductName", "Sequence Chart Studio"
- VALUE "ProductVersion", "0.3.32"
+ VALUE "ProductVersion", "0.3.34"
END
END
BLOCK "VarFileInfo"
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -77,6 +77,7 @@
m_formatters.clear();
m_checkers.clear();
m_membership = SearcherPtr(); // NULL
+ m_simulator = SimulatorPtr(); // NULL
m_transformers.clear();
// close extension modules
for(std::vector<HINSTANCE>::const_iterator mpos = m_open_modules.begin();
@@ -147,11 +148,13 @@
(FInitCheckers)GetProcAddress(module, "init_checkers");
FInitMembership init_membership =
(FInitMembership)GetProcAddress(module, "init_membership");
+ FInitSimulator init_simulator =
+ (FInitSimulator)GetProcAddress(module, "init_simulator");
FInitTransformers init_transformers =
(FInitTransformers)GetProcAddress(module, "init_transformers");
if(init_formatters == NULL && init_checkers == NULL
- && init_membership == NULL && init_transformers == NULL)
+ && init_membership == NULL && init_simulator == NULL && init_transformers == NULL)
{
DisplayException(m_vsoApp, basic_stringize<TCHAR>()
<< _T("Cannot open module '") << *npos << _T("'"), MB_OK | MB_ICONEXCLAMATION);
@@ -192,6 +195,17 @@
if(init_membership != NULL)
m_membership = boost::shared_ptr<Searcher>(init_membership());
+ if(init_simulator != NULL)
+ {
+ m_simulator = boost::shared_ptr<Simulator>(init_simulator());
+
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ m_simulator->set_process_count(info.dwNumberOfProcessors);
+
+ m_simulator->set_listener(this);
+ }
+
if(init_transformers != NULL)
{
Transformer **transformers = init_transformers();
@@ -320,6 +334,8 @@
void CDocumentMonitor::InitMenu(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument)
{
Visio::IVUIObjectPtr vsoMenus = getMostCustomMenus(vsoApp, vsoDocument);
+
+ // step 1: create custom menu
Visio::IVMenuSetPtr menuSet = vsoMenus->MenuSets->ItemAtID[Visio::visUIObjSetDrawing];
Visio::IVMenuPtr menu = menuSet->Menus->AddAt(5);
@@ -405,13 +421,25 @@
vslIconFile = vslFileName+_T(",1");
itemFindFlow->IconFileName(vslIconFile.c_str());
- Visio::IVMenuItemPtr itemSimulation = menu->MenuItems->Add();
- itemSimulation->Caption = "&Start Simulation";
- itemSimulation->AddOnName = ADDON_NAME;
- itemSimulation->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION;
+ m_simulationStartMenuItem = menu->MenuItems->Add();
+ m_simulationStartMenuItem->Caption = "&Start Simulation";
+ m_simulationStartMenuItem->AddOnName = ADDON_NAME;
+ m_simulationStartMenuItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_START;
+ // enable only if simulator is available
+ m_simulationStartMenuItem->Enabled = m_simulator != NULL;
vslIconFile = vslFileName+_T(",4");
- itemSimulation->IconFileName(vslIconFile.c_str());
+ m_simulationStartMenuItem->IconFileName(vslIconFile.c_str());
+ m_simulationStopMenuItem = menu->MenuItems->Add();
+ m_simulationStopMenuItem->Caption = "&Stop Simulation";
+ m_simulationStopMenuItem->AddOnName = ADDON_NAME;
+ m_simulationStopMenuItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_STOP;
+ m_simulationStopMenuItem->Visible = false;
+ // enable only if simulator is available
+ m_simulationStopMenuItem->Enabled = m_simulator != NULL;
+ vslIconFile = vslFileName+_T(",5");
+ m_simulationStopMenuItem->IconFileName(vslIconFile.c_str());
+
Visio::IVMenuItemPtr itemVerify = menu->MenuItems->Add();
itemVerify->Caption = "&Verify";
itemVerify->AddOnName = ADDON_NAME;
@@ -425,6 +453,24 @@
itemOptions->AddOnName = ADDON_NAME;
itemOptions->AddOnArgs = stringize() << L"/event=" << MENU_OPTIONS;
+ // step 2: create accelerators
+ // note: the accelerators must be created in this custom menu set
+ Visio::IVAccelTablePtr accelTable = vsoMenus->AccelTables->ItemAtID[Visio::visUIObjSetDrawing];
+
+ Visio::IVAccelItemPtr accelItem1 = accelTable->AccelItems->Add();
+ accelItem1->AddOnName = ADDON_NAME;
+ accelItem1->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_INSTANCES;
+ accelItem1->Key = 'I';
+ accelItem1->Control = true;
+ accelItem1->Alt = true;
+
+ Visio::IVAccelItemPtr accelItem2 = accelTable->AccelItems->Add();
+ accelItem2->AddOnName = ADDON_NAME;
+ accelItem2->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_MESSAGES;
+ accelItem2->Key = 'M';
+ accelItem2->Control = true;
+ accelItem2->Alt = true;
+
vsoDocument->SetCustomMenus(vsoMenus);
}
@@ -466,13 +512,25 @@
vslIconFile = vslFileName+_T(",1");
itemFindFlow->IconFileName(vslIconFile.c_str());
- Visio::IVToolbarItemPtr itemSimulation = toolbar->ToolbarItems->Add();
- itemSimulation->Caption = "Start Simulation";
- itemSimulation->AddOnName = ADDON_NAME;
- itemSimulation->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION;
+ m_simulationStartToolbarItem = toolbar->ToolbarItems->Add();
+ m_simulationStartToolbarItem->Caption = "Start Simulation";
+ m_simulationStartToolbarItem->AddOnName = ADDON_NAME;
+ m_simulationStartToolbarItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_START;
+ // enable only if simulator is available
+ m_simulationStartToolbarItem->Enabled = m_simulator != NULL;
vslIconFile = vslFileName+_T(",4");
- itemSimulation->IconFileName(vslIconFile.c_str());
+ m_simulationStartToolbarItem->IconFileName(vslIconFile.c_str());
+ m_simulationStopToolbarItem = toolbar->ToolbarItems->Add();
+ m_simulationStopToolbarItem->Caption = "Stop Simulation";
+ m_simulationStopToolbarItem->AddOnName = ADDON_NAME;
+ m_simulationStopToolbarItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_STOP;
+ m_simulationStopToolbarItem->Visible = false;
+ // enable only if simulator is available
+ m_simulationStopToolbarItem->Enabled = m_simulator != NULL;
+ vslIconFile = vslFileName+_T(",5");
+ m_simulationStopToolbarItem->IconFileName(vslIconFile.c_str());
+
Visio::IVToolbarItemPtr itemVerify = toolbar->ToolbarItems->Add();
itemVerify->Caption = "Verify";
itemVerify->AddOnName = ADDON_NAME;
@@ -484,28 +542,6 @@
vsoDocument->SetCustomToolbars(vsoToolbars);
}
-void CDocumentMonitor::InitAccelerators(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument)
-{
- Visio::IVUIObjectPtr vsoMenus = getMostCustomMenus(vsoApp, vsoDocument);
- Visio::IVAccelTablePtr accelTable = vsoMenus->AccelTables->ItemAtID[Visio::visUIObjSetDrawing];
-
- Visio::IVAccelItemPtr accelItem1 = accelTable->AccelItems->Add();
- accelItem1->AddOnName = ADDON_NAME;
- accelItem1->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_INSTANCES;
- accelItem1->Key = 'I';
- accelItem1->Control = true;
- accelItem1->Alt = true;
-
- Visio::IVAccelItemPtr accelItem2 = accelTable->AccelItems->Add();
- accelItem2->AddOnName = ADDON_NAME;
- accelItem2->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_MESSAGES;
- accelItem2->Key = 'M';
- accelItem2->Control = true;
- accelItem2->Alt = true;
-
- vsoDocument->SetCustomMenus(vsoMenus);
-}
-
TransformerPtrList::const_iterator CDocumentMonitor::find_transformer(const std::wstring& name) const
{
for(TransformerPtrList::const_iterator cpos = m_transformers.begin();
Modified: trunk/src/view/visio/addon/document.h
===================================================================
--- trunk/src/view/visio/addon/document.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -21,6 +21,7 @@
#include "data/formatter.h"
#include "data/checker.h"
#include "data/searcher.h"
+#include "data/simulator.h"
#include "data/transformer.h"
//! template used to create new documents
@@ -32,7 +33,7 @@
typedef std::vector<CheckerPtr> CheckerPtrList;
typedef std::vector<TransformerPtr> TransformerPtrList;
-class CDocumentMonitor
+class CDocumentMonitor : public SimulationListener
{
public:
CDocumentMonitor(CStudioAddon *addon,
@@ -44,7 +45,6 @@
void InitMenu(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
void InitToolbar(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
- void InitAccelerators(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
enum MenuItems
{
@@ -53,7 +53,8 @@
MENU_EXPORT,
MENU_REPAINT,
MENU_FIND_FLOW,
- MENU_SIMULATION,
+ MENU_SIMULATION_START,
+ MENU_SIMULATION_STOP,
MENU_VERIFY,
MENU_OPTIONS,
MENU_SELECT_ALL_MESSAGES,
@@ -68,7 +69,8 @@
VAORC OnMenuSelectAllInstances(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuSelectAllMessages(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuFindFlow(Visio::IVApplicationPtr vsoApp);
- VAORC OnMenuSimulation(Visio::IVApplicationPtr vsoApp);
+ VAORC OnMenuSimulationStart(Visio::IVApplicationPtr vsoApp);
+ VAORC OnMenuSimulationStop(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuVerify(Visio::IVApplicationPtr vsoApp);
void ShowReportView();
@@ -86,6 +88,9 @@
Visio::IVShapePtr FindShape(const _bstr_t& id);
int SelectShapes(const std::vector<_bstr_t>& ids);
+ void OnSimulationResult();
+ void OnSimulationError();
+
// event objects for this document
Visio::IVEventPtr m_vsoPageAddedEvent;
Visio::IVEventPtr m_vsoBeforeDocumentClosedEvent;
@@ -109,7 +114,32 @@
MscPtr run_transformers(MscPtr& msc, const TransformerPtrList& transformer_list);
+ Simulator::MeasurementsMap m_marker_measurements;
+ virtual void on_result(const Simulator::MeasurementsMap& measurements)
+ {
+ m_marker_measurements = measurements;
+ m_vsoApp->QueueMarkerEvent("SimulationResult");
+ }
+
+ std::string m_marker_error;
+ virtual void on_error(const std::string& what)
+ {
+ m_marker_error = what;
+ m_vsoApp->QueueMarkerEvent("SimulationError");
+ }
+
+#if(EXCEL_FOUND)
+ Excel::_ApplicationPtr m_excelApp;
+ Excel::_WorksheetPtr m_outputSheet;
+
+ typedef std::map<std::string, int> OutputColumns;
+ OutputColumns m_outputColumns;
+
+ int m_outputNextRow;
+#endif // EXCEL_FOUND
+
SearcherPtr m_membership;
+ SimulatorPtr m_simulator;
CStudioAddon *m_addon;
Visio::IVApplicationPtr m_vsoApp;
@@ -121,6 +151,11 @@
CReportView *m_reportView;
ConfigProvider *m_configProvider;
+ Visio::IVMenuItemPtr m_simulationStartMenuItem;
+ Visio::IVMenuItemPtr m_simulationStopMenuItem;
+ Visio::IVToolbarItemPtr m_simulationStartToolbarItem;
+ Visio::IVToolbarItemPtr m_simulationStopToolbarItem;
+
void selectAll(Visio::IVApplicationPtr vsoApp, bool select_instances);
Visio::IVUIObjectPtr getMostCustomMenus(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Visio::IVUIObjectPtr getMostCustomToolbars(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Modified: trunk/src/view/visio/addon/document_simulation.cpp
===================================================================
--- trunk/src/view/visio/addon/document_simulation.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document_simulation.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -17,17 +17,22 @@
*/
#include "stdafx.h"
+#include "addon.h"
#include "dllmodule.h"
#include "document.h"
#include "extract.h"
#include "data/msc.h"
-VAORC CDocumentMonitor::OnMenuSimulation(Visio::IVApplicationPtr vsoApp)
+static const int EXCEL_MAX_ROWS = 65536;
+static const int EXCEL_MAX_COLUMNS = 256;
+
+VAORC CDocumentMonitor::OnMenuSimulationStart(Visio::IVApplicationPtr vsoApp)
{
// clear the verification report
m_reportView->Reset();
+ // step 1: extract the drawing to be simulated
CDrawingExtractor extractor(m_reportView);
Visio::IVPagePtr vsoPage = vsoApp->GetActivePage();
@@ -35,11 +40,135 @@
if(msc == NULL)
{
m_reportView->Print(RS_ERROR,
- stringize() << "Verification failed. Graphical errors in the drawing.");
+ stringize() << "Simulation failed. Graphical errors in the drawing.");
return VAORC_FAILURE;
}
+#if(EXCEL_FOUND)
+ // step 2: initialize the...
[truncated message content] |
|
From: <got...@us...> - 2010-02-21 11:20:42
|
Revision: 610
http://scstudio.svn.sourceforge.net/scstudio/?rev=610&view=rev
Author: gotthardp
Date: 2010-02-21 11:20:32 +0000 (Sun, 21 Feb 2010)
Log Message:
-----------
Backported to boost 1.34 and older.
Modified Paths:
--------------
trunk/src/montecarlo/montecarlo.cpp
trunk/tests/CMakeLists.txt
trunk/tests/montecarlo/montecarlo_test.cpp
Modified: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp 2010-02-20 23:00:01 UTC (rev 609)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-21 11:20:32 UTC (rev 610)
@@ -223,7 +223,7 @@
// the trace is accepted
// process the calculated measurements by the listener
- boost::unique_lock<boost::mutex> lock(m_mutex);
+ boost::mutex::scoped_lock lock(m_mutex);
// wait until the previous callback is processed
while(m_callback_active)
@@ -269,7 +269,7 @@
{
// critical section protected by m_mutex
{
- boost::lock_guard<boost::mutex> lock(m_mutex);
+ boost::mutex::scoped_lock lock(m_mutex);
m_callback_active = false;
}
// wake up the threads
@@ -280,7 +280,7 @@
{
// critical section protected by m_mutex
{
- boost::lock_guard<boost::mutex> lock(m_mutex);
+ boost::mutex::scoped_lock lock(m_mutex);
m_stoprequested = true;
m_callback_active = false;
}
@@ -311,7 +311,7 @@
}
catch(std::exception& exc)
{
- boost::unique_lock<boost::mutex> lock(m_mutex);
+ boost::mutex::scoped_lock lock(m_mutex);
if(m_listener)
{
@@ -325,7 +325,7 @@
}
catch(...)
{
- boost::unique_lock<boost::mutex> lock(m_mutex);
+ boost::mutex::scoped_lock lock(m_mutex);
if(m_listener)
{
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2010-02-20 23:00:01 UTC (rev 609)
+++ trunk/tests/CMakeLists.txt 2010-02-21 11:20:32 UTC (rev 610)
@@ -173,6 +173,7 @@
# scpseudocode
# )
+IF(ANTLR_FOUND)
ADD_EXECUTABLE(tighten_msc_test
tighten_msc_test.cpp
)
@@ -182,6 +183,7 @@
scpseudocode
scZ120
)
+ENDIF(ANTLR_FOUND)
#ADD_EXECUTABLE(duplicator_test
Modified: trunk/tests/montecarlo/montecarlo_test.cpp
===================================================================
--- trunk/tests/montecarlo/montecarlo_test.cpp 2010-02-20 23:00:01 UTC (rev 609)
+++ trunk/tests/montecarlo/montecarlo_test.cpp 2010-02-21 11:20:32 UTC (rev 610)
@@ -17,6 +17,7 @@
*/
#include <iostream>
+#include <boost/date_time/posix_time/posix_time.hpp>
#include "data/Z120/z120.h"
#include "montecarlo/montecarlo.h"
@@ -82,7 +83,13 @@
test.m_simulator.start(msc[0]);
// wait until simulation finishes
while(!test.m_was_result)
- boost::this_thread::sleep(boost::posix_time::milliseconds(100));
+ {
+ boost::xtime timeout;
+ timeout.sec = 0;
+ timeout.nsec = 100 * 1000000;
+ // sleep 100 ms
+ boost::thread::sleep(timeout);
+ }
test.m_simulator.stop();
return 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-02-22 16:38:23
|
Revision: 614
http://scstudio.svn.sourceforge.net/scstudio/?rev=614&view=rev
Author: madzin
Date: 2010-02-22 16:38:15 +0000 (Mon, 22 Feb 2010)
Log Message:
-----------
Patches and new tests for membership
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
trunk/tests/membership/test_bmsc18_2.mpr
Added Paths:
-----------
trunk/tests/membership/test_bmsc20_1.mpr
trunk/tests/membership/test_bmsc20_2.mpr
trunk/tests/membership/test_bmsc21_1.mpr
trunk/tests/membership/test_bmsc21_2.mpr
trunk/tests/membership/test_bmsc21_3.mpr
trunk/tests/membership/test_bmsc21_4.mpr
trunk/tests/membership/test_bmsc22_1.mpr
trunk/tests/membership/test_bmsc22_2.mpr
trunk/tests/membership/test_bmsc22_3.mpr
trunk/tests/membership/test_bmsc22_4.mpr
trunk/tests/membership/test_bmsc23_1.mpr
trunk/tests/membership/test_bmsc23_2.mpr
trunk/tests/membership/test_bmsc23_3.mpr
trunk/tests/membership/test_bmsc23_4.mpr
trunk/tests/membership/test_hmsc20.mpr
trunk/tests/membership/test_hmsc21.mpr
trunk/tests/membership/test_hmsc22.mpr
trunk/tests/membership/test_hmsc23.mpr
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2010-02-22 02:48:40 UTC (rev 613)
+++ trunk/CMakeLists.txt 2010-02-22 16:38:15 UTC (rev 614)
@@ -42,7 +42,7 @@
IF(WIN32)
# use automatic linking on Win32 platforms
-SET(Boost_USE_STATIC_LIBS ON)
+SET(Boost_USE_STATIC_LIBS OFF)
ELSE(WIN32)
# use dynamic linking
# static boost may not have -fPIC required for linking to shared modules
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-02-22 02:48:40 UTC (rev 613)
+++ trunk/src/membership/membership_alg.cpp 2010-02-22 16:38:15 UTC (rev 614)
@@ -21,6 +21,9 @@
// map of bmsc names and configurations which were checked
std::map<std::wstring, std::set<ConfigurationPtr> > checked;
+//identification for receive events
+int max_id;
+
InstancePtr find_instance(InstancePtrList instances, std::wstring name);
HMscPtr search_bmsc(BMscPtr bmsc, BMscPtr bmsc_f);
@@ -32,22 +35,28 @@
bool is_empty_instance(InstancePtrList node_instances, InstancePtrList b_instances);
-bool strict_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events);
+bool strict_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events, enum check_type type);
bool strict_coregion(StrictOrderAreaPtr node_strict, std::vector<Event*>& node_events,
CoregionAreaPtr b_coregion, std::vector<Event*>& b_events);
-bool coregion_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events);
+bool coregion_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events, enum check_type type);
bool coregion_coretion(CoregionAreaPtr node_coregion, std::vector<Event*>& node_events,
CoregionAreaPtr b_coregion, std::vector<Event*>& b_events);
bool compare_events(Event* a, Event* b);
+bool compare_events_attribute(Event* a, Event* b);
+
bool look_at_checked_conf(ReferenceNodePtr node, ConfigurationPtr b);
-bool check_instance(InstancePtr node_instance, PositionPtr b_position);
+bool check_instance(InstancePtr node_instance, enum check_type type, PositionPtr old_position);
+bool check_node(ReferenceNodePtr node, enum check_type type, ConfigurationPtr old_conf);
+
+void set_identification(Event* node_e, Event* b_e);
+
/*
* Returns precondition list of the membership algorithm
*/
@@ -86,6 +95,8 @@
*/
HMscPtr search_hmsc(HMscPtr hmsc, BMscPtr bmsc_f)
{
+ max_id = 0;
+
BMscGraphDuplicator duplicator;
HMscPtr dup_hmsc;
@@ -150,74 +161,30 @@
return true;
}
+ std::cout << "false 01" << std::endl;
return false;
}
else
{
//TODO add this check to while cycle
+
+ //when deosn't exist empty path to EndNode
if (b->is_null())
- {
- //when deosn't exist empty path to EndNode
return false;
- }
//checks if this node with this configuration was checked
if (!look_at_checked_conf(node, b))
return false;
- //get msc from the node
- MscPtr msc = node->get_msc();
- BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
+ ConfigurationPtr old_config = new Configuration(b);
- if (bmsc == NULL)
+ if (!check_node(node, membership, b))
return false;
- InstancePtrList node_instances = bmsc->get_instances();
- InstancePtrList b_instances = b->get_instances();
+ if (!check_node(node, receive_ordering, old_config))
+ return false;
- InstancePtrList::iterator node_instence_it, b_instance_it;
-
- std::set<PositionPtr> b_positions = b->get_positions();
- std::set<PositionPtr>::iterator b_position_it;
-
- if (node_instances.size() > b_instances.size())
- {
- if (!is_empty_instance(node_instances, b_instances))
- return false;
- }
-
- InstancePtr node_instance = NULL;
- std::vector<Event*> node_events, b_events;
- EventAreaPtr node_area, b_area;
- std::wstring name;
-
- //checks each instances from the position to the end of bMSC or the end of the HMSC node
- for (b_position_it = b_positions.begin(); b_position_it != b_positions.end();
- b_position_it++)
- {
- name = (*b_position_it)->get_name();
-
- for (node_instence_it = node_instances.begin();
- node_instence_it != node_instances.end(); node_instence_it++)
- {
- if (name == (*node_instence_it)->get_label())
- {
- node_instance = *node_instence_it;
- break;
- }
- }
-
- if (node_instance == NULL)
- continue; //remember position and continue in cycle
-
- if(!check_instance(node_instance, *b_position_it))
- {
- add_checked_branch(node, b);
- return false;
- }
- }
-
NodeRelationPtrVector successors = node->get_successors();
NodeRelationPtrVector::iterator it;
SuccessorNode* succ;
@@ -242,7 +209,7 @@
/*
* Compare StrictOrderArea in bMSC from HMSC node and StrictOrderArea in bMSC from defined events
*/
-bool strict_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events)
+bool strict_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events, enum check_type type)
{
if (node_events.size() != 1 || b_events.size() != 1)
return false;
@@ -252,13 +219,21 @@
while (node_e != NULL && b_e != NULL)
{
- if (compare_events(node_e, b_e))
+ if (type == membership)
{
- node_e = node_e->get_successor().get();
- b_e = b_e->get_successor().get();
+ if (!compare_events(node_e, b_e))
+ return false;
+
+ set_identification(node_e, b_e);
}
else
- return false;
+ {
+ if (!compare_events_attribute(node_e, b_e))
+ return false;
+ }
+
+ node_e = node_e->get_successor().get();
+ b_e = b_e->get_successor().get();
}
if (node_e == NULL)
@@ -312,7 +287,7 @@
else
b_events.clear();
*/
-// return true;
+ // return true;
/*
Event* node_e = node_events.front();
@@ -348,12 +323,15 @@
*
* node_events - minimal events in coregion;
* b_events - event in bmsc
+ * type - type of searching
*/
-bool coregion_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events)
+bool coregion_strict(std::vector<Event*>& node_events, std::vector<Event*>& b_events,
+ enum check_type type)
{
StrictEvent* b_e = dynamic_cast<StrictEvent*> (b_events.front());
- std::vector<Event*> accepable_events;
- std::vector<Event*>::iterator it;
+ std::vector<std::vector<Event*>::iterator> acceptable_events;
+ std::vector<Event*>::iterator node_it;
+ std::vector<std::vector<Event*>::iterator>::iterator accept_it;
CoregionEvent* node_e = NULL;
@@ -366,64 +344,72 @@
if (node_events.empty())
return true;
- for (it = node_events.begin(); it != node_events.end(); it++)
+ for (node_it = node_events.begin(); node_it != node_events.end(); node_it++)
{
- if (compare_events(*it, b_e))
+ if (compare_events(*node_it, b_e))
{
- node_e = dynamic_cast<CoregionEvent*> (*it);
+ node_e = dynamic_cast<CoregionEvent*> (*node_it);
if (node_e == NULL)
return false;
- accepable_events.push_back(*it);
+ acceptable_events.push_back(node_it);
}
}
- if (accepable_events.size() == 0)
+ if (acceptable_events.size() == 0)
return false;
- else
+
+ for (accept_it = acceptable_events.begin(); accept_it != acceptable_events.end(); accept_it++)
{
- for (it = node_events.begin(); it != node_events.end(); it++)
+ bool result = false;
+
+ if (type == membership)
+ result = compare_events(**accept_it, b_e);
+ else
+ result = compare_events_attribute(**accept_it, b_e);
+
+ if (result)
{
- if (compare_events(*it, b_e))
- {
- node_e = dynamic_cast<CoregionEvent*> (*it);
- StrictEvent* old_b_e = b_e;
- std::vector<Event*> old_node_events;
+ if (type == membership)
+ set_identification(**accept_it, b_e);
- std::vector<Event*>::iterator it_o;
- for (it_o = node_events.begin(); it_o != node_events.end(); it_o++)
- old_node_events.push_back(*it_o);
+ node_e = dynamic_cast<CoregionEvent*> (**accept_it);
+ StrictEvent* old_b_e = b_e;
+ std::vector<Event*> old_node_events;
- node_events.erase(it);
- b_e = b_e->get_successor().get();
+ std::vector<Event*>::iterator it_o;
+ for (it_o = node_events.begin(); it_o != node_events.end(); it_o++)
+ old_node_events.push_back(*it_o);
- CoregEventRelPtrVector succ = node_e->get_successors();
- CoregEventRelPtrVector::iterator succ_it;
+ node_events.erase(*accept_it);
+ b_e = b_e->get_successor().get();
- for (succ_it = succ.begin(); succ_it != succ.end(); succ_it++)
- node_events.push_back((*succ_it)->get_successor());
+ CoregEventRelPtrVector succ = node_e->get_successors();
+ CoregEventRelPtrVector::iterator succ_it;
- b_events.clear();
- b_events.push_back(b_e);
+ for (succ_it = succ.begin(); succ_it != succ.end(); succ_it++)
+ node_events.push_back((*succ_it)->get_successor());
- if (coregion_strict(node_events, b_events))
- {
- if (b_events.size() == 1 && *(b_events.begin()) == NULL)
- b_events.clear();
+ b_events.clear();
+ b_events.push_back(b_e);
- return true;
- }
- else
- {
- b_e = old_b_e;
+ if (coregion_strict(node_events, b_events, type))
+ {
+ if (b_events.size() == 1 && *(b_events.begin()) == NULL)
+ b_events.clear();
- node_events.clear();
- for (it_o = old_node_events.begin(); it_o != old_node_events.end(); it_o++)
- node_events.push_back(*it_o);
- }
+ return true;
}
+ else
+ {
+ b_e = old_b_e;
+
+ node_events.clear();
+ for (it_o = old_node_events.begin(); it_o != old_node_events.end(); it_o++)
+ node_events.push_back(*it_o);
+ }
}
}
@@ -441,56 +427,56 @@
std::cerr << "unsuported function: finded bMSC cannot contain coregion" << std::endl;
return false;
-/*
- std::vector<Event*>::iterator node_it, b_it;
- CoregionEvent* node_e = NULL;
- CoregionEvent* b_e = NULL;
+ /*
+ std::vector<Event*>::iterator node_it, b_it;
+ CoregionEvent* node_e = NULL;
+ CoregionEvent* b_e = NULL;
- for (node_it = node_events.begin(); node_it != node_events.end(); node_it++)
- {
- for (b_it = b_events.begin(); b_it != b_events.end();)
+ for (node_it = node_events.begin(); node_it != node_events.end(); node_it++)
{
- if (compare_events(*node_it, *b_it))
+ for (b_it = b_events.begin(); b_it != b_events.end();)
{
- while (node_e != NULL && b_e != NULL)
+ if (compare_events(*node_it, *b_it))
{
- if (compare_events(node_e, b_e))
+ while (node_e != NULL && b_e != NULL)
{
- // node_e = node_e->get_successors();
- // b_e = node_e->get_successors();
+ if (compare_events(node_e, b_e))
+ {
+ // node_e = node_e->get_successors();
+ // b_e = node_e->get_successors();
+ }
+ else
+ {
+ //neni su rovnake
+ }
}
- else
+
+ if ((node_e == NULL) == (b_e == NULL))
{
//neni su rovnake
}
- }
+ else
+ {
+ std::vector<Event*>::iterator a = node_it++;
+ std::vector<Event*>::iterator b = b_it++;
+ node_events.erase(a);
+ b_events.erase(b);
+ }
- if ((node_e == NULL) == (b_e == NULL))
- {
- //neni su rovnake
}
- else
- {
- std::vector<Event*>::iterator a = node_it++;
- std::vector<Event*>::iterator b = b_it++;
- node_events.erase(a);
- b_events.erase(b);
- }
-
}
}
- }
- if (b_events.empty() != node_events.empty())
- {
- //neni su rovnake
- }
+ if (b_events.empty() != node_events.empty())
+ {
+ //neni su rovnake
+ }
- b_events.clear();
- node_events.clear();
+ b_events.clear();
+ node_events.clear();
- return true;
-*/
+ return true;
+ */
}
InstancePtr find_instance(InstancePtrList instances, std::wstring name)
@@ -508,6 +494,7 @@
}
//TODO
+
/*
* Add checked branch to map of checked branches
*/
@@ -555,6 +542,43 @@
return true;
}
+bool compare_events_attribute(Event* a, Event* b)
+{
+ IncompleteMessagePtr incom_a = boost::dynamic_pointer_cast<IncompleteMessage > (a->get_message());
+ IncompleteMessagePtr incom_b = boost::dynamic_pointer_cast<IncompleteMessage > (b->get_message());
+
+ switch ((incom_a != NULL) + (incom_b != NULL))
+ {
+ case 2:
+ return true;
+ break;
+
+ case 1:
+ return false;
+ break;
+
+ case 0:
+ break;
+
+ default:
+ return false;
+ }
+
+ int a_id, b_id;
+ bool a_set = true;
+
+ a_id = a->get_attribute("identification", -1, a_set);
+
+ bool b_set = true;
+
+ b_id = b->get_attribute("identification", -2, b_set);
+
+ if (a_set || b_set || a_id != b_id)
+ return false;
+
+ return true;
+}
+
/*
* Tries finding bMSC in bMSC
*
@@ -569,7 +593,7 @@
//creates start node
StartNodePtr start_n = new StartNode();
hmsc->set_start(start_n);
-
+
//creates reference node
ReferenceNodePtr ref_node = new ReferenceNode();
ref_node->set_msc(bmsc);
@@ -577,10 +601,10 @@
hmsc->add_node(ref_node);
PredecessorNode* node = dynamic_cast<PredecessorNode*> (start_n.get());
SuccessorNode* succ = dynamic_cast<SuccessorNode*> (ref_node.get());
-
- if(node != NULL && succ != NULL)
+
+ if (node != NULL && succ != NULL)
node->add_successor(succ);
- else
+ else
{
std::cout << "unexpected error" << std::endl;
return false;
@@ -593,14 +617,14 @@
node = dynamic_cast<PredecessorNode*> (ref_node.get());
succ = dynamic_cast<SuccessorNode*> (end_n.get());
- if(node != NULL && succ != NULL)
+ if (node != NULL && succ != NULL)
node->add_successor(succ);
else
{
std::cout << "unexpected error" << std::endl;
return false;
}
-
+
return search_hmsc(hmsc, bmsc_f);
}
@@ -684,127 +708,243 @@
/*
* Checks instance
*/
-bool check_instance(InstancePtr node_instance, PositionPtr b_position)
+bool check_instance(InstancePtr node_instance, enum check_type type, PositionPtr old_position)
{
- std::vector<Event*> node_events, b_events;
- EventAreaPtr node_area, b_area;
- std::wstring name;
+ std::vector<Event*> node_events, b_events;
+ EventAreaPtr node_area, b_area;
+ std::wstring name;
- b_events = b_position->get_events();
+ b_events = old_position->get_events();
- if (!b_events.size() == 1)
- return false;
+ if (!b_events.size() == 1)
+ return false;
- if (node_instance != NULL)
- node_area = node_instance->get_first();
+ if (node_instance != NULL)
+ node_area = node_instance->get_first();
+ //return true if the node has not event on the instance
+ //because matching event to pattern bMSC can be defined in successor of node
+ if (node_area == NULL && !old_position->is_empty())
+ return true;
+
StrictEvent* b_event = dynamic_cast<StrictEvent*> (b_events[0]);
- StrictOrderAreaPtr b_strict;
- CoregionAreaPtr node_coregion, b_coregion;
+ StrictOrderAreaPtr b_strict;
+ CoregionAreaPtr node_coregion, b_coregion;
- if (b_event != NULL)
- {
- b_area = b_strict = b_event->get_area();
- }
- else
- {
- CoregionEvent* b_cor = dynamic_cast<CoregionEvent*> (b_events[0]);
- b_area = b_coregion = b_cor->get_area();
- }
+ if (b_event != NULL)
+ {
+ b_area = b_strict = b_event->get_area();
+ }
+ else
+ {
+ CoregionEvent* b_cor = dynamic_cast<CoregionEvent*> (b_events[0]);
+ b_area = b_coregion = b_cor->get_area();
+ }
- StrictOrderAreaPtr node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
+ StrictOrderAreaPtr node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
- if (node_strict == NULL)
- {
- node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
- node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
- node_coregion->get_minimal_events().end());
- }
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+
+ if (node_coregion != NULL)
+ {
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
+ else
+ {
+ std::cerr << "Tipecast failed" << std::endl;
+ return false;
+ }
+ }
+ else
+ {
+ if (node_events.empty())
+ node_events.push_back(node_strict->get_first().get());
+ else
+ std::cout << "node_events should be empty" << std::endl;
+ }
+
+ bool result;
+
+ while (node_area != NULL && b_area != NULL)
+ {
+ switch ((node_strict != NULL) + (b_strict != NULL))
+ {
+ case 2:
+ result = strict_strict(node_events, b_events, type);
+ break;
+
+ case 1:
+ if (node_strict != NULL)
+ result = strict_coregion(node_strict, node_events, b_coregion, b_events);
else
- {
- if (node_events.empty())
- node_events.push_back(node_strict->get_first().get());
- else
- std::cout << "node_events should be empty" << std::endl;
- }
+ result = coregion_strict(node_events, b_events, type);
+ break;
- bool result;
+ case 0:
+ result = coregion_coretion(node_coregion, node_events, b_coregion, b_events);
+ break;
- while (node_area != NULL && b_area != NULL)
+ default:
+ return false;
+ }
+
+ if (result)
+ {
+ if (node_events.empty())
{
- switch ((node_strict != NULL) + (b_strict != NULL))
+ node_area = node_area->get_next();
+
+ if (node_area != NULL)
{
- case 2:
- result = strict_strict(node_events, b_events);
- break;
+ node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
- case 1:
- if (node_strict != NULL)
- result = strict_coregion(node_strict, node_events, b_coregion, b_events);
+ if (node_strict == NULL)
+ {
+ node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
+ node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
+ node_coregion->get_minimal_events().end());
+ }
else
- result = coregion_strict(node_events, b_events);
- break;
-
- case 0:
- result = coregion_coretion(node_coregion, node_events, b_coregion, b_events);
- break;
+ {
+ node_events.push_back(node_strict->get_first().get());
+ }
}
+ }
- if (result)
+ if (b_events.empty())
+ {
+ b_area = b_area->get_next();
+
+ if (b_area != NULL)
{
- if (node_events.empty())
- {
- node_area = node_area->get_next();
+ b_strict = boost::dynamic_pointer_cast<StrictOrderArea > (b_area);
- if (node_area != NULL)
- {
- node_strict = boost::dynamic_pointer_cast<StrictOrderArea > (node_area);
- if (node_strict == NULL)
- {
- node_coregion = boost::dynamic_pointer_cast<CoregionArea > (node_area);
- node_events.insert(node_events.begin(), node_coregion->get_minimal_events().begin(),
- node_coregion->get_minimal_events().end());
- }
- else
- {
- node_events.push_back(node_strict->get_first().get());
- }
- }
+ if (b_strict == NULL)
+ {
+ b_coregion = boost::dynamic_pointer_cast<CoregionArea > (b_area);
+ b_events.insert(b_events.begin(), b_coregion->get_minimal_events().begin(),
+ b_coregion->get_minimal_events().end());
}
-
- if (b_events.empty())
+ else
{
- b_area = b_area->get_next();
+ b_events.push_back(b_strict->get_first().get());
+ }
+ }
+ }
+ }
+ else
+ return false;
- if (b_area != NULL)
- {
- b_strict = boost::dynamic_pointer_cast<StrictOrderArea > (b_area);
+ }
+ if ((node_area != NULL) && (b_area == NULL))
+ return false;
- if (b_strict == NULL)
- {
- b_coregion = boost::dynamic_pointer_cast<CoregionArea > (b_area);
- b_events.insert(b_events.begin(), b_coregion->get_minimal_events().begin(),
- b_coregion->get_minimal_events().end());
- }
- else
- {
- b_events.push_back(b_strict->get_first().get());
- }
- }
- }
- }
- else
- return false;
+ if (node_area == NULL)
+ old_position->set_events(b_events);
+ return true;
+}
+
+/*
+ * Check bMsc on which ReferenceNode references. Check_type defindes search settings
+ *
+ * check_type = membership defines that the function traverses node and bMSC,
+ * checks matching events and set attribute to receive events
+ *
+ * check_type = receive_ordering checks attribute of receive events whether matching is correct.
+ *
+ * Membership mode: bMSCs are traversed first time, old_conf defines points
+ * from where it starts traverse,
+ *
+ * Receive_ordering mode: bMSCs are traversed second time, old_conf defines points
+ * from where it starts traverse,
+ */
+bool check_node(ReferenceNodePtr node, enum check_type type, ConfigurationPtr old_conf)
+{
+ //get msc from the node
+ MscPtr msc = node->get_msc();
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
+
+ if (bmsc == NULL)
+ return false;
+
+ InstancePtrList node_instances = bmsc->get_instances();
+ InstancePtrList old_instances = old_conf->get_instances();
+
+ InstancePtrList::iterator node_instence_it, old_instance_it;
+
+ std::set<PositionPtr> old_positions = old_conf->get_positions();
+ std::set<PositionPtr>::iterator old_position_it;
+
+ if (node_instances.size() > old_instances.size())
+ {
+ if (!is_empty_instance(node_instances, old_instances))
+ return false;
+ }
+
+ InstancePtr node_instance = NULL;
+ std::vector<Event*> node_events, old_events;
+ EventAreaPtr node_area, old_area;
+ std::wstring name;
+
+ //checks each instances from the position to the end of bMSC or the end of the HMSC node
+ for (old_position_it = old_positions.begin(); old_position_it != old_positions.end();
+ old_position_it++)
+ {
+ name = (*old_position_it)->get_name();
+
+ node_instance = NULL;
+
+ for (node_instence_it = node_instances.begin();
+ node_instence_it != node_instances.end(); node_instence_it++)
+ {
+ if (name == (*node_instence_it)->get_label())
+ {
+ node_instance = *node_instence_it;
+ break;
}
+ }
- if ((node_area != NULL) && (b_area == NULL))
- return false;
+ if (node_instance == NULL)
+ continue; //remember position and continue in cycle
- if (node_area == NULL)
- b_position->set_events(b_events);
+ if (!check_instance(node_instance, type, *old_position_it))
+ {
+ add_checked_branch(node, old_conf);
+ return false;
+ }
+ }
- return true;
+ return true;
}
+
+void set_identification(Event* node_e, Event* b_e)
+{
+ if (node_e->is_send())
+ {
+ node_e->set_attribute("identification", max_id);
+ b_e->set_attribute("identification", max_id++);
+
+ CompleteMessagePtr node_message = node_e->get_complete_message();
+
+ if (node_message != NULL)
+ {
+ Event* event = node_message->get_receive_event();
+ event->set_attribute("identification", max_id);
+ }
+
+ CompleteMessagePtr b_message = b_e->get_complete_message();
+
+ if (b_message != NULL)
+ {
+ Event* event = b_message->get_receive_event();
+ event->set_attribute("identification", max_id++);
+ }
+
+ }
+}
\ No newline at end of file
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-02-22 02:48:40 UTC (rev 613)
+++ trunk/src/membership/membership_alg.h 2010-02-22 16:38:15 UTC (rev 614)
@@ -26,6 +26,7 @@
class Position;
class Configuration;
class Membership;
+enum check_type {membership, receive_ordering};
typedef boost::intrusive_ptr<Position> PositionPtr;
typedef boost::intrusive_ptr<Configuration> ConfigurationPtr;
@@ -66,6 +67,20 @@
}
}
+ Position(PositionPtr origin)
+ {
+ this->m_counter = 0;
+ this->name = origin->get_name();
+
+ std::vector<Event*>::iterator it;
+ std::vector<Event*> origin_events = origin->get_events();
+
+ for(it = origin_events.begin(); it != origin_events.end(); it++)
+ {
+ events.push_back(*it);
+ }
+ }
+
std::wstring get_name()
{
return name;
@@ -146,6 +161,19 @@
{
events = new_events;
}
+
+ bool is_empty()
+ {
+ std::vector<Event*>::iterator it;
+
+ for(it = events.begin(); it != events.end(); it++)
+ {
+ if(*it != NULL)
+ return false;
+ }
+
+ return true;
+ }
};
inline void intrusive_ptr_add_ref(const Position *ptr)
@@ -208,12 +236,26 @@
}
}
- Configuration(std::set<PositionPtr> positions)
+ Configuration(ConfigurationPtr origin) //std::set<PositionPtr> positions)
{
this->m_counter = 0;
- this->positions = positions;
+// this->positions = positions;
+
+ InstancePtrList origin_inst = origin->get_instances();
+ this->instance_list.insert(instance_list.begin(), origin_inst.begin(), origin_inst.end());
+
+ std::set<PositionPtr> origin_positions = origin->get_positions();
+
+ std::set<PositionPtr>::iterator it;
+
+ for(it = origin_positions.begin(); it != origin_positions.end(); it++)
+ {
+ this->positions.insert(new Position(*it));
+ }
+// this->positions.insert(origin_positions.begin(), origin_positions.end());
}
+
PositionPtr find(PositionPtr p)
{
std::set<PositionPtr>::iterator it;
@@ -226,6 +268,19 @@
return NULL;
}
+ PositionPtr find(std::wstring name)
+ {
+ std::set<PositionPtr>::iterator it;
+
+ for(it = positions.begin(); it != positions.end(); it++)
+ {
+ if((*it)->get_name() == name)
+ return *it;
+ }
+
+ return NULL;
+ }
+
bool is_null()
{
std::set<PositionPtr>::iterator it;
@@ -322,6 +377,8 @@
*/
virtual MscPtr find(MscPtr hmsc, MscPtr bmsc);
+MscPtr get_dp_msc(MscPtr msc);
+
/**
* Cleans up no more needed attributes.
*/
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-02-22 02:48:40 UTC (rev 613)
+++ trunk/tests/membership/CMakeLists.txt 2010-02-22 16:38:15 UTC (rev 614)
@@ -88,7 +88,7 @@
ADD_TEST(membership_test-35 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_1.mpr 1)
-ADD_TEST(membership_test-36 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_2.mpr 1)
+ADD_TEST(membership_test-36 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_2.mpr 0)
ADD_TEST(membership_test-37 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc18.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc18_3.mpr 0)
@@ -108,4 +108,34 @@
ADD_TEST(membership_test-44 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/rozcvicka_long.mpr ${CMAKE_CURRENT_SOURCE_DIR}/rozcvicka_bmsc.mpr 1)
+#test coregion ordering skontrolovat
+ADD_TEST(membership_test-45 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc20.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc20_1.mpr 1)
+ADD_TEST(membership_test-46 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc20.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc20_2.mpr 0)
+
+#incomplete messages
+ADD_TEST(membership_test-47 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURREN...
[truncated message content] |
|
From: <got...@us...> - 2010-02-28 16:38:39
|
Revision: 632
http://scstudio.svn.sourceforge.net/scstudio/?rev=632&view=rev
Author: gotthardp
Date: 2010-02-28 16:38:28 +0000 (Sun, 28 Feb 2010)
Log Message:
-----------
Module configurator now supports float parameters.
Registry readers/writers now support float registry entries.
Completed initial MonteCarlo simulator for both bMSC and HMSC.
Modified Paths:
--------------
trunk/src/data/configurator.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/simulator.h
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
trunk/src/view/visio/addon/dllmodule.cpp
trunk/src/view/visio/addon/dllmodule.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/document_check.cpp
trunk/src/view/visio/addon/document_simulation.cpp
trunk/src/view/visio/addon/optionsdlg.cpp
trunk/src/view/visio/addon/resource.h
trunk/src/view/visio/addon/simulatordlg.cpp
trunk/src/view/visio/addon/simulatordlg.h
trunk/src/view/visio/addon/stdafx.h
trunk/src/view/visio/build-setup.bat
trunk/src/view/visio/scstudio.nsi
trunk/tests/montecarlo/montecarlo_test.cpp
Added Paths:
-----------
trunk/tests/montecarlo/test_cycle_bmsc.mpr
trunk/tests/montecarlo/test_simple_bmsc.mpr
trunk/tests/montecarlo/test_simple_hmsc.vsd
Removed Paths:
-------------
trunk/tests/montecarlo/test_cycle.mpr
trunk/tests/montecarlo/test_simple.mpr
Modified: trunk/src/data/configurator.h
===================================================================
--- trunk/src/data/configurator.h 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/data/configurator.h 2010-02-28 16:38:28 UTC (rev 632)
@@ -25,6 +25,7 @@
virtual ~ConfigProvider() {}
virtual long get_config_long(const std::wstring& section, const std::wstring& parameter, long def = 0) const = 0;
+ virtual float get_config_float(const std::wstring& section, const std::wstring& parameter, float def = 0.0f) const = 0;
};
class ConfigReader
@@ -42,6 +43,9 @@
long get_config_long(const std::wstring& section,
const std::wstring& parameter, long def = 0) const
{ return m_config_provider ? m_config_provider->get_config_long(section, parameter, def) : def; }
+ float get_config_float(const std::wstring& section,
+ const std::wstring& parameter, float def = 0.0f) const
+ { return m_config_provider ? m_config_provider->get_config_float(section, parameter, def) : def; }
private:
ConfigProvider* m_config_provider;
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/data/msc.cpp 2010-02-28 16:38:28 UTC (rev 632)
@@ -223,7 +223,9 @@
case PROBABILITY:
try
{
- m_probability = boost::lexical_cast<double>(*itoken);
+ m_probability = boost::lexical_cast<double>(*itoken)/100.0;
+ if(m_probability < 0 || m_probability > 1)
+ throw std::runtime_error("Bad condition: wrong probability");
state = PERCENT;
}
catch(boost::bad_lexical_cast&)
@@ -285,7 +287,7 @@
break;
case RANDOM:
- text << "for " << m_probability << "%";
+ text << "for " << m_probability*100.0 << "%";
break;
case OTHERWISE:
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/data/msc.h 2010-02-28 16:38:28 UTC (rev 632)
@@ -1073,21 +1073,7 @@
class SCMSC_EXPORT ConditionNode:
public HMscNode, public PredecessorNode, public SuccessorNode
{
- enum ConditionType
- {
- SETTING, // <state1>, <state2>
- GUARDING, // when <state1>, <state2>
- RANDOM, // for 50%
- OTHERWISE
- };
- ConditionType m_type;
-
- std::vector<std::string> m_names;
- //! probability this condition is applied
- double m_probability;
-
public:
-
ConditionNode():HMscNode(),PredecessorNode(),SuccessorNode(),
m_type(OTHERWISE), m_probability(1.0)
{
@@ -1120,6 +1106,14 @@
void assign_label(const std::string& label);
std::string get_label() const;
+ enum ConditionType
+ {
+ SETTING, // <state1>, <state2>
+ GUARDING, // when <state1>, <state2>
+ RANDOM, // for 50%
+ OTHERWISE
+ };
+
//! Setter of m_type
void set_type(ConditionType type)
{
@@ -1155,6 +1149,13 @@
{
return m_probability;
}
+
+private:
+ ConditionType m_type;
+
+ std::vector<std::string> m_names;
+ //! probability (0-1) this condition is applied
+ double m_probability;
};
/**
@@ -2567,6 +2568,11 @@
return m_node_origin;
}
+ bool is_top_node_a()
+ {
+ return m_node_origin->is_time_relation_top(this);
+ }
+
bool is_bottom_node_a()
{
return m_node_origin->is_time_relation_bottom(this);
@@ -2577,6 +2583,11 @@
return m_node;
}
+ bool is_top_node_b()
+ {
+ return m_node->is_time_relation_top(this);
+ }
+
bool is_bottom_node_b()
{
return m_node->is_time_relation_bottom(this);
Modified: trunk/src/data/simulator.h
===================================================================
--- trunk/src/data/simulator.h 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/data/simulator.h 2010-02-28 16:38:28 UTC (rev 632)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
*
* $Id$
*/
@@ -22,6 +22,7 @@
#include <boost/shared_ptr.hpp>
#include "data/msc.h"
+#include "data/configurator.h"
#include "data/reporter.h"
#if defined(_MSC_VER)
@@ -29,14 +30,21 @@
#pragma warning(disable: 4275)
#endif
+struct MeasurementMap
+{
+ typedef std::map<std::string, std::vector<double> > DensityMap;
+
+ DensityMap density;
+ double bin_width;
+};
+
class SimulationListener;
typedef boost::shared_ptr<SimulationListener> SimulationListenerPtr;
-class Simulator : public Reporter
+class Simulator : public ConfigReader, public Reporter
{
public:
virtual ~Simulator() {}
- typedef std::map<std::string, double> MeasurementsMap;
void set_process_count(int i)
{ m_process_count = i; }
@@ -65,7 +73,7 @@
public:
virtual ~SimulationListener() {}
- virtual void on_result(const Simulator::MeasurementsMap& measurements) = 0;
+ virtual void on_result(const MeasurementMap& measurements) = 0;
virtual void on_error(const std::string& what) = 0;
};
Modified: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-28 16:38:28 UTC (rev 632)
@@ -35,6 +35,8 @@
time_end = std::max(time_end, itime);
}
+ MeasurementList measurements;
+
// step 2: walk through the timestamps and verify constraints
for(BMscDealer::EventTimeMap::const_iterator tpos = m_timestamps.begin();
tpos != m_timestamps.end(); tpos++)
@@ -49,18 +51,30 @@
BMscDealer::EventTimeMap::const_iterator tpos2 = m_timestamps.find((*rpos)->get_event_b());
assert(tpos2 != m_timestamps.end());
+ double delay = fabs(tpos2->second - tpos->second);
// directed constraint applies only to events
// when they dynamically occur in the direction indicated
if(!(*rpos)->is_directed() ||
/* (*rpos)->is_directed() && */ tpos->second < tpos2->second)
{
// if the constraint is violated, reject this trace
- if(!(*rpos)->get_interval_set().includes(fabs(tpos2->second - tpos->second)))
+ if(!(*rpos)->get_interval_set().includes(delay))
throw Reject();
}
+
+ if(!(*rpos)->get_measurement().empty())
+ measurements.push_back(std::make_pair((*rpos)->get_measurement(), delay));
}
}
+ // trace was accepted
+ // add measurements to histogram
+ for(MeasurementList::const_iterator mpos = measurements.begin();
+ mpos != measurements.end(); mpos++)
+ {
+ m_state.add_measurement(mpos->first, mpos->second);
+ }
+
return time_end;
}
@@ -183,7 +197,7 @@
if(event->is_send() && event->get_matching_event())
{
// generate delay for this message transmission
- double delay = m_rng();
+ double delay = m_delay_rng();
traverse_event(time_begin+delay, event->get_matching_event());
// event time is stored in m_timestamps
@@ -195,18 +209,29 @@
// step 1: create timestamps of all reference nodes
double time_end = traverse_node(time_begin, hmsc->get_start().get());
+ MeasurementList measurements;
+
// step 2: walk through the timestamps and verify constraints
for(HMscDealer::ReferenceNodeTimeMap::const_iterator tpos = m_timestamps.begin();
tpos != m_timestamps.end(); tpos++)
{
- check_relations(tpos, tpos->first->get_time_relations_top());
- check_relations(tpos, tpos->first->get_time_relations_bottom());
+ check_relations(measurements, tpos, tpos->first->get_time_relations_top());
+ check_relations(measurements, tpos, tpos->first->get_time_relations_bottom());
}
+ // trace was accepted
+ // add measurements to histogram
+ for(MeasurementList::const_iterator mpos = measurements.begin();
+ mpos != measurements.end(); mpos++)
+ {
+ m_state.add_measurement(mpos->first, mpos->second);
+ }
+
return time_end;
}
-void MonteCarlo::HMscDealer::check_relations(const HMscDealer::ReferenceNodeTimeMap::const_iterator tpos,
+void MonteCarlo::HMscDealer::check_relations(MeasurementList& measurements,
+ const HMscDealer::ReferenceNodeTimeMap::const_iterator tpos,
const TimeRelationRefNodePtrSet& relations) const
{
for(TimeRelationRefNodePtrSet::const_iterator rpos = relations.begin();
@@ -216,10 +241,10 @@
continue;
double time_a;
- if((*rpos)->is_bottom_node_a())
+ if((*rpos)->is_top_node_a())
+ time_a = tpos->second.first;
+ else
time_a = tpos->second.second;
- else
- time_a = tpos->second.first;
std::pair<HMscDealer::ReferenceNodeTimeMap::const_iterator,
HMscDealer::ReferenceNodeTimeMap::const_iterator> all_peers = m_timestamps.equal_range((*rpos)->get_ref_node_b());
@@ -234,15 +259,19 @@
else
time_b = tpos2->second.first;
+ double delay = fabs(time_b - time_a);
// directed constraint applies only to events
// when they dynamically occur in the direction indicated
if(!(*rpos)->is_directed() ||
/* (*rpos)->is_directed() && */ time_a < time_b)
{
// if the constraint is violated, reject this trace
- if(!(*rpos)->get_interval_set().includes(fabs(time_b - time_a)))
+ if(!(*rpos)->get_interval_set().includes(delay))
throw Reject();
}
+
+ if(!(*rpos)->get_measurement().empty())
+ measurements.push_back(std::make_pair((*rpos)->get_measurement(), delay));
}
}
}
@@ -272,9 +301,13 @@
HMscNode* next_node = dynamic_cast<HMscNode*>(relation->get_successor());
return traverse_node(next_time, next_node);
}
+ else
+ // disconnected node reached
+ throw Reject();
}
-
- return next_time;
+ else
+ // end node reached
+ return next_time;
}
double MonteCarlo::HMscDealer::traverse_reference(double time_begin, ReferenceNode* node)
@@ -284,14 +317,14 @@
BMscPtr bmsc = node->get_bmsc();
if(bmsc)
{
- BMscDealer dealer(m_seeder);
+ BMscDealer dealer(m_state, m_seeder, m_max_message_delay);
time_end = dealer.traverse(time_begin, bmsc);
}
HMscPtr hmsc = node->get_hmsc();
if(hmsc)
{
- HMscDealer dealer(m_seeder);
+ HMscDealer dealer(m_state, m_seeder, m_max_message_delay);
time_end = dealer.traverse(time_begin, hmsc);
}
@@ -305,12 +338,42 @@
double MonteCarlo::HMscDealer::traverse_condition(double time_begin, ConditionNode* node)
{
- // reject if the probability condition is not satisfied
- if(m_rng() > node->get_probability())
+ switch(node->get_type())
+ {
+ case ConditionNode::SETTING:
+ // setting condition will reset all previous states
+ /* Z.120: If the guard is a set of condition names, the last setting condition
+ * on that set of instances must have a non-empty intersection with the guard. */
+ m_state.states.clear();
+ // set new states
+ for(std::vector<std::string>::const_iterator npos = node->get_names().begin();
+ npos != node->get_names().end(); npos++)
+ {
+ m_state.states.insert(*npos);
+ }
+ break;
+
+ case ConditionNode::GUARDING:
+ for(std::vector<std::string>::const_iterator npos = node->get_names().begin();
+ npos != node->get_names().end(); npos++)
+ {
+ // pass if at least one state is set
+ if(m_state.states.find(*npos) != m_state.states.end())
+ return time_begin;
+ }
throw Reject();
- // TODO: implement states
+ case ConditionNode::RANDOM:
+ // reject if the probability condition is not satisfied
+ if(m_rng() > node->get_probability())
+ throw Reject();
+ break;
+ case ConditionNode::OTHERWISE:
+ default:
+ break;
+ }
+
return time_begin;
}
@@ -319,73 +382,45 @@
m_stoprequested = true;
m_callback_active = false;
m_process_count = 1;
+
+ m_bin_width = 1.0f;
+ m_max_message_delay = 10.0f;
}
-int MonteCarlo::do_sample(boost::mt19937& seeder, const MscPtr& msc)
+int MonteCarlo::do_sample(SimulationState& state, boost::lagged_fibonacci607& seeder, const MscPtr& msc)
{
- MeasurementsMap measurements;
-
- BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
- if(bmsc)
+ try
{
- BMscDealer dealer(seeder);
- dealer.traverse(0, bmsc);
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ if(bmsc)
+ {
+ BMscDealer dealer(state, seeder, m_max_message_delay);
+ dealer.traverse(0, bmsc);
+ return 1; // accepted
+ }
- const BMscDealer::EventTimeMap& timestamps = dealer.get_timestamps();
- // walk through all timestamps and extract measurements
- for(BMscDealer::EventTimeMap::const_iterator tpos = timestamps.begin();
- tpos != timestamps.end(); tpos++)
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+ if(hmsc)
{
- const TimeRelationEventPtrList& relations = tpos->first->get_time_relations();
- for(TimeRelationEventPtrList::const_iterator rpos = relations.begin();
- rpos != relations.end(); rpos++)
- {
- if((*rpos)->get_event_a() != tpos->first)
- continue;
-
- BMscDealer::EventTimeMap::const_iterator tpos2 = timestamps.find((*rpos)->get_event_b());
- assert(tpos2 != timestamps.end());
-
- if(!(*rpos)->get_measurement().empty())
- measurements[(*rpos)->get_measurement()] = tpos2->second - tpos->second;
- }
+ HMscDealer dealer(state, seeder, m_max_message_delay);
+ dealer.traverse(0, hmsc);
+ return 1; // accepted
}
}
+ catch(Reject&)
+ { }
- HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
- if(hmsc)
- {
- HMscDealer dealer(seeder);
- dealer.traverse(0, hmsc);
- }
-
- // the trace is accepted
- // process the calculated measurements by the listener
- boost::mutex::scoped_lock lock(m_mutex);
-
- // wait until the previous callback is processed
- while(m_callback_active)
- m_callback_condition.wait(lock);
-
- if(m_listener && !m_stoprequested)
- {
- m_callback_active = true;
- m_listener->on_result(measurements);
-
- // wait for next() or stop() command
- while(m_callback_active)
- m_callback_condition.wait(lock);
- }
-
- return 0; // accepted
+ return 0; // rejected
}
void MonteCarlo::start(const MscPtr& msc)
{
- m_measurements.clear();
+ m_histograms.clear();
+ m_bin_width = get_config_float(L"Simulator", L"BinWidth", 1.0f);
+ m_max_message_delay = get_config_float(L"Simulator", L"MaxMessageDelay", 10.0f);
- boost::variate_generator<boost::mt19937, boost::uniform_int<> > seed(
- boost::mt19937((boost::int32_t)time(NULL)),
+ boost::variate_generator<boost::lagged_fibonacci607, boost::uniform_int<> > seed(
+ boost::lagged_fibonacci607((boost::int32_t)time(NULL)),
boost::uniform_int<>(0, INT_MAX));
m_stoprequested = false;
@@ -439,13 +474,52 @@
{
// pseudo-random number generators should not be initialized frequently
// to assure reentrance, we have one generator per thread
- boost::mt19937 seeder(seed);
+ boost::lagged_fibonacci607 seeder(seed);
while(!m_stoprequested)
{
try
{
- do_sample(seeder, msc);
+ SimulationState state(m_bin_width);
+
+ boost::system_time const stop_time = boost::get_system_time()
+ + boost::posix_time::seconds(1);
+ // calculate for a given time period
+ while(!m_stoprequested && stop_time > boost::get_system_time())
+ {
+ do_sample(state, seeder, msc);
+ }
+
+ boost::mutex::scoped_lock lock(m_mutex);
+
+ MeasurementMap measurements;
+ measurements.bin_width = m_bin_width;
+
+ for(HistogramMap::const_iterator hpos = state.histograms.begin();
+ hpos != state.histograms.end(); hpos++)
+ {
+ m_histograms[hpos->first] += hpos->second;
+
+ for(std::vector<size_t>::const_iterator bpos = m_histograms[hpos->first].acc.begin();
+ bpos != m_histograms[hpos->first].acc.end(); bpos++)
+ {
+ measurements.density[hpos->first].push_back(double(*bpos)/m_histograms[hpos->first].N);
+ }
+ }
+
+ // wait until the previous callback is processed
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+
+ if(m_listener && !m_stoprequested)
+ {
+ m_callback_active = true;
+ m_listener->on_result(measurements);
+
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
}
catch(std::exception& exc)
{
Modified: trunk/src/montecarlo/montecarlo.h
===================================================================
--- trunk/src/montecarlo/montecarlo.h 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/montecarlo/montecarlo.h 2010-02-28 16:38:28 UTC (rev 632)
@@ -17,6 +17,7 @@
*/
#include <boost/random.hpp>
+#include <boost/random/lagged_fibonacci.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition.hpp>
@@ -27,16 +28,66 @@
class SCMONTECARLO_EXPORT MonteCarlo : public Simulator
{
public:
+ struct Histogram
+ {
+ Histogram():
+ N(0)
+ { }
+ void add(size_t index, double value)
+ {
+ if(acc.size() < index+1)
+ acc.resize(index+1);
+ acc[index]++;
+
+ N++;
+ }
+
+ Histogram& operator += (const Histogram& r)
+ {
+ if(r.acc.size() > acc.size())
+ acc.resize(r.acc.size());
+ for(size_t i = 0; i < r.acc.size(); i++)
+ acc[i] += r.acc[i];
+
+ N += r.N;
+ return *this;
+ }
+
+ std::vector<size_t> acc;
+ size_t N;
+ };
+
+ typedef std::map<std::string, Histogram> HistogramMap;
+
+ struct SimulationState
+ {
+ SimulationState(double width):
+ bin_width(width)
+ { }
+
+ void add_measurement(const std::string& name, double value)
+ {
+ histograms[name].add((size_t)floor(value/bin_width), value);
+ }
+
+ HistogramMap histograms;
+ double bin_width;
+
+ std::set<std::string> states;
+ };
+
+ typedef std::vector<std::pair<std::string, double> > MeasurementList;
+
class Reject
{ };
class BMscDealer
{
public:
- BMscDealer(boost::mt19937& seeder) :
- m_seeder(seeder),
- m_rng(seeder, boost::uniform_real<>(0,10))
+ BMscDealer(SimulationState& state, boost::lagged_fibonacci607& seeder, float max_message_delay) :
+ m_state(state), m_seeder(seeder),
+ m_delay_rng(seeder, boost::uniform_real<>(0,max_message_delay))
{ }
double traverse(double time_begin, const BMscPtr& bmsc);
@@ -46,8 +97,10 @@
{ return m_timestamps; }
private:
- boost::mt19937& m_seeder;
- boost::variate_generator<boost::mt19937&, boost::uniform_real<> > m_rng;
+ SimulationState& m_state;
+ boost::lagged_fibonacci607& m_seeder;
+ //! random number generator used to generate message delay
+ boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > m_delay_rng;
double traverse_area(double time_begin, EventArea* area);
double traverse_event(double time_begin, Event* event);
@@ -64,9 +117,10 @@
class HMscDealer
{
public:
- HMscDealer(boost::mt19937& seeder) :
- m_seeder(seeder),
- m_rng(seeder, boost::uniform_real<>(0,1))
+ HMscDealer(SimulationState& state, boost::lagged_fibonacci607& seeder, float max_message_delay) :
+ m_state(state), m_seeder(seeder),
+ m_rng(seeder, boost::uniform_real<>(0,1)),
+ m_max_message_delay(max_message_delay)
{ }
double traverse(double time_begin, const HMscPtr& hmsc);
@@ -76,21 +130,25 @@
{ return m_timestamps; }
private:
- boost::mt19937& m_seeder;
- boost::variate_generator<boost::mt19937&, boost::uniform_real<> > m_rng;
+ SimulationState& m_state;
+ boost::lagged_fibonacci607& m_seeder;
+ //! random number generator used for path selection
+ boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > m_rng;
- void check_relations(const HMscDealer::ReferenceNodeTimeMap::const_iterator tpos,
+ void check_relations(MeasurementList& measurements,
+ const HMscDealer::ReferenceNodeTimeMap::const_iterator tpos,
const TimeRelationRefNodePtrSet& relations) const;
double traverse_node(double time_begin, HMscNode* node);
double traverse_reference(double time_begin, ReferenceNode* node);
double traverse_condition(double time_begin, ConditionNode* node);
+ float m_max_message_delay;
ReferenceNodeTimeMap m_timestamps;
};
MonteCarlo();
- int do_sample(boost::mt19937& seeder, const MscPtr& msc);
+ int do_sample(SimulationState& state, boost::lagged_fibonacci607& seeder, const MscPtr& msc);
//! Start simulation and measurement calculation.
virtual void start(const MscPtr& msc);
@@ -113,7 +171,9 @@
boost::condition m_callback_condition;
bool m_callback_active;
- MeasurementsMap m_measurements;
+ HistogramMap m_histograms;
+ float m_bin_width;
+ float m_max_message_delay;
};
// $Id$
Modified: trunk/src/view/visio/addon/dllmodule.cpp
===================================================================
--- trunk/src/view/visio/addon/dllmodule.cpp 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/view/visio/addon/dllmodule.cpp 2010-02-28 16:38:28 UTC (rev 632)
@@ -148,89 +148,6 @@
return bstrRetBuf;
}
-class RegistryValueNotFound
-{ };
-
-DWORD GetRegistryDWORD(HKEY key, const TCHAR* subkey, const TCHAR* parameter)
-{
- HKEY hPathKey;
- if(RegOpenKeyEx(key, subkey, 0, KEY_READ, &hPathKey) != ERROR_SUCCESS)
- {
- throw RegistryValueNotFound();
- }
-
- DWORD valueType;
- DWORD value;
- DWORD valueLength = sizeof(DWORD);
-
- if(RegQueryValueEx(hPathKey, parameter,
- NULL, &valueType, (LPBYTE)&value, &valueLength) != ERROR_SUCCESS)
- {
- throw RegistryValueNotFound();
- }
-
- RegCloseKey(hPathKey);
- return value;
-}
-
-int SetRegistryDWORD(HKEY key, const TCHAR* subkey, const TCHAR* parameter, DWORD value)
-{
- HKEY hPathKey;
- if(RegCreateKeyEx(
- key,
- subkey,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS,
- NULL,
- &hPathKey,
- NULL) != ERROR_SUCCESS)
- {
- return 0;
- }
-
- if(RegSetValueEx(hPathKey,
- parameter,
- 0, // must be zero
- REG_DWORD, // value type
- (LPBYTE)&value, sizeof(DWORD)) != ERROR_SUCCESS)
- {
- return 0;
- }
-
- RegCloseKey(hPathKey);
- return 1;
-}
-
-DWORD GetRegistryDWORD(const TCHAR* root, const TCHAR* path, const TCHAR* parameter, DWORD default_value)
-{
- TCHAR subkey[MAX_PATH];
- // construct the subkey address
- _tcscpy(subkey, root);
- if(path != NULL && *path != 0)
- {
- _tcscat(subkey, _T("\\"));
- _tcscat(subkey, path);
- }
-
- try
- {
- return GetRegistryDWORD(HKEY_CURRENT_USER, subkey, parameter);
- }
- catch(RegistryValueNotFound)
- { }
-
- try
- {
- return GetRegistryDWORD(HKEY_LOCAL_MACHINE, subkey, parameter);
- }
- catch(RegistryValueNotFound)
- { }
-
- return default_value;
-}
-
std::list<std::wstring> GetRegistryStrings(HKEY key, const TCHAR* subkey)
{
std::list<std::wstring> result;
Modified: trunk/src/view/visio/addon/dllmodule.h
===================================================================
--- trunk/src/view/visio/addon/dllmodule.h 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/view/visio/addon/dllmodule.h 2010-02-28 16:38:28 UTC (rev 632)
@@ -28,9 +28,119 @@
std::basic_string<TCHAR> GetVisioModuleFileName();
std::basic_string<TCHAR> GetVisioModulePath();
-DWORD GetRegistryDWORD(const TCHAR* root, const TCHAR* path, const TCHAR* parameter, DWORD default_value);
-int SetRegistryDWORD(HKEY key, const TCHAR* subkey, const TCHAR* parameter, DWORD value);
+class RegistryValueNotFound
+{ };
+template<class T, DWORD type>
+T __GetRegistry(HKEY key, const TCHAR* subkey, const TCHAR* parameter)
+{
+ HKEY hPathKey;
+ if(RegOpenKeyEx(key, subkey, 0, KEY_READ, &hPathKey) != ERROR_SUCCESS)
+ {
+ throw RegistryValueNotFound();
+ }
+
+ DWORD valueType;
+ T value;
+ DWORD valueLength = sizeof(T);
+
+ if(RegQueryValueEx(hPathKey, parameter,
+ NULL, &valueType, (LPBYTE)&value, &valueLength) != ERROR_SUCCESS)
+ {
+ throw RegistryValueNotFound();
+ }
+
+ if(valueType != type)
+ throw RegistryValueNotFound();
+
+ RegCloseKey(hPathKey);
+ return value;
+}
+
+template<class T>
+inline T GetRegistry(HKEY key, const TCHAR* subkey, const TCHAR* parameter)
+{
+ return __GetRegistry<T,REG_BINARY>(key, subkey, parameter);
+}
+
+template<>
+inline DWORD GetRegistry<DWORD>(HKEY key, const TCHAR* subkey, const TCHAR* parameter)
+{
+ return __GetRegistry<DWORD,REG_DWORD>(key, subkey, parameter);
+}
+
+template<class T, DWORD type>
+int __SetRegistry(HKEY key, const TCHAR* subkey, const TCHAR* parameter, T value)
+{
+ HKEY hPathKey;
+ if(RegCreateKeyEx(
+ key,
+ subkey,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hPathKey,
+ NULL) != ERROR_SUCCESS)
+ {
+ return 0;
+ }
+
+ if(RegSetValueEx(hPathKey,
+ parameter,
+ 0, // must be zero
+ type, // value type
+ (LPBYTE)&value, sizeof(T)) != ERROR_SUCCESS)
+ {
+ return 0;
+ }
+
+ RegCloseKey(hPathKey);
+ return 1;
+}
+
+template<class T>
+inline int SetRegistry(HKEY key, const TCHAR* subkey, const TCHAR* parameter, T value)
+{
+ return __SetRegistry<T,REG_BINARY>(key, subkey, parameter, value);
+}
+
+template<>
+inline int SetRegistry(HKEY key, const TCHAR* subkey, const TCHAR* parameter, DWORD value)
+{
+ return __SetRegistry<DWORD,REG_DWORD>(key, subkey, parameter, value);
+}
+
+template<class T>
+T GetRegistry(const TCHAR* root, const TCHAR* path, const TCHAR* parameter, T default_value)
+{
+ TCHAR subkey[MAX_PATH];
+ // construct the subkey address
+ _tcscpy(subkey, root);
+ if(path != NULL && *path != 0)
+ {
+ _tcscat(subkey, _T("\\"));
+ _tcscat(subkey, path);
+ }
+
+ try
+ {
+ return GetRegistry<T>(HKEY_CURRENT_USER, subkey, parameter);
+ }
+ catch(RegistryValueNotFound)
+ { }
+
+ try
+ {
+ return GetRegistry<T>(HKEY_LOCAL_MACHINE, subkey, parameter);
+ }
+ catch(RegistryValueNotFound)
+ { }
+
+ return default_value;
+}
+
std::list<std::wstring> GetRegistryStrings(const TCHAR* subkey);
class RegistryConfigProvider : public ConfigProvider
@@ -38,9 +148,13 @@
public:
virtual long get_config_long(const std::wstring& section, const std::wstring& parameter, long def = 0) const
{
- return GetRegistryDWORD(SCSTUDIO_REGISTRY_ROOT _T("\\Checks"),
- section.c_str(), parameter.c_str(), def);
+ return GetRegistry<DWORD>(SCSTUDIO_REGISTRY_ROOT, section.c_str(), parameter.c_str(), def);
}
+
+ virtual float get_config_float(const std::wstring& section, const std::wstring& parameter, float def = 0.0) const
+ {
+ return GetRegistry<float>(SCSTUDIO_REGISTRY_ROOT, section.c_str(), parameter.c_str(), def);
+ }
};
// $Id$
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2010-02-28 16:17:32 UTC (rev 631)
+++ trunk/src/view/visio/addon/dllmodule.rc 2010-02-28 16:38:28 UTC (rev 632)
@@ -52,20 +52,17 @@
COMBOBOX IDC_OUTPUTLEVEL,5,142,130,61,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END
-IDD_SIMULATOR_OPTIONS DIALOGEX 0, 0, 191, 79
+IDD_SIMULATOR_OPTIONS DIALOGEX 0, 0, 191, 52
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Simulator Options"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- LTEXT "Repetitions",IDC_STATIC,5,16,37,8
- EDITTEXT IDC_SIM_REPETITIONS,5,25,40,14,ES_AUTOHSCROLL | ES_NUMBER
- GROUPBOX "Upper limits",IDC_STATIC,52,5,75,69
+ LTEXT "Bin width",IDC_STATIC,5,16,30,8
+ EDITTEXT IDC_SIM_BIN_WIDTH,5,25,40,14,ES_AUTOHSCROLL
+ GROUPBOX "Upper limits",IDC_STATIC,52,5,75,42
LTEXT "Message delay",IDC_STATIC,61,16,48,8
- EDITTEXT IDC_SIM_MESSAGE_DELAY,60,25,40,14,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_SIM_MESSAGE_DELAY,60,25,40,14,ES_AUTOHSCROLL
LTEXT "[sec]",IDC_STATIC,102,27,17,8
- LTEXT "Event step",IDC_STATIC,61,43,36,8
- EDITTEXT IDC_SIM_EVENT_STEP,60,52,40,14,ES_AUTOHSCROLL | ES_NUMBER
- LTEXT "[sec]",IDC_STATIC,102,54,17,8
DEFPUSHBUTTON "OK",IDOK,136,9,50,14
PUSHBUTTON "Cancel",IDCANCEL,136,28,50,14
END
@@ -116,8 +113,8 @@
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,3,34,0
- PRODUCTVERSION 0,3,34,0
+ FILEVERSION 0,3,35,0
+ PRODUCTVERSION 0,3,35,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
@...
[truncated message content] |
|
From: <ma...@us...> - 2010-03-01 21:46:05
|
Revision: 642
http://scstudio.svn.sourceforge.net/scstudio/?rev=642&view=rev
Author: madzin
Date: 2010-03-01 21:45:55 +0000 (Mon, 01 Mar 2010)
Log Message:
-----------
Parser modification in condition node.
Modified Paths:
--------------
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Context.h
trunk/src/data/Z120/Z120.g
trunk/tests/z120_test/z120_test22.mpr.result
trunk/tests/z120_test/z120_test52.mpr.result
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2010-03-01 20:25:30 UTC (rev 641)
+++ trunk/src/data/Z120/Context.cpp 2010-03-01 21:45:55 UTC (rev 642)
@@ -1039,9 +1039,14 @@
*/
void set_condition_name_fun(struct Context* context, char* name)
{
- context->condition_name = name;
+ context->condition_name += name;
}
+void clear_condition_name_fun(struct Context* context)
+{
+ context->condition_name = "";
+}
+
/*
* Set name of node
*/
Modified: trunk/src/data/Z120/Context.h
===================================================================
--- trunk/src/data/Z120/Context.h 2010-03-01 20:25:30 UTC (rev 641)
+++ trunk/src/data/Z120/Context.h 2010-03-01 21:45:55 UTC (rev 642)
@@ -123,6 +123,8 @@
void set_condition_name_fun(struct Context* context, char* name);
+void clear_condition_name_fun(struct Context* context);
+
void set_node_name_fun(struct Context* context, char* name);
void add_connect_name_fun(struct Context* context, char* name);
Modified: trunk/src/data/Z120/Z120.g
===================================================================
--- trunk/src/data/Z120/Z120.g 2010-03-01 20:25:30 UTC (rev 641)
+++ trunk/src/data/Z120/Z120.g 2010-03-01 21:45:55 UTC (rev 642)
@@ -773,16 +773,23 @@
;
condition_identification:
+ { clear_condition_name_fun(context); }
'condition' condition_text
- { set_condition_name_fun(context, (char*) $condition_text.text->chars); }
;
condition_text:
- condition_name_list
- | 'when' (condition_name_list | '(' expression ')')
- | 'otherwise'
+ condition_name_list { set_condition_name_fun(context, (char*) $condition_name_list.text->chars); }
+
+ | 'when' { set_condition_name_fun(context, "when "); }
+ (condition_name_list { set_condition_name_fun(context, (char*) $condition_name_list.text->chars); }
+ | expr = ( '(' expression ')' ) { set_condition_name_fun(context, (char*) $expr.text->chars); }
+ )
+
+ | 'otherwise' { set_condition_name_fun(context, "otherwise"); }
+
// *** proprietary Z.120 extension
- | 'for' expression '%'
+ | 'for' { set_condition_name_fun(context, "for "); }
+ (a=expression b='%') { set_condition_name_fun(context, (char*) $a.text->chars); set_condition_name_fun(context, (char*) $b.text->chars); }
;
condition_name_list:
Modified: trunk/tests/z120_test/z120_test22.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test22.mpr.result 2010-03-01 20:25:30 UTC (rev 641)
+++ trunk/tests/z120_test/z120_test22.mpr.result 2010-03-01 21:45:55 UTC (rev 642)
@@ -3,7 +3,7 @@
mscdocument z120_test22;
msc setup_attach;
initial connect L0;
-L0: condition disconnected connect L1;
+L0: condition when disconnected connect L1;
L1: connect L2, L3;
L2: reference failure connect L0;
L3: reference connection connect L4;
Modified: trunk/tests/z120_test/z120_test52.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test52.mpr.result 2010-03-01 20:25:30 UTC (rev 641)
+++ trunk/tests/z120_test/z120_test52.mpr.result 2010-03-01 21:45:55 UTC (rev 642)
@@ -3,6 +3,6 @@
mscdocument z120_test52;
msc One;
initial connect L0;
-L0: condition access_a connect L1;
+L0: condition access, a connect L1;
L1: final;
endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-03-01 22:37:27
|
Revision: 643
http://scstudio.svn.sourceforge.net/scstudio/?rev=643&view=rev
Author: gotthardp
Date: 2010-03-01 22:37:17 +0000 (Mon, 01 Mar 2010)
Log Message:
-----------
Print warning when erroneous .mpr is being exported.
New z120_load test on condition nodes.
Modified Paths:
--------------
trunk/src/data/Z120/z120_save.cpp
trunk/src/view/visio/addon/reportview.cpp
trunk/tests/z120_test/CMakeLists.txt
Added Paths:
-----------
trunk/tests/z120_test/z120_test87.mpr
trunk/tests/z120_test/z120_test87.mpr.result
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2010-03-01 21:45:55 UTC (rev 642)
+++ trunk/src/data/Z120/z120_save.cpp 2010-03-01 22:37:17 UTC (rev 643)
@@ -684,6 +684,12 @@
PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get());
if(predecessor_node != NULL)
{
+ if(predecessor_node->get_successors().empty())
+ {
+ print_report(RS_WARNING, stringize()
+ << L"Warning: HMSC node without successors violates the Z.120 standard.");
+ }
+
for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin();
spos != predecessor_node->get_successors().end(); spos++)
{
Modified: trunk/src/view/visio/addon/reportview.cpp
===================================================================
--- trunk/src/view/visio/addon/reportview.cpp 2010-03-01 21:45:55 UTC (rev 642)
+++ trunk/src/view/visio/addon/reportview.cpp 2010-03-01 22:37:17 UTC (rev 643)
@@ -231,7 +231,7 @@
int CReportView::print(TReportSeverity severity, const std::wstring& message)
{
- Print(ReportMessage() << message);
+ Print(ReportMessage() << ReportMessage::Highlight(severity) << message);
return 0;
}
Modified: trunk/tests/z120_test/CMakeLists.txt
===================================================================
--- trunk/tests/z120_test/CMakeLists.txt 2010-03-01 21:45:55 UTC (rev 642)
+++ trunk/tests/z120_test/CMakeLists.txt 2010-03-01 22:37:17 UTC (rev 643)
@@ -94,6 +94,7 @@
ADD_Z120_TEST(z120_test84.mpr 1)
ADD_Z120_TEST(z120_test85.mpr 1)
ADD_Z120_TEST(z120_test86.mpr 1)
+ADD_Z120_TEST(z120_test87.mpr 1)
ADD_Z120_TEST(z120_time01.mpr 1)
ADD_Z120_TEST(z120_time02.mpr 1)
Added: trunk/tests/z120_test/z120_test87.mpr
===================================================================
--- trunk/tests/z120_test/z120_test87.mpr (rev 0)
+++ trunk/tests/z120_test/z120_test87.mpr 2010-03-01 22:37:17 UTC (rev 643)
@@ -0,0 +1,15 @@
+/*
+ * Example of HMSC with condition nodes of various types.
+ */
+
+mscdocument z120_test87;
+msc Stranka_1;
+initial connect L0, L1, L2, L3;
+L0: condition for 27.7% connect L6;
+L1: condition when state2a connect L4;
+L2: condition state1a connect L5;
+L3: condition otherwise connect L6;
+L4: condition when state2b, state2c connect L6;
+L5: condition state1b, state1c connect L6;
+L6: final;
+endmsc;
Property changes on: trunk/tests/z120_test/z120_test87.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/tests/z120_test/z120_test87.mpr.result
===================================================================
--- trunk/tests/z120_test/z120_test87.mpr.result (rev 0)
+++ trunk/tests/z120_test/z120_test87.mpr.result 2010-03-01 22:37:17 UTC (rev 643)
@@ -0,0 +1,13 @@
+OK: z120_test87 is correct, should be correct
+
+mscdocument z120_test87;
+msc Stranka_1;
+initial connect L0, L1, L2, L3;
+L0: condition for 27.7% connect L4;
+L1: condition when state2a connect L5;
+L2: condition state1a connect L6;
+L3: condition otherwise connect L4;
+L4: final;
+L5: condition when state2b, state2c connect L4;
+L6: condition state1b, state1c connect L4;
+endmsc;
Property changes on: trunk/tests/z120_test/z120_test87.mpr.result
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-03-02 12:43:40
|
Revision: 647
http://scstudio.svn.sourceforge.net/scstudio/?rev=647&view=rev
Author: madzin
Date: 2010-03-02 12:43:32 +0000 (Tue, 02 Mar 2010)
Log Message:
-----------
Fixs membership bugs with empty instances, adds new tests
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_alg.h
trunk/tests/membership/CMakeLists.txt
Added Paths:
-----------
trunk/tests/membership/test_bmsc24_1.mpr
trunk/tests/membership/test_bmsc24_2.mpr
trunk/tests/membership/test_bmsc25_1.mpr
trunk/tests/membership/test_bmsc25_2.mpr
trunk/tests/membership/test_bmsc26_1.mpr
trunk/tests/membership/test_bmsc26_2.mpr
trunk/tests/membership/test_bmsc27.mpr
trunk/tests/membership/test_bmsc27_1.mpr
trunk/tests/membership/test_hmsc24.mpr
trunk/tests/membership/test_hmsc25.mpr
trunk/tests/membership/test_hmsc26.mpr
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-03-02 10:50:56 UTC (rev 646)
+++ trunk/src/membership/membership_alg.cpp 2010-03-02 12:43:32 UTC (rev 647)
@@ -57,6 +57,14 @@
void set_identification(Event* node_e, Event* b_e);
+bool is_node_null(ReferenceNodePtr node);
+
+bool is_instance_null(InstancePtr instance);
+
+bool is_cor_area_null(CoregionAreaPtr cor);
+
+bool is_strict_area_null(StrictOrderAreaPtr strict);
+
/*
* Returns precondition list of the membership algorithm
*/
@@ -161,16 +169,14 @@
return true;
}
- std::cout << "false 01" << std::endl;
return false;
}
else
{
-
//TODO add this check to while cycle
//when deosn't exist empty path to EndNode
- if (b->is_null())
+ if (b->is_null() && !is_node_null(node))
return false;
//checks if this node with this configuration was checked
@@ -717,7 +723,12 @@
b_events = old_position->get_events();
if (!b_events.size() == 1)
- return false;
+ {
+ if(!is_instance_null(node_instance))
+ return false;
+ else
+ return true;
+ }
if (node_instance != NULL)
node_area = node_instance->get_first();
@@ -947,4 +958,77 @@
}
}
-}
\ No newline at end of file
+}
+
+bool is_node_null(ReferenceNodePtr node)
+{
+ MscPtr msc = node->get_msc();
+
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc> (msc);
+
+ if(bmsc == NULL)
+ {
+ std::cerr << "Internal Error: typecast failed" << std::endl;
+ return false;
+ }
+
+ InstancePtrList instances = bmsc->get_instances();
+ InstancePtrList::iterator it;
+
+ for(it = instances.begin(); it != instances.end(); it++)
+ {
+ if(!is_instance_null(*it))
+ return false;
+ }
+
+ return true;
+}
+
+bool is_instance_null(InstancePtr instance)
+{
+ EventAreaPtr area;
+ StrictOrderAreaPtr strict;
+ CoregionAreaPtr cor;
+
+ if(instance == NULL)
+ return true;
+
+ area = instance->get_first();
+
+ while(area != NULL)
+ {
+ strict = boost::dynamic_pointer_cast<StrictOrderArea>(area);
+
+ if(strict == NULL)
+ {
+ cor = boost::dynamic_pointer_cast<CoregionArea>(area);
+
+ if(cor != NULL)
+ if(!is_cor_area_null(cor))
+ return false;
+ }
+ else
+ if(!is_strict_area_null(strict))
+ return false;
+
+ area = area->get_next();
+ }
+
+ return true;
+}
+
+bool is_cor_area_null(CoregionAreaPtr cor)
+{
+ if(!cor->get_minimal_events().empty())
+ return false;
+
+ return true;
+}
+
+bool is_strict_area_null(StrictOrderAreaPtr strict)
+{
+ if(strict->get_first() != NULL)
+ return false;
+
+ return true;
+}
Modified: trunk/src/membership/membership_alg.h
===================================================================
--- trunk/src/membership/membership_alg.h 2010-03-02 10:50:56 UTC (rev 646)
+++ trunk/src/membership/membership_alg.h 2010-03-02 12:43:32 UTC (rev 647)
@@ -117,7 +117,8 @@
for(it=events.begin(); it!=events.end(); it++)
{
//osefovat to nepaci sa mi to porovnavanie
- if(*it == event) return *it;
+ if(*it == event)
+ return *it;
}
return NULL;
@@ -212,7 +213,6 @@
{
this->m_counter = 0;
-//dobrobit null
this->instance_list = instances;
InstancePtrList::iterator it;
EventAreaPtr area;
@@ -224,22 +224,16 @@
st_area = boost::dynamic_pointer_cast<StrictOrderArea>(area);
if(st_area != NULL)
- {
- PositionPtr pos = new Position((*it)->get_label(), st_area->get_first());
- positions.insert(pos);
-// positions.insert(new Position((*it)->get_label(), st_area->get_first()));
- }
+ positions.insert(new Position((*it)->get_label(), st_area->get_first()));
else
- {
-
- }
+ if((*it)->get_first())
+ std::cerr << "Error: Coregions in pattern bMSC are not supported" << std::endl;
}
}
- Configuration(ConfigurationPtr origin) //std::set<PositionPtr> positions)
+ Configuration(ConfigurationPtr origin)
{
this->m_counter = 0;
-// this->positions = positions;
InstancePtrList origin_inst = origin->get_instances();
this->instance_list.insert(instance_list.begin(), origin_inst.begin(), origin_inst.end());
@@ -252,7 +246,6 @@
{
this->positions.insert(new Position(*it));
}
-// this->positions.insert(origin_positions.begin(), origin_positions.end());
}
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-03-02 10:50:56 UTC (rev 646)
+++ trunk/tests/membership/CMakeLists.txt 2010-03-02 12:43:32 UTC (rev 647)
@@ -138,4 +138,21 @@
ADD_TEST(membership_test-58 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc23.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc23_4.mpr 1)
+#empty MSC
+ADD_TEST(membership_test-59 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc24.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc24_1.mpr 1)
+ADD_TEST(membership_test-60 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc24.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc24_2.mpr 1)
+
+ADD_TEST(membership_test-61 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc25.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc25_1.mpr 1)
+
+ADD_TEST(membership_test-62 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc25.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc25_2.mpr 1)
+
+#not empty
+ADD_TEST(membership_test-63 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc26.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc26_1.mpr 1)
+
+ADD_TEST(membership_test-64 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc26.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc26_2.mpr 1)
+
+#bMSC x bMSC with coregion
+ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc27.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc27_1.mpr 1)
+
+
Added: trunk/tests/membership/test_bmsc24_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc24_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc24_1.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+msc Test;
+A:instance;
+endinstance;
+
+B:instance;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc24_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc24_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc24_2.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+msc Test;
+endmsc;
Added: trunk/tests/membership/test_bmsc25_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc25_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc25_1.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+msc Test;
+A:instance;
+endinstance;
+
+B:instance;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc25_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc25_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc25_2.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+msc Test;
+endmsc;
Added: trunk/tests/membership/test_bmsc26_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc26_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc26_1.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,15 @@
+mscdocument Drawing5;
+msc Page_1;
+inst Server;
+inst Client;
+Server: instance;
+in Http_request,0 from Client;
+out object,1 to Client;
+in result,2 from Client;
+endinstance;
+Client: instance;
+out Http_request,0 to Server;
+in object,1 from Server;
+out result,2 to Server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc26_2.mpr
===================================================================
--- trunk/tests/membership/test_bmsc26_2.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc26_2.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,19 @@
+mscdocument Drawing5;
+msc Page_1;
+inst Server;
+inst Client;
+Server: instance;
+in Http_request,0 from Client;
+out object,1 to Client;
+in result,2 from Client;
+out Fin_ack,0 to Client;
+in ack,1 from Client;
+endinstance;
+Client: instance;
+out Http_request,0 to Server;
+in object,1 from Server;
+out result,2 to Server;
+in Fin_ack,0 from Server;
+out ack,1 to Server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc27.mpr
===================================================================
--- trunk/tests/membership/test_bmsc27.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc27.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,17 @@
+mscdocument Drawing1;
+msc NAME;
+inst Server;
+inst Client;
+Server: instance;
+in Http_request,0 from Client;
+concurrent;
+out object,1 to Client;
+in result,2 from Client;
+endconcurrent;
+endinstance;
+Client: instance;
+out Http_request,0 to Server;
+in object,1 from Server;
+out result,2 to Server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_bmsc27_1.mpr
===================================================================
--- trunk/tests/membership/test_bmsc27_1.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc27_1.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,15 @@
+mscdocument Drawing3;
+msc Page_1;
+inst Server;
+inst Client;
+Server: instance;
+in Http_request,0 from Client;
+out object,1 to Client;
+in result,2 from Client;
+endinstance;
+Client: instance;
+out Http_request,0 to Server;
+in object,1 from Server;
+out result,2 to Server;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_hmsc24.mpr
===================================================================
--- trunk/tests/membership/test_hmsc24.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc24.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,13 @@
+msc Page_1;
+initial connect L0;
+L0: reference Test connect L1;
+L1: final;
+endmsc;
+
+msc Test;
+A:instance;
+endinstance;
+
+B:instance;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_hmsc25.mpr
===================================================================
--- trunk/tests/membership/test_hmsc25.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc25.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,15 @@
+msc Page_1;
+initial connect L0;
+L0: reference Test connect L1;
+L1: final;
+endmsc;
+
+msc Test;
+A:instance;
+endinstance;
+
+B:instance;
+concurrent;
+endconcurrent;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_hmsc26.mpr
===================================================================
--- trunk/tests/membership/test_hmsc26.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc26.mpr 2010-03-02 12:43:32 UTC (rev 647)
@@ -0,0 +1,44 @@
+mscdocument Drawing1;
+msc nothing;
+inst Server;
+inst Client;
+Server: instance;
+endinstance;
+Client: instance;
+endinstance;
+endmsc;
+msc Page_1;
+initial connect L0;
+L0: reference NAME connect L1, L2;
+L1: reference sufix connect L3;
+L2: reference nothing connect L3;
+L3: final;
+endmsc;
+msc NAME;
+inst Server;
+inst Client;
+Server: instance;
+in Http_request,0 from Client;
+concurrent;
+out object,1 to Client;
+in result,2 from Client;
+endconcurrent;
+endinstance;
+Client: instance;
+out Http_request,0 to Server;
+in object,1 from Server;
+out result,2 to Server;
+endinstance;
+endmsc;
+msc sufix;
+inst Server;
+inst Client;
+Server: instance;
+out Fin_ack,0 to Client;
+in ack,1 from Client;
+endinstance;
+Client: instance;
+in Fin_ack,0 from Server;
+out ack,1 to Server;
+endinstance;
+endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2010-03-02 18:30:48
|
Revision: 648
http://scstudio.svn.sourceforge.net/scstudio/?rev=648&view=rev
Author: madzin
Date: 2010-03-02 18:30:40 +0000 (Tue, 02 Mar 2010)
Log Message:
-----------
Adds membership fix and Lubos' tests
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/tests/membership/CMakeLists.txt
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-03-02 12:43:32 UTC (rev 647)
+++ trunk/src/membership/membership_alg.cpp 2010-03-02 18:30:40 UTC (rev 648)
@@ -165,8 +165,11 @@
for (it = successors.begin(); it != successors.end(); it++)
{
HMscNode* succ = dynamic_cast<HMscNode*> ((*it)->get_successor());
+ ConfigurationPtr old = new Configuration(b);
if (check_branch(succ, b))
return true;
+ else
+ b = old;
}
return false;
@@ -779,6 +782,7 @@
bool result;
+
while (node_area != NULL && b_area != NULL)
{
switch ((node_strict != NULL) + (b_strict != NULL))
@@ -849,7 +853,6 @@
}
else
return false;
-
}
if ((node_area != NULL) && (b_area == NULL))
@@ -875,9 +878,12 @@
* Receive_ordering mode: bMSCs are traversed second time, old_conf defines points
* from where it starts traverse,
*/
-bool check_node(ReferenceNodePtr node, enum check_type type, ConfigurationPtr old_conf)
+bool check_node(ReferenceNodePtr node, enum check_type type, ConfigurationPtr conf)
{
//get msc from the node
+
+ ConfigurationPtr old_conf = new Configuration(conf);
+
MscPtr msc = node->get_msc();
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
@@ -885,29 +891,27 @@
return false;
InstancePtrList node_instances = bmsc->get_instances();
- InstancePtrList old_instances = old_conf->get_instances();
+ InstancePtrList b_instances = conf->get_instances();
- InstancePtrList::iterator node_instence_it, old_instance_it;
+ InstancePtrList::iterator node_instence_it;
- std::set<PositionPtr> old_positions = old_conf->get_positions();
- std::set<PositionPtr>::iterator old_position_it;
+ std::set<PositionPtr> positions = conf->get_positions();
+ std::set<PositionPtr>::iterator position_it;
- if (node_instances.size() > old_instances.size())
+ if (node_instances.size() > b_instances.size())
{
- if (!is_empty_instance(node_instances, old_instances))
+ if (!is_empty_instance(node_instances, b_instances))
return false;
}
InstancePtr node_instance = NULL;
- std::vector<Event*> node_events, old_events;
- EventAreaPtr node_area, old_area;
std::wstring name;
//checks each instances from the position to the end of bMSC or the end of the HMSC node
- for (old_position_it = old_positions.begin(); old_position_it != old_positions.end();
- old_position_it++)
+ for (position_it = positions.begin(); position_it != positions.end();
+ position_it++)
{
- name = (*old_position_it)->get_name();
+ name = (*position_it)->get_name();
node_instance = NULL;
@@ -924,7 +928,7 @@
if (node_instance == NULL)
continue; //remember position and continue in cycle
- if (!check_instance(node_instance, type, *old_position_it))
+ if (!check_instance(node_instance, type, *position_it))
{
add_checked_branch(node, old_conf);
return false;
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-03-02 12:43:32 UTC (rev 647)
+++ trunk/tests/membership/CMakeLists.txt 2010-03-02 18:30:40 UTC (rev 648)
@@ -155,4 +155,14 @@
#bMSC x bMSC with coregion
ADD_TEST(membership_test-65 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc27.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc27_1.mpr 1)
+#Lubos' tests
+ADD_TEST(membership_test-66 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cycle_neg_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/cycle_neg_pat.mpr 0)
+ADD_TEST(membership_test-67 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cycle_pos_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/cycle_pos_pat.mpr 1)
+
+ADD_TEST(membership_test-68 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cycleWithEmpty_pos_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/cycleWithEmpty_pos_pat.mpr 1)
+
+ADD_TEST(membership_test-69 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/hard_neg_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/hard_neg_pat.mpr 0)
+
+ADD_TEST(membership_test-70 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/hard_pos_hmsc.mpr ${CMAKE_CURRENT_SOURCE_DIR}/hard_pos_pat.mpr 1)
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2010-03-02 19:43:16
|
Revision: 649
http://scstudio.svn.sourceforge.net/scstudio/?rev=649&view=rev
Author: gotthardp
Date: 2010-03-02 19:43:06 +0000 (Tue, 02 Mar 2010)
Log Message:
-----------
Fixed import of reference node measurements.
Fixed related MonteCarlo test case.
Modified Paths:
--------------
trunk/src/data/Z120/Context.cpp
trunk/tests/montecarlo/test_simple_hmsc.mpr
trunk/tests/montecarlo/test_simple_hmsc.vsd
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2010-03-02 18:30:40 UTC (rev 648)
+++ trunk/src/data/Z120/Context.cpp 2010-03-02 19:43:06 UTC (rev 649)
@@ -1367,7 +1367,7 @@
TimeRelationRefNodePtr relation;
try
{
- relation = new TimeRelationRefNode(MscTimeIntervalSet<double>(context->time));
+ relation = new TimeRelationRefNode(context->time);
}
catch(std::exception &exc)
{
@@ -1416,7 +1416,7 @@
TimeRelationRefNodePtr relation;
try
{
- relation = new TimeRelationRefNode(MscTimeIntervalSet<double>(context->time));
+ relation = new TimeRelationRefNode(context->time);
relation->set_directed(context->origin);
context->origin = false;
}
Modified: trunk/tests/montecarlo/test_simple_hmsc.mpr
===================================================================
--- trunk/tests/montecarlo/test_simple_hmsc.mpr 2010-03-02 18:30:40 UTC (rev 648)
+++ trunk/tests/montecarlo/test_simple_hmsc.mpr 2010-03-02 19:43:06 UTC (rev 649)
@@ -15,28 +15,28 @@
L5: final;
endmsc;
msc one;
-inst NAME;
-inst NAME;
-NAME: instance;
+inst Client;
+inst Server;
+Client: instance;
label e0;
-out NAME,0 to NAME;
+out NAME,0 to Server;
time e1 [1,3);
endinstance;
-NAME: instance;
+Server: instance;
label e1;
-in NAME,0 from NAME;
+in NAME,0 from Client;
endinstance;
endmsc;
msc two;
-inst NAME;
-inst NAME;
-NAME: instance;
+inst Client;
+inst Server;
+Client: instance;
label e0;
-out NAME,0 to NAME;
+out NAME,0 to Server;
time e1 [2,6);
endinstance;
-NAME: instance;
+Server: instance;
label e1;
-in NAME,0 from NAME;
+in NAME,0 from Client;
endinstance;
endmsc;
Modified: trunk/tests/montecarlo/test_simple_hmsc.vsd
===================================================================
(Binary files differ)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|