|
From: <koc...@us...> - 2010-03-11 15:08:07
|
Revision: 686
http://scstudio.svn.sourceforge.net/scstudio/?rev=686&view=rev
Author: kocianon
Date: 2010-03-11 15:08:00 +0000 (Thu, 11 Mar 2010)
Log Message:
-----------
Add part of hmsc tightening.
Modified Paths:
--------------
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/time/tightening.h
trunk/src/check/time/time_pseudocode.h
trunk/tests/interval_set_test.cpp
trunk/tests/tighten_msc_test.cpp
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2010-03-11 08:14:39 UTC (rev 685)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2010-03-11 15:08:00 UTC (rev 686)
@@ -448,6 +448,7 @@
{
CoregionEvent* preceding_new = dynamic_cast<CoregionEvent*>(m_duplicator->get_event_copy(preceding));
preceding_new->add_successor(coreg_new);
+ std::cerr << "creating coreg rel " << preceding_new << " -> " << coreg_new << std::endl;
}
}
}
Modified: trunk/src/check/time/tightening.h
===================================================================
--- trunk/src/check/time/tightening.h 2010-03-11 08:14:39 UTC (rev 685)
+++ trunk/src/check/time/tightening.h 2010-03-11 15:08:00 UTC (rev 686)
@@ -30,6 +30,83 @@
* \brief tightens BMsc
*/
+class AllCombination: public std::vector<std::pair<EventP,EventP> >
+{
+private:
+ std::list<std::vector<std::pair<EventP,EventP> > > lists;
+
+ std::vector<std::vector<std::pair<EventP,EventP> > >* v_lists;
+ std::vector<size_type>* iterators;
+ bool ini;
+
+ void set_value(size_t to)
+ {
+ for(size_t i= 0; i<= to;i++)
+ {
+ at(i)=((*v_lists)[i])[(*iterators)[i]];
+ }
+
+ }
+
+ bool move_next(size_t i)
+ {
+ if(i>=v_lists->size())
+ {
+ return false;
+ }
+
+ (*iterators)[i]++;
+
+ if((*iterators)[i]>=(*v_lists)[i].size())
+ {
+ (*iterators)[i]=0;
+ return move_next(++i);
+ }
+ set_value(i);
+ return true;
+ }
+
+public:
+ AllCombination():v_lists(NULL),iterators(NULL),ini(false)
+ {
+
+ }
+
+ ~AllCombination()
+ {
+ if(ini)
+ {
+ delete v_lists;
+ delete iterators;
+ }
+ }
+
+ void add_list(std::vector<std::pair<EventP,EventP> > floor)
+ {
+ lists.push_back(floor);
+ }
+
+ void init()
+ {
+ if(ini)
+ throw std::runtime_error("Already allocated!");
+ else
+ ini = true;
+
+ v_lists = new std::vector<std::vector<std::pair<EventP,EventP> > >(lists.begin(),lists.end());
+ resize(lists.size());
+ iterators = new std::vector<size_type>(lists.size(),0);
+ set_value(lists.size()-1);
+ }
+
+ bool move_next()
+ {
+ return move_next(0);
+ }
+
+};
+
+
class TightenBMsc
{
@@ -90,8 +167,179 @@
BMscPtr transform(BMscPtr bmsc);
};
+/*
+class SCTIME_EXPORT HMscTighter //:public Transformer // , public BMscTransformer
+{
+public:
+ HMscTighter()
+ {
+ }
+
+ ~HMscTighter()
+ {
+
+ }
+
+ HMscPtr transform(HMscPtr bmsc)
+ {
+
+ return NULL;
+ }
+
+ void tight_path(std::list<MscElement*> path)
+ {
+
+ std::list<EventP> events_to_delete;
+ HMscFlatPathToBMscDuplicator duplicator;
+ BMscPtr bmsc = duplicator.duplicate_path(path);
+
+ BMscIntervalSetMatrix b_matrix(bmsc); // create matrix
+ std::map<BMsc*,int> bmsc_to_count;
+ std::map<TimeRelationRefNodePtrSet*,EventP> rel_to_event;
+ std::set<TimeRelationRefNode*> open_rel;
+
+ Event* a;
+ AllCombination combination;
+ for(std::list<MscElement*>::iterator it=path.begin();it!=path.end();it++)
+ {
+ ReferenceNode* ref = dynamic_cast<ReferenceNode*>(*it);
+ if(ref==NULL)
+ continue;
+ BMscPtr in = ref->get_bmsc();
+ bmsc_to_count[in.get()]++; // @Warning initial integer number = 0?
+ TimeRelationRefNodePtrSet top = ref->get_time_relations_top();
+ TimeRelationRefNodePtrSet bottom = ref->get_time_relations_bottom();
+
+ if(top.size()>0)
+ {
+ a = new StrictEvent();
+ b_matrix.add_event(a);
+ events_to_delete.push_back(a);
+ rel_to_event[&top] = a;
+
+
+ MinimalEventPList min(in);
+ std::vector<std::pair<EventP,EventP> > floor(min.size());
+ for(MinimalEventPList::iterator m=min.begin();m=min.end();m++)
+ {
+ Event* copy = duplicator.get_copy(*m,bmsc_to_count[in]);
+ b_matrix.fill(a,copy,MscTimeIntervalD(0,D::infinity()));
+ floor.push_back(std::make_pair<EventP,EventP>(a,copy));
+ }
+ combination.add_list(floor);
+
+ }
+ // open/close relations
+ for(TimeRelationRefNodePtrSet::iterator it=top.begin();it!=top.end();it++)
+ {
+ if(open_rel.find(it->get())!=top.end())
+ {
+ TimeRelationRefNodePtrSet other;
+ if(ref==(*it)->get_ref_node_a()&&(*it)->is_top_node_a())
+ {
+ if((*it)->is_top_node_b())
+ other = (*it)->get_ref_node_b()->get_time_relations_top();
+ else
+ other = (*it)->get_ref_node_b()->get_time_relations_bottom();
+ }
+ else
+ {
+ if((*it)->is_top_node_a())
+ other = (*it)->get_ref_node_a()->get_time_relations_top();
+ else
+ other = (*it)->get_ref_node_a()->get_time_relations_bottom();
+ }
+
+ b_matrix.tied_rel_to_cell(*it,rel_to_event[other],a);
+
+ }
+ else
+ open_rel.insert(*it);
+ }
+
+ if(bottom.size()>0)
+ {
+ a = new Event();
+ b_matrix.add_event(a);
+ events_to_delete.push_back(a);
+ rel_to_event[&bottom] = a;
+ MaximalEventPList max(in);
+ std::vector<std::pair<EventP,EventP> > floor(max.size());
+ for(MaximalEventPList::iterator m=max.begin();m=max.end();m++)
+ {
+ Event* copy = duplicator.get_copy(*m,bmsc_to_count[in]);
+ b_matrix.fill(copy,a,MscTimeIntervalD(0,D::infinity()));
+ floor.push_back(std::make_pair<EventP,EventP>(copy,a));
+ }
+ combination.add_list(floor);
+ }
+
+ // open/close relations
+ for(TimeRelationRefNodePtrSet::iterator it=bottom.begin();it!=bottom.end();it++)
+ {
+ if(open_rel.find(it->get())!=top.end())
+ {
+ TimeRelationRefNodePtrSet other;
+ if(ref==(*it)->get_ref_node_a()&&(*it)->is_bottom_node_a())
+ {
+ if((*it)->is_top_node_b())
+ other = (*it)->get_ref_node_b()->get_time_relations_top();
+ else
+ other = (*it)->get_ref_node_b()->get_time_relations_bottom();
+ }
+ else
+ {
+ if((*it)->is_top_node_a())
+ other = (*it)->get_ref_node_a()->get_time_relations_top();
+ else
+ other = (*it)->get_ref_node_a()->get_time_relations_bottom();
+ }
+
+ b_matrix.tied_rel_to_cell(*it,rel_to_event[other],a);
+
+ }
+ else
+ open_rel.insert(*it);
+ }
+
+
+ }
+ IntervalSetMatrix result;
+ result.resize(b_matrix.size1());
+ combination.init();
+ do
+ {
+ // push there [0,0] interval
+ for(size_t i=0;i<combination.size();i++)
+ {
+ b_matrix.fill(combination[i].first,combination[i].second,MscTimeIntervalD(0,0));
+ }
+ MscSolveTCSP solve;
+ MscSolveTCSPReport report = solve.solveTCSP(b_matrix);
+ IntervalSetMatrix new_result = report.m_matrix_result;
+
+ for(unsigned i=0;i<new_result.size1();i++)
+ for(unsigned j=0;j<new_result.size1();j++)
+ result(i,j) = MscTimeIntervalSetD::set_union(result(i,j),new_result(i,j));
+
+ //return back previous value
+ for(size_t i=0;i<combination.size();i++)
+ {
+ b_matrix.fill(combination[i].first,combination[i].second,MscTimeIntervalD(0,D::infinity()));
+ }
+
+ } while(combination.move_next());
+
+ std::map<TimeRelation*, std::pair<unsigned,unsigned> > relations = b_matrix.get_tied_time_relations();
+
+ }
+
+};
+
+
+*/
class SCTIME_EXPORT Tighter:public Transformer
{
Modified: trunk/src/check/time/time_pseudocode.h
===================================================================
--- trunk/src/check/time/time_pseudocode.h 2010-03-11 08:14:39 UTC (rev 685)
+++ trunk/src/check/time/time_pseudocode.h 2010-03-11 15:08:00 UTC (rev 686)
@@ -230,7 +230,7 @@
using IntervalSetMatrix::operator();
//! return number of event in matrix
- unsigned get_number(EventP e)
+ const unsigned get_number(EventP e)
{
return m_event_to_number[e];
}
@@ -329,10 +329,21 @@
}
//! ties time relation to the cell
- void tied_rel_to_cell(TimeRelationPtr relation, size_t i, size_t j)
+ void tied_rel_to_cell(TimeRelationPtr relation, const size_t i, const size_t j)
{
m_rel_to_position[relation.get()]=std::make_pair<size_t,size_t>(i,j);
}
+
+ void tied_rel_to_cell(TimeRelationPtr relation, EventP i, EventP j)
+ {
+ tied_rel_to_cell(relation,get_number(i),get_number(j));
+ }
+
+ std::map<TimeRelation*, std::pair<unsigned,unsigned> > get_tied_time_relations()
+ {
+ return m_rel_to_position;
+ }
+
//! add event to the matrix (adding new row and column), returns column/row number in matrix
const size_t add_event(EventP event)
@@ -494,7 +505,7 @@
return e->set_attribute<int>(m_number,number);
}
- int get_number(HMscNodePtr e)
+ const int get_number(HMscNodePtr e)
{
return e->get_attribute<int>(m_number,0);
}
Modified: trunk/tests/interval_set_test.cpp
===================================================================
--- trunk/tests/interval_set_test.cpp 2010-03-11 08:14:39 UTC (rev 685)
+++ trunk/tests/interval_set_test.cpp 2010-03-11 15:08:00 UTC (rev 686)
@@ -120,6 +120,8 @@
MscTimeInterval<double> i3(6,10);
MscTimeInterval<double> i4(1,2);
MscTimeInterval<double> i5(3,4);
+ MscTimeInterval<double> i6("(0,inf)");
+ MscTimeInterval<double> i7("[-1]");
s1.insert(i1);
s2.insert(i2);
s3.insert(i3);
@@ -132,6 +134,6 @@
std::cerr << std::endl;
std::cerr << s3 << std::endl;
std::cerr << s4 << std::endl;
- std::cerr << MscTimeIntervalSet<double>::set_intersection(s3,s4) << std::endl;
+ std::cerr <<"intersection: " << MscTimeIntervalSet<double>::set_intersection(i6,i7) << std::endl;
return 0;
}
Modified: trunk/tests/tighten_msc_test.cpp
===================================================================
--- trunk/tests/tighten_msc_test.cpp 2010-03-11 08:14:39 UTC (rev 685)
+++ trunk/tests/tighten_msc_test.cpp 2010-03-11 15:08:00 UTC (rev 686)
@@ -130,6 +130,7 @@
Z120 z120;
// 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]);
@@ -145,11 +146,22 @@
}
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)
//
//std::cerr << pair.first << std::endl << pair.second << std::endl;
+ // 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");
+ BMscPtr b = boost::dynamic_pointer_cast<BMsc>(mscs[0]);
+ ConsistencyChecker con;
+ ChannelMapperPtr mapper;
+ con.check(b,mapper);
+ BMscPtr n = BMscDuplicator::duplicate(b);
+ z120.save_msc(std::cout,L"original",b);
+ z120.save_msc(std::cout,L"result",n);
+
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|