21 #ifndef B3_DESCRIPTION_H
22 #define B3_DESCRIPTION_H
35 #include <l/l_sys_io.h>
45 #include <boost/foreach.hpp>
46 #include <boost/bind.hpp>
47 #include <boost/variant.hpp>
48 #include <boost/ref.hpp>
49 #include <boost/tuple/tuple.hpp>
65 typedef std::multimap<const Intentional_activity*, Activity_sequence>
71 root_(
"FFA", start, end,
Vector(), trajs)
74 "Cannot create description; empty trajectory set");
76 "Cannot create description; trajectories indexed incorrectly");
84 "Cannot create description; empty trajectory set");
86 "Cannot create description; trajectories indexed incorrectly");
92 copy(desc, root_, desc.root_);
102 copy(desc, root_, desc.root_);
126 return &(tree_.insert(std::make_pair(act, aseq))->second);
133 size_t end()
const {
return root_.
end(); }
139 std::pair<Act_tree::const_iterator, Act_tree::const_iterator>
children
144 return tree_.equal_range(&act);
156 template<
class A,
class OutIt>
157 void ancestors(
const A& act, OutIt result,
int max_depth = -1)
const;
165 return &act == &root_;
173 bool contains(
const A& act_p)
const;
192 std::ostream&
operator<<(std::ostream& ost,
const Description& desc);
199 BOOST_FOREACH(
const Act_tree::value_type& pr, tree_)
202 for(
size_t j = 0; j < aseq.
size(); ++j)
208 if(name ==
"" || name == pa_p->
name())
223 BOOST_FOREACH(
const Act_tree::value_type& pr, tree_)
225 if(name ==
"" || name == pr.first->name())
234 template<
class A,
class OutIt>
237 using namespace boost;
242 if(
is_root(act) || max_depth == 0) {
return; }
244 const Ia* parent_p = 0;
245 BOOST_FOREACH(
const Act_tree::value_type& pr, tree_)
248 Asit act_p = std::find_if(
251 bind(same_activity<A>, _1, cref(act)));
253 if(act_p != aseq.
end())
262 *result++ = parent_p;
263 if(max_depth > 0) --max_depth;
272 using namespace boost;
275 BOOST_FOREACH(
const Act_tree::value_type& pr, tree_)
278 size_t c = std::count_if(
281 bind(same_activity<A>, _1, cref(act)));
283 if(c != 0)
return true;
339 typedef std::multiset<Activity_info>::const_iterator Iter;
342 Iter ai_p = std::find_if(
345 boost::bind(&Description_info::is_root,
this, _1));
347 "Cannot read description; root group must have ID = 0");
378 template<
class AseqIt,
class VecIt>
379 void get_child_sequences
387 bool is_root(
const Activity_info& ai)
const {
return ai.id == 0; }
389 bool same_traj_set(
const Traj_set& ts1,
const Traj_set& ts2)
const
391 return std::equal(ts1.begin(), ts1.end(), ts2.begin());
401 template<
class AseqIt,
class VecIt>
402 void Description_info::get_child_sequences
410 typedef std::map<size_t, const Activity_info*> Time_info_map;
411 std::vector<Time_info_map> ti_maps;
412 std::vector<Traj_set> traj_sets;
414 BOOST_FOREACH(
const Activity_info& ai, info_set)
416 if(ai.id !=
id && ai.parent ==
id)
418 std::vector<Traj_set>::iterator set_p;
419 set_p = std::find_if(
423 &Description_info::same_traj_set,
425 boost::cref(ai.trajs),
429 if(set_p == traj_sets.end())
431 traj_sets.push_back(ai.trajs);
432 ti_maps.push_back(Time_info_map());
433 seq_idx = traj_sets.size() - 1;
437 seq_idx = std::distance(traj_sets.begin(), set_p);
440 ti_maps[seq_idx][ai.start] = &ai;
444 for(
size_t j = 0; j < ti_maps.size(); ++j)
446 std::vector<size_t> ids;
447 Activity_sequence aseq(
"ROLER");
448 BOOST_FOREACH(
const Time_info_map::value_type& pr, ti_maps[j])
452 size_t s = pr.second->start;
453 size_t e = pr.second->end;
455 std::vector<Vector> zeros(2,
Vector((
int)(e - s + 1), 0.0));
456 trajectory.set_dimensions(s, zeros.begin(), zeros.end());
457 aseq.
add(Physical_activity(
464 aseq.
add(Intentional_activity(
476 ids.push_back(pr.second->id);
497 const std::string& path,
506 const size_t nframes = desc.
end() + 1;
510 "Cannot write description: contains no trajectories");
513 IFT(std::distance(first, last) == ntrajs, Illegal_argument,
514 "Cannot write description: bad trajectory indices.");
515 IFT(kjb_c::is_directory(path.c_str()), Illegal_argument,
516 "Cannot write description: invalid path.");
523 dinfo.
fill(desc, lib);
527 vector<size_t> parents(dinfo.info_set.size());
528 vector<size_t> roles(dinfo.info_set.size());
530 string cur_name = dinfo.info_set.begin()->name;
531 multiset<Act_info>::const_iterator ai_p = dinfo.info_set.begin();
532 while(ai_p != dinfo.info_set.end())
535 while(ai_p != dinfo.info_set.end() && ai_p->name == cur_name)
538 BOOST_FOREACH(
size_t j, ai_p->trajs)
540 for(
size_t t = ai_p->start; t <= ai_p->
end; ++t)
542 cur_mat(t, j) = ai_p->id;
546 parents[ai_p->id] = ai_p->parent;
547 roles[ai_p->id] = ai_p->role;
552 ofstream ofs((path +
"/" + cur_name +
".txt").c_str());
553 IFT(ofs,
IO_error,
"Cannot write description: error creating file.");
558 copy(first, --notlast, ostream_iterator<size_t>(ofs,
","));
559 ofs << *notlast << endl;
562 for(
size_t t = 0; t < nframes; ++t)
566 copy(r.
begin(), r.
end() - 1, ostream_iterator<int>(ofs,
","));
567 ofs << *r.
rbegin() << endl;
572 if(ai_p != dinfo.info_set.end()) cur_name = ai_p->name;
575 ofstream ofs((path +
"/parents.txt").c_str());
576 IFT(ofs,
IO_error,
"Cannot write description: error creating file.");
577 copy(parents.begin(), parents.end()-1, ostream_iterator<size_t>(ofs,
","));
578 ofs << *parents.rbegin() << endl;
580 copy(roles.begin(), roles.end()-1, ostream_iterator<size_t>(ofs,
","));
581 ofs << *roles.rbegin() << endl;
600 "Cannot find group; bad row or col.");
603 ai.
id = act_mat(tr, jc);
607 while(r != 0 && act_mat(r, jc) == ai.
id) --
r;
611 while(r != act_mat.
get_num_rows() && act_mat(r, jc) == ai.
id) ++r;
617 if(act_mat(sr,
i) == ai.
id)
620 InIt sz_p = std::find(first, last, act_mat(0,
i));
625 for(
size_t k = sr;
k <= er; ++
k)
632 ai.
start = act_mat(sr, 0);
633 ai.
end = act_mat(er, 0);
651 const std::string& path,
662 "Cannot read description: invalid path.");
668 IFT(kjb_c::is_file((path +
"/parents.txt").c_str()),
IO_error,
669 "Cannot read description; cannot read parents file.");
674 for(
size_t i = 0;
i < nacts; ++
i)
680 std::string act_fpg = path +
"/" + name +
"*.txt";
682 if(wl.size() == 0)
continue;
684 for(
size_t f = 0; f < wl.size(); ++f)
688 std::string act_fp = wl[f];
694 if(cur_act(t, j) != -1)
696 Ainfo ai =
find_group(cur_act, t, j, first, last);
698 ai.parent = parents[ai.id];
Definition: bbb_intentional_activity.h:39
bool is_physical(const std::string &act) const
Is the given activity physical?.
Definition: bbb_activity_library.h:75
size_t id
Definition: bbb_description.h:295
void fill(const Description &desc, const Activity_library &lib)
Definition: bbb_description.h:317
Definition for the Int_matrix class, a thin wrapper on the KJB Int_matrix struct and its related func...
bool is_root(const Intentional_activity &act) const
Return true if the given activity is the root.
Definition: bbb_description.h:163
size_t role
Definition: bbb_description.h:300
size_t parent
Definition: bbb_description.h:299
Description make_trivial_description(const Data &data)
Create a trivial description from data, where everybody is simply walking independently.
Definition: bbb_description.cpp:184
Description_info::Activity_info find_group(Int_matrix &act_mat, size_t tr, size_t jc, InIt first, InIt last)
Find group in activity matrix. Utility function for read().
Definition: bbb_description.h:588
Definition: bbb_activity_sequence.h:39
This class implements matrices, in the linear-algebra sense, restricted to integer-valued elements...
Definition: l_int_matrix.h:71
size_t index
Definition: bbb_description.h:396
void add(const Intentional_activity &activity)
Add intentional activity.
Definition: bbb_activity_sequence.h:65
Description(size_t start, size_t end, const Traj_set &trajs)
Create a descrpition with the given end times.
Definition: bbb_description.h:70
void extract(Description &desc, const Activity_library &lib) const
Definition: bbb_description.h:337
friend std::ostream & operator<<(std::ostream &, const Description &)
Push an description to an output stream.
bool operator<(const Activity_info &ai) const
Definition: bbb_description.h:303
void intentional_activities(Iter out, const std::string &name="") const
Get all the phsical activities of this description.
Definition: bbb_description.h:220
for k
Definition: APPgetLargeConnectedEdges.m:61
bool is_intentional(const std::string &act) const
Is the given activity intentional?.
Definition: bbb_activity_library.h:69
r
Definition: APPgetLargeConnectedEdges.m:127
Wrapper for the libKJB type Word_list (useful for globs).
Definition: l_word_list.h:60
Definition: bbb_likelihood.h:37
friend Data sample(const Likelihood &likelihood, const Description &desc)
Sample data from likelihood, given a description.
std::multiset< Activity_info > info_set
Definition: bbb_description.h:395
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
const std::string & name() const
Get this PA's name.
Definition: bbb_physical_activity.h:61
std::multimap< const Intentional_activity *, Activity_sequence > Act_tree
Definition: bbb_description.h:66
Wrapped version of Word_list integrated with kjb_glob.
iterator end()
Definition: l_int_vector.h:446
Definition: bbb_description.h:62
Extract sparse information from description (for write()).
Definition: bbb_description.h:290
const std::string & activity_name(size_t a) const
Get the name of the a-th activity.
Definition: bbb_activity_library.h:54
std::ostream & operator<<(std::ostream &ost, const Activity_sequence &aseq)
Push an activity sequence to an output stream.
#define IFT(a, ex, msg)
Definition: l_exception.h:101
std::string name
Definition: bbb_description.h:296
boost::variant< Physical_activity, Intentional_activity > Activity
Definition: bbb_activity_sequence.h:42
size_t end() const
Gets the end frame of this IA.
Definition: bbb_intentional_activity.h:68
Vec_type get_row(int row) const
Return a specified row of this matrix, in the form of an Int_vector.
Definition: l_int_matrix.cpp:168
const Intentional_activity & root_activity() const
Get the root activity of this description.
Definition: bbb_description.h:136
const Activity & activity(size_t j) const
Get the jth actiity.
Definition: bbb_activity_sequence.h:59
const_iterator end() const
Iterator to one-past-the-last activity.
Definition: bbb_activity_sequence.h:56
void ancestors(const A &act, OutIt result, int max_depth=-1) const
Get the ancestors of the given activity.
Definition: bbb_description.h:235
size_t start() const
Gets the start frame of this IA.
Definition: bbb_intentional_activity.h:65
void physical_activities(Iter out, const std::string &name="") const
Get all the phsical activities of this description.
Definition: bbb_description.h:197
Definition: bbb_traj_set.h:37
This class implements vectors, in the linear-algebra sense, restricted to integer-valued elements...
Definition: l_int_vector.h:83
size_t size() const
Get the jth actiity.
Definition: bbb_activity_sequence.h:62
size_t end
Definition: bbb_description.h:298
size_t num_activities() const
Get number of activities avialable.
Definition: bbb_activity_library.h:60
void write(const Data &data, const std::string &fname)
Write to file.
Definition: bbb_data.cpp:123
std::pair< Act_tree::const_iterator, Act_tree::const_iterator > children(const Intentional_activity &act) const
Get the the children of a given IA node.
Definition: bbb_description.h:140
Generic_trajectory< Complete_state > Trajectory
Definition: pt_complete_trajectory.h:42
Definition: bbb_data.h:37
size_t start
Definition: bbb_description.h:297
const Activity_sequence * add_child_sequence(const Intentional_activity *act, const Activity_sequence &aseq)
Add an activity sequence as a child of an IA.
Definition: bbb_description.h:117
reverse_iterator rbegin()
Definition: l_int_vector.h:466
void clear(const Intentional_activity &root)
Resets this description and sets the given IA as root.
Definition: bbb_description.h:109
void read(Data &data, const std::string &fname)
Read from file.
Definition: bbb_data.cpp:37
Description(const Description &desc)
Copy constructor: deep copy.
Definition: bbb_description.h:90
const_iterator begin() const
Iterator to first activity.
Definition: bbb_activity_sequence.h:53
Definition: bbb_description.h:293
const std::string & name() const
Gets the name of this IA.
Definition: bbb_intentional_activity.h:62
size_t size() const
Number of trajectories in this set.
Definition: bbb_traj_set.h:79
int get_num_rows() const
Return the number of rows in the matrix.
Definition: l_int_matrix.h:470
Object thrown when an argument to a function is not acceptable.
Definition: l_exception.h:377
Traj_set trajs
Definition: bbb_description.h:301
const_reverse_iterator rbegin() const
Iterator to reverse first index.
Definition: bbb_traj_set.h:73
void insert(const SizeType &j)
Add trajectory to this association.
Definition: bbb_traj_set.h:57
int get_num_cols() const
Return the number of columns in the matrix.
Definition: l_int_matrix.h:481
Definition: bbb_physical_activity.h:39
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Object thrown when input or output fails.
Definition: l_exception.h:496
iterator begin()
Definition: l_int_vector.h:426
Description(const Intentional_activity &root)
Create a descrpition which is forced to be of the given kind.
Definition: bbb_description.h:80
Description & operator=(const Description &desc)
Assignment: deep copy.
Definition: bbb_description.h:96
bool is_root(const Physical_activity &) const
Return true if the given activity is the root.
Definition: bbb_description.h:160
std::vector< Activity >::const_iterator const_iterator
Definition: bbb_activity_sequence.h:43
Definition for the Int_vector class, a thin wrapper on the KJB Int_vector struct and its related func...
Definition: bbb_activity_library.h:38
const Traj_set & trajectories() const
Get this IA's trajectories.
Definition: bbb_intentional_activity.h:77
size_t start() const
Get the start time of this description.
Definition: bbb_description.h:130
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...
size_t end() const
Get the end time of this description.
Definition: bbb_description.h:133
Object thrown when computation fails somehow during execution.
Definition: l_exception.h:321
bool contains(const A &act_p) const
Checks whether the given activity is contained (by address) in this description.
Definition: bbb_description.h:270