|
From: <koc...@us...> - 2009-09-10 09:52:23
|
Revision: 299
http://scstudio.svn.sourceforge.net/scstudio/?rev=299&view=rev
Author: kocianon
Date: 2009-09-10 09:52:12 +0000 (Thu, 10 Sep 2009)
Log Message:
-----------
constrain checker
Modified Paths:
--------------
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/time/constrain_check.h
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/constrain_check_test.cpp
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-09-09 20:20:52 UTC (rev 298)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-09-10 09:52:12 UTC (rev 299)
@@ -123,12 +123,12 @@
EventsCreatorListener::EventsCreatorListener(BMscDuplicator* duplicator, DFSAreaTraverser* traverser, BMsc* bmsc):
m_duplicator(duplicator),
- m_traverser(traverser),
- m_bmsc(bmsc),
m_last_instance(NULL),
+ m_last_new_instance(NULL),
m_last_area(NULL),
- m_last_new_instance(NULL),
- m_last_new_area(NULL)
+ m_last_new_area(NULL),
+ m_bmsc(bmsc),
+ m_traverser(traverser)
{
}
@@ -369,14 +369,14 @@
void GraphCreatorListener::on_white_node_found(ConditionNode* n)
{
- PredecessorNode* predecessor = get_predecessor();
+// PredecessorNode* predecessor = get_predecessor();
HMscNodePtr new_node = new ConditionNode(n);
process_new_node(n,new_node);
}
void GraphCreatorListener::on_white_node_found(ConnectionNode* n)
{
- PredecessorNode* predecessor = get_predecessor();
+// PredecessorNode* predecessor = get_predecessor();
HMscNodePtr new_node = new ConnectionNode(n);
process_new_node(n,new_node);
}
@@ -553,6 +553,8 @@
{
}
+//////////////////////////////////////////////////////////////////
+
HMscPtr HMscPathDuplicator::duplicate_path(const MscElementPListList& path)
{
HMscPtr root;
@@ -603,7 +605,7 @@
NodeRelationPtr new_rel;
- if(ref_node = dynamic_cast<ReferenceNode*>(*e))
+ if((ref_node = dynamic_cast<ReferenceNode*>(*e)))
{
ReferenceNode* new_ref = new ReferenceNode(ref_node);
new_ref->set_msc(ref_node->get_msc());
@@ -611,8 +613,10 @@
new_rel = new_ref->add_predecessor(new_pred);
new_pred = new_ref;
set_copy(ref_node,new_ref);
+ // copy time relations
+ process_time_relations(ref_node);
}
- else if(cond_node = dynamic_cast<ConditionNode*>(*e))
+ else if((cond_node = dynamic_cast<ConditionNode*>(*e)))
{
ConditionNode* new_cond = new ConditionNode(cond_node);
new_hmsc->add_node(new_cond);
@@ -620,7 +624,7 @@
new_pred = new_cond;
set_copy(cond_node,new_cond);
}
- else if(conn_node = dynamic_cast<ConnectionNode*>(*e))
+ else if((conn_node = dynamic_cast<ConnectionNode*>(*e)))
{
ConnectionNode* new_conn = new ConnectionNode(conn_node);
new_hmsc->add_node(new_conn);
@@ -628,7 +632,7 @@
new_pred = new_conn;
set_copy(conn_node,new_conn);
}
- else if(end_node = dynamic_cast<EndNode*>(*e))
+ else if((end_node = dynamic_cast<EndNode*>(*e)))
{
EndNode* new_end = new EndNode(end_node);
new_rel = new_end->add_predecessor(new_pred);
@@ -649,6 +653,59 @@
return root;
}
+
+void HMscPathDuplicator::process_time_relations(
+ ReferenceNode* ref_node
+ ,TimeRelationRefNodePtrSet time_relations
+ ,bool bottom
+ )
+{
+ TimeRelationRefNodePtrSet::iterator it;
+
+ //processing top
+ for(it=time_relations.begin();it!=time_relations.end();it++)
+ {
+ TimeRelationRefNodePtr relation = *it;
+ TimeRelationRefNodePtr relation_copy;
+
+ relation_copy = (TimeRelationRefNode*) get_copy(relation.get());
+
+ ReferenceNode* new_ref = (ReferenceNode*) get_copy(ref_node);
+
+// relation_copy= dynamic_cast<TimeRelationRefNode>(get_copy((*it).get());
+ // copy doesnt exist -> create
+ if(!relation_copy.get())
+ {
+ relation_copy = TimeRelationRefNode::create((*it).get());
+ set_copy(relation.get(),relation_copy.get());
+ }
+ //connecting: ref_node -> relation
+ if(bottom)
+ new_ref->add_time_relation_bottom(relation_copy);
+ else
+ new_ref->add_time_relation_top(relation_copy);
+
+ // connecting: relation -> ref_node
+ ReferenceNode* a = (*it)->get_ref_node_a();
+ if(ref_node==a)
+ relation_copy->set_ref_node_a(new_ref);
+ else
+ relation_copy->set_ref_node_b(new_ref);
+ }
+}
+
+void HMscPathDuplicator::process_time_relations(ReferenceNode* ref_node)
+{
+
+ TimeRelationRefNodePtrSet time_relations;
+ time_relations = ref_node->get_time_relation_top();
+ process_time_relations(ref_node,time_relations,false);
+
+ time_relations = ref_node->get_time_relation_bottom();
+ process_time_relations(ref_node,time_relations,true);
+
+}
+
HMscPathDuplicator::~HMscPathDuplicator()
{
}
@@ -701,7 +758,7 @@
NodeRelationPtr new_rel;
- if(ref_node = dynamic_cast<ReferenceNode*>(*e))
+ if((ref_node = dynamic_cast<ReferenceNode*>(*e)))
{
ReferenceNode* new_ref;
if(new_elem)
@@ -717,7 +774,7 @@
new_pred = new_ref;
set_copy(ref_node,new_ref,persist_original);
}
- else if(cond_node = dynamic_cast<ConditionNode*>(*e))
+ else if((cond_node = dynamic_cast<ConditionNode*>(*e)))
{
ConditionNode* new_cond;
if(new_elem)
@@ -733,7 +790,7 @@
new_pred = new_cond;
set_copy(cond_node,new_cond,persist_original);
}
- else if(conn_node = dynamic_cast<ConnectionNode*>(*e))
+ else if((conn_node = dynamic_cast<ConnectionNode*>(*e)))
{
ConnectionNode* new_conn;
if(new_elem)
@@ -748,7 +805,7 @@
new_pred = new_conn;
set_copy(conn_node,new_conn,persist_original);
}
- else if(end_node = dynamic_cast<EndNode*>(*e))
+ else if((end_node = dynamic_cast<EndNode*>(*e)))
{
EndNode* new_end = new EndNode(end_node);
new_rel = new_end->add_predecessor(new_pred);
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-09-09 20:20:52 UTC (rev 298)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-09-10 09:52:12 UTC (rev 299)
@@ -249,6 +249,9 @@
*/
class SCPSEUDOCODE_EXPORT HMscPathDuplicator:public Duplicator
{
+private:
+ void process_time_relations(ReferenceNode* ref_node);
+ void process_time_relations(ReferenceNode*,TimeRelationRefNodePtrSet,bool);
public:
~HMscPathDuplicator();
Modified: trunk/src/check/time/constrain_check.h
===================================================================
--- trunk/src/check/time/constrain_check.h 2009-09-09 20:20:52 UTC (rev 298)
+++ trunk/src/check/time/constrain_check.h 2009-09-10 09:52:12 UTC (rev 299)
@@ -168,7 +168,17 @@
void mark_time_relation(TimeRelationRefNode* relation)
{
- m_duplicator.get_copy(relation)->set_marked(true);
+ TimeRelationRefNode* copy;
+ copy = (TimeRelationRefNode*)m_duplicator.get_copy(relation);
+// if(!copy)
+// {
+// std::cerr << "marking: error" << std::endl;
+// }
+// else
+// {
+// std::cerr << "marking: ok" << std::endl;
+ copy->set_marked(true);
+// }
}
/**
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-09-09 20:20:52 UTC (rev 298)
+++ trunk/src/data/msc.h 2009-09-10 09:52:12 UTC (rev 299)
@@ -2337,8 +2337,15 @@
public:
- TimeRelationRefNode(ReferenceNode* a,ReferenceNode* b,MscTimeIntervalSet<double> set,TimeRelationRefNode* original=NULL):
- TimeRelation(set,original),m_node_origin(a),m_node(b)
+ TimeRelationRefNode(
+ ReferenceNode* a
+ ,ReferenceNode* b
+ ,MscTimeIntervalSet<double> set
+ ,TimeRelationRefNode* original=NULL
+ )
+ :TimeRelation(set,original)
+ ,m_node_origin(a)
+ ,m_node(b)
{
}
@@ -2353,11 +2360,27 @@
return m_node;
}
+ void set_ref_node_a(ReferenceNode* a)
+ {
+ m_node_origin = a;
+ }
+
+ void set_ref_node_b(ReferenceNode* b)
+ {
+ m_node = b;
+ }
+
~TimeRelationRefNode()
{
}
- static TimeRelationRefNodePtr create(bool bottom_a,ReferenceNode* a,
- ReferenceNode* b,bool bottom_b,MscTimeIntervalSetD set)
+
+ static TimeRelationRefNodePtr create(
+ bool bottom_a
+ ,ReferenceNode* a
+ ,ReferenceNode* b
+ ,bool bottom_b
+ ,MscTimeIntervalSetD set
+ )
{
TimeRelationRefNodePtr new_relation = new TimeRelationRefNode(a,b,set);
if(bottom_a)
@@ -2372,7 +2395,15 @@
return new_relation;
}
+
+ static TimeRelationRefNodePtr create(TimeRelationRefNode* relation)
+ {
+ TimeRelationRefNodePtr new_relation;
+ new_relation = new TimeRelationRefNode(NULL,NULL,relation->get_interval_set(),relation);
+ return new_relation;
+ }
+
};
#endif
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-09-09 20:20:52 UTC (rev 298)
+++ trunk/tests/CMakeLists.txt 2009-09-10 09:52:12 UTC (rev 299)
@@ -179,16 +179,16 @@
scpseudocode
)
-#ADD_EXECUTABLE(constrain_check_test
-# constrain_check_test.cpp
-#)
-#
-#TARGET_LINK_LIBRARIES(constrain_check_test
-# scmsc
-# sctime
-# scpseudocode
-#)
+ADD_EXECUTABLE(constrain_check_test
+ constrain_check_test.cpp
+)
+TARGET_LINK_LIBRARIES(constrain_check_test
+ scmsc
+ sctime
+ scpseudocode
+)
+
#
#ADD_EXECUTABLE(max_tightener_test
# max_tightener_test.cpp
Added: trunk/tests/constrain_check_test.cpp
===================================================================
--- trunk/tests/constrain_check_test.cpp (rev 0)
+++ trunk/tests/constrain_check_test.cpp 2009-09-10 09:52:12 UTC (rev 299)
@@ -0,0 +1,74 @@
+#include "check/time/constrain_check.h"
+
+int main()
+{
+ BMscPtr bmsc(new BMsc(L"BMsc"));
+ InstancePtr instance1(new Instance(L"1"));
+ InstancePtr instance2(new Instance(L"2"));
+
+ bmsc->add_instance(instance1);
+ bmsc->add_instance(instance2);
+
+ StrictOrderAreaPtr strict1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2(new StrictOrderArea());
+
+ instance1->add_area(strict1);
+ instance2->add_area(strict2);
+
+ EventPtr e1 = strict1->add_event();
+ EventPtr e2 = strict2->add_event();
+
+ CompleteMessagePtr m1 = new CompleteMessage(L"hi");
+ m1->glue_events(e1, e2);
+
+ HMscPtr hmsc1(new HMsc(L"HMsc1"));
+
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+
+ ReferenceNodePtr r1_1(new ReferenceNode());
+ ReferenceNodePtr r1_2(new ReferenceNode());
+ ReferenceNodePtr r1_3(new ReferenceNode());
+
+ EndNodePtr end1(new EndNode());
+
+ hmsc1->add_node(r1_1);
+ hmsc1->add_node(r1_2);
+ hmsc1->add_node(r1_3);
+ hmsc1->add_node(end1);
+
+ start1->add_successor(r1_1.get());
+ r1_1->add_successor(r1_2.get());
+// r1_1->add_successor(r1_2.get());
+// r1_2->add_successor(r1_2.get());
+// r1_2->add_successor(end1.get());
+ r1_2->add_successor(r1_3.get());
+// r1_3->add_successor(r1_2.get());
+ r1_3->add_successor(end1.get());
+
+ r1_1->set_msc(bmsc);
+ r1_2->set_msc(bmsc);
+ r1_3->set_msc(bmsc);
+
+ MscTimeIntervalSetD inter;
+ TimeRelationRefNodePtr node_relation_1 = TimeRelationRefNode::create(true,r1_1.get(),r1_2.get(),false,inter);
+ TimeRelationRefNodePtr node_relation_2 = TimeRelationRefNode::create(true,r1_2.get(),r1_3.get(),false,inter);
+ TimeRelationRefNodePtr node_relation_3 = TimeRelationRefNode::create(true,r1_1.get(),r1_3.get(),false,inter);
+
+ HMscTimeConstrainChecker constrain_checker;
+ ChannelMapperPtr chm;
+ HMscPtr result = constrain_checker.check(hmsc1,chm);
+ int ret;
+ if(result.get())
+ {
+ std::cerr << "Chyba v omezenich" << std::endl;
+ ret=1;
+ }
+ else
+ {
+ std::cerr << "OK sdfs" << std::endl;
+ ret = 0;
+ }
+ return ret;
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|