1 #ifndef SEMANTIC_OBJECT_H_
2 #define SEMANTIC_OBJECT_H_
17 #include <boost/tuple/tuple.hpp>
18 #include <boost/shared_ptr.hpp>
19 #include <boost/make_shared.hpp>
20 #include <boost/array.hpp>
21 #include <boost/functional/hash.hpp>
22 #include <boost/algorithm/string/join.hpp>
34 class Semantic_data_base;
45 class Semantic_elaboration;
62 template<
class T,
class Traits = Semantic_traits<T> >
class Semantic_data;
69 template<
class T,
class Traits = Semantic_traits<T> >
77 template<
class T,
class Traits = Semantic_traits<T> >
82 template<
class T,
class Traits>
83 std::ostream& operator<<(std::ostream&, Semantic_data<T, Traits>);
95 const boost::shared_ptr<Null_semantic_terminal>&
113 typedef boost::shared_ptr<Semantic_data_base>
Base_ptr;
115 typedef std::map<size_t, std::string>
Map;
131 virtual const size_t&
head_code()
const = 0;
132 virtual const size_t&
args_code()
const = 0;
141 static boost::shared_ptr<Map> ghm(
new Map());
147 static boost::shared_ptr<Map> gam(
new Map());
154 template<
class T,
class Traits>
155 class Semantic_data :
public Semantic_data_base
163 typedef boost::shared_ptr<Semantic_data<T, Traits> >
Self_ptr;
164 typedef boost::array<Val_type, Traits::n_args>
Arg_list;
208 const size_t&
head_code()
const {
return hash_pair_.get<0>();}
212 const size_t&
args_code()
const {
return hash_pair_.get<1>();}
224 friend std::ostream& operator<< <T,Traits>(std::ostream& os,
Self_type d);
233 static boost::shared_ptr<Semantic_db> hm(
new Semantic_db());
238 static boost::shared_ptr<Arg_map_list> aml(
new Arg_map_list);
247 void initialize_codes();
267 typedef boost::shared_ptr<Semantic_elaboration>
Self_ptr;
271 typedef boost::tuple<Self_ptr_const, Semantic_data_base::Hash_pair>
Step_result;
296 virtual const Val_type&
arg(
const size_t& pos)
const = 0;
304 virtual const size_t&
head_code()
const = 0;
308 virtual const size_t&
args_code()
const = 0;
371 virtual void print(std::ostream& os)
const = 0;
375 virtual void print_subtree(std::ostream&,
int indent_level = 0)
const = 0;
387 template<
class T,
class Traits>
388 class Terminal_elaboration :
public Semantic_elaboration
397 typedef boost::shared_ptr<Semantic_data<T> >
Data_ptr;
433 "Attempted to access the argument of a Terminal_elaboration"
443 "Attempted to access the argument of a Terminal_elaboration"
467 return Traits::step_filter();
511 void print(std::ostream& os)
const {os << *data_;}
515 void print_subtree(std::ostream& os,
int indent_level)
const;
522 template<
class T,
class Traits>
523 class Nonterminal_elaboration :
public Semantic_elaboration
535 typedef boost::shared_ptr<Semantic_data<T> >
Data_ptr;
584 return data_->head_s();
592 "Attempted to access argument %d in a Nonterminal_elaboration"
593 " with only %d arguments", (pos)(Traits::n_args));
602 "Attempted to access argument %d in a Nonterminal_elaboration"
603 " with only %d arguments", (pos)(Traits::n_args));
643 "Attempted to access referent corresponding to nonexistent "
644 "argument %d in a Nonterminal_elaboration with only "
645 "%d arguments", (pos)(Traits::n_args));
646 return referent_list_[pos + 1];
653 return Traits::step_filter();
682 const size_t& pos_for_old
705 for(Referent_list::const_iterator it = ++(referent_list_.begin());
706 it != referent_list_.end(); ++it)
719 void print_subtree(std::ostream& os,
int indent_level = 0)
const;
734 template<
class T,
class Traits>
736 const Val_type& head,
740 hash_pair_(boost::make_tuple(0UL, 0UL))
747 std::string argstring =
748 "(" + boost::algorithm::join(args_s,
",") +
")";
754 template<
class T,
class Traits>
759 head_(head_map().
encode(head)),
761 hash_pair_(boost::make_tuple(0UL, 0UL))
765 std::string argstring =
766 "(" + boost::algorithm::join(args,
",") +
")";
772 template<
class T,
class Traits>
774 : head_(head), args_(), hash_pair_(boost::make_tuple(0UL, 0UL))
784 template<
class T,
class Traits>
786 : head_(head_map().
encode(head)), args_(), hash_pair_(boost::make_tuple(0UL, 0UL))
795 template<
class T,
class Traits>
798 boost::hash_combine<int>(hash_pair_.get<0>(), head_);
799 boost::hash_combine<int>(hash_pair_.get<0>(), Traits::type_code);
800 boost::hash_range(hash_pair_.get<1>(), args_.begin(), args_.end());
801 boost::hash_combine<int>(hash_pair_.get<1>(), Traits::type_code);
808 template<
class T,
class Traits>
816 template<
class T,
class Traits>
825 template<
class T,
class Traits>
834 template<
class T,
class Traits>
849 return boost::make_tuple(
851 boost::make_tuple(0UL, 0UL)
858 template<
class T,
class Traits>
864 std::string lead(4*indent_level,
' ');
865 os << lead << *data_ << std::endl;
874 template<
class T,
class Traits>
887 referent_list_(referent_list)
889 for(
typename Child_array::iterator it = children_.begin();
890 it != children_.end(); ++it)
898 template<
class T,
class Traits>
911 referent_list_(referent_list)
913 for(
typename Child_array::iterator it = children_.begin();
914 it != children_.end(); ++it)
922 template<
class T,
class Traits>
926 data_ = boost::make_shared<Semantic_data<T> >(h, args);
931 template<
class T,
class Traits>
936 "Attempted to access child in nonexistent slot %d in"
937 " Nonterminal_elaboration with only %d slots",
938 (index)(Traits::n_args));
939 return children_[index];
944 template<
class T,
class Traits>
951 "Attempted to add child to nonexistent slot %d in Nonterminal_elaboration"
952 "which has only %d slots", (pos)(Traits::n_args));
953 children_[pos] = child;
958 template<
class T,
class Traits>
962 const size_t& pos_for_old
966 "Attempted to insert child to nonexistent slot %d in Nonterminal_elaboration"
967 "which has only %d slots", (pos)(Traits::n_args));
968 Base_ptr old_child = children_[pos];
969 add_child(pos, new_child);
970 children_[pos] -> add_child(pos_for_old, old_child);
975 template<
class T,
class Traits>
986 return head_child_ == NULL ?
989 boost::make_tuple(0UL, 0UL)) :
993 head_child_ -> head_code(),
994 head_child_ -> args_code()
1002 boost::make_tuple(0UL, 0UL)) :
1005 boost::make_tuple(p0 -> head_code(), p0 -> args_code())
1012 boost::make_tuple(0UL, 0UL)) :
1015 boost::make_tuple(p1 -> head_code(), p1 -> args_code())
1023 boost::make_tuple(0UL, 0UL)
1030 template<
class T,
class Traits>
1036 std::string lead(4*indent_level,
' ');
1039 head_child_ -> print_subtree(os, indent_level + 1);
1040 for(
typename Child_array::const_iterator it = children_.begin();
1041 it != children_.end(); it++)
1043 if(*it != NULL) (*it) -> print_subtree(os, indent_level + 1);
1065 template<
class T,
class Traits>
1072 typename D::Arg_list_s keys = multi_map_decode<typename D::Arg_list_s>(
1073 D::arg_map_list(), d.args_);
1074 os << D::head_map().decode(d.head_);
1075 if(Traits::n_args != 0)
1078 for(
typename D::Arg_list_s::const_iterator it = keys.begin();
1079 it != keys.end(); it++)
T multi_map_encode(M maps, U keys)
Definition: Token_map.h:74
boost::array< Key_type, Traits::n_args > Arg_list_s
Definition: Semantic_elaboration.h:165
const Val_type & arg(const size_t &pos) const
return underlying hash code for head value
Definition: Semantic_elaboration.h:589
virtual const Hash_pair & hash_pair() const =0
Semantic_step_proposal::Step_result Step_result
Definition: Semantic_step_proposal.cpp:40
Semantic_data< T, Traits > Self_type
Definition: Semantic_elaboration.h:162
const Key_type & head_s() const
return code for head value
Definition: Semantic_elaboration.h:582
boost::shared_ptr< Semantic_data< T > > Data_ptr
Definition: Semantic_elaboration.h:397
boost::tuple< size_t, size_t > Hash_pair
Definition: Semantic_elaboration.h:114
const size_t & args_code() const
return underlying hash code for args
Definition: Semantic_elaboration.h:453
Self_ptrs_read children() const
return pointer to child in a particular position
Definition: Semantic_elaboration.h:476
virtual Self_ptr child(const size_t &) const =0
return pointer to child in a particular position
Step_result take_a_step(const Step_code_t &step_code) const
takes a step down the semantic tree, returning data
Definition: Semantic_elaboration.h:977
virtual const size_t & args_code() const =0
return underlying hash code for args
const Step_code::Weights & step_filter() const
return binary filter array indicating allowable steps
Definition: Semantic_elaboration.h:651
const Key_type & head_s() const
return code for head value
Definition: Semantic_elaboration.h:425
const Key_type & arg_s(const size_t &pos) const
return code for head value
Definition: Semantic_elaboration.h:599
Definition: SemanticIO.h:62
Terminal_elaboration()
construct with null head value
Definition: Semantic_elaboration.h:809
boost::shared_ptr< const Semantic_elaboration > Self_ptr_const
Definition: Semantic_elaboration.h:268
Object thrown when an index argument exceeds the size of a container.
Definition: l_exception.h:399
Traits Traits_t
Definition: Semantic_elaboration.h:532
Definition: SemanticIO.h:60
static Semantic_db & head_map()
Definition: Semantic_elaboration.h:231
const Data_base_ptr data() const
return pointer to underlying data node
Definition: Semantic_elaboration.h:461
const Arg_list & args() const
return args (pass-through to data_)
Definition: Semantic_elaboration.h:625
virtual const size_t & head_code() const =0
virtual const Referent_code & arg_referent(const size_t &) const
get the integral code for the arg in position pos (if it exists)
Definition: Semantic_elaboration.h:336
std::ostream & operator<<(std::ostream &os, const Categorical_event_base &e)
display key in human readable form
Definition: Categorical_event.cpp:13
Definition: SemanticIO.h:63
virtual const Data_base_ptr data() const =0
return pointer to underlying data node
const Key_type & arg_s(const size_t &) const
return underlying hash code for head value
Definition: Semantic_elaboration.h:439
const Arg_list & args() const
return the actual arg tuple
Definition: Semantic_elaboration.h:196
Semantic_data(const Val_type &head, const Arg_list &args)
standard constructor
Definition: Semantic_elaboration.h:735
const Referent_code & arg_referent(const size_t &pos) const
get the integral code for the arg in position pos (if it exists)
Definition: Semantic_elaboration.h:640
virtual size_t type_code() const =0
return the code corresponding to the type of elaboration
virtual const size_t & args_code() const =0
Definition: Semantic_elaboration.h:78
virtual void print_subtree(std::ostream &, int indent_level=0) const =0
recursively print elaboration tree contents
Structure for returning results of a single sampling move.
Definition: sample_base.h:55
boost::shared_ptr< Semantic_elaboration > Self_ptr
Definition: Semantic_elaboration.h:267
static Map & global_arg_map()
Definition: Semantic_elaboration.h:145
Semantic_data_base::Hash_pair Hash_pair
Definition: Semantic_elaboration.h:266
Semantic_data_base::Val_type Val_type
Definition: Semantic_elaboration.h:265
const size_t & head_code() const
return hash code for head
Definition: Semantic_elaboration.h:208
std::vector< Referent_code > Referent_list
Definition: Semantic_elaboration.h:273
void add_child(const size_t &, const Self_ptr)
put a child in a particular position
Definition: Semantic_elaboration.h:491
Data_type::Arg_list_s Arg_list_s
Definition: Semantic_elaboration.h:537
void print_subtree(std::ostream &os, int indent_level) const
recursively print elaboration tree contents
Definition: Semantic_elaboration.h:859
void add_child(const size_t &pos, const Base_ptr child)
add a new elaboration of argument "index", discarding any existing
Definition: Semantic_elaboration.h:945
std::string Key_type
Definition: Token_map.h:23
virtual Step_result take_a_step(const Step_code_t &step_code) const =0
step down the tree according to step_code
std::map< size_t, std::string > Map
Definition: Semantic_elaboration.h:115
size_t type_code() const
return type code
Definition: Semantic_elaboration.h:617
Semantic_db::Key_type Key_type
Definition: Semantic_elaboration.h:112
void insert_child(const size_t &pos, const Base_ptr new_child, const size_t &pos_for_old)
add child and have it adopt existing one
Definition: Semantic_elaboration.h:959
static Arg_map_list & arg_map_list()
Definition: Semantic_elaboration.h:236
virtual const Val_type & head() const =0
void print_subtree(std::ostream &os, int indent_level=0) const
recursively print the full elaboration tree
Definition: Semantic_elaboration.h:1031
Traits class storing information specific to given elaboration types.
Definition: Semantic_elaboration.h:52
Semantic_elaboration::Self_ptr Base_ptr
Definition: Semantic_elaboration.h:395
boost::shared_ptr< Semantic_data< T > > Data_ptr
Definition: Semantic_elaboration.h:535
const size_t & head_code() const
return underlying hash code for head value
Definition: Semantic_elaboration.h:449
Semantic_data_base::Base_ptr Data_base_ptr
Definition: Semantic_elaboration.h:270
virtual void print(std::ostream &os) const =0
print contents at this node
Self_ptrs_read children() const
access the container of children by const reference
Definition: Semantic_elaboration.h:633
Base_ptr child(const size_t &index) const
get pointer to child elaboration in position "index"
Definition: Semantic_elaboration.h:933
const Data_base_ptr data() const
return pointer to data node
Definition: Semantic_elaboration.h:621
virtual bool is_terminal() const =0
is this a terminal node?
Definition: SemanticIO.h:57
void initialize_global_semantic_maps()
Definition: Semantic_elaboration.cpp:13
const Referent_code & head_referent() const
get the integral code for the referent (if it exists)
Definition: Semantic_elaboration.h:638
Class representing semantic nodes at the leaves of trees.
Definition: Semantic_elaboration.h:70
virtual const size_t & head_code() const =0
return underlying hash code for head value
Semantic_data_base::Key_type Key_type
Definition: Semantic_elaboration.h:264
std::pair< size_t, std::string > Map_entry
Definition: Semantic_elaboration.h:116
const Val_type & head() const
return code for head value
Definition: Semantic_elaboration.h:421
const Hash_pair & hash_pair() const
return hash pair for head and args
Definition: Semantic_elaboration.h:216
Definition: SemanticIO.h:56
#define encode(triedge)
Definition: triangle.c:819
size_t Val_type
Definition: Token_map.h:24
Nonterminal_elaboration(const Val_type &head, const Arg_list &args, const Referent_list &referent_list=Referent_list(Traits::n_args+1, NULL_REFERENT))
construct an elaboration from numeric codes for head and args
Definition: Semantic_elaboration.h:875
virtual void add_child(const size_t &, const Self_ptr)=0
put a child in a particular position
Step_result take_a_step(const Step_code_t &step_code) const
take a step down the semantic tree of type step_code
Definition: Semantic_elaboration.h:836
void insert_child(const size_t &, const Self_ptr, const size_t &)
add child and have existing child "adopt" the old one
Definition: Semantic_elaboration.h:495
void set_data_args(const Arg_list &args)
set new argument values for underyling data
Definition: Semantic_elaboration.h:923
Abstract base class of Semantic Data template.
Definition: Semantic_elaboration.h:104
virtual void insert_child(const size_t &, const Self_ptr, const size_t &)=0
add child and have existing child adopt the old one
virtual ~Semantic_data_base()
Definition: Semantic_elaboration.h:124
bool is_terminal() const
is this a terminal node?
Definition: Semantic_elaboration.h:503
Semantic_elaboration::Self_ptr_const Base_ptr_const
Definition: Semantic_elaboration.h:534
virtual const Val_type & head() const =0
return underlying hash code for head value
boost::tuple< Self_ptr_const, Semantic_data_base::Hash_pair > Step_result
Definition: Semantic_elaboration.h:271
virtual const Key_type & head_s() const =0
return underlying hash code for head value
virtual const Key_type & arg_s(const size_t &pos) const =0
return underlying hash code for head value
Definition: SemanticIO.h:61
#define KJB_THROW_2(ex, msg)
Definition: l_exception.h:48
virtual const Val_type & arg(const size_t &pos) const =0
return underlying hash code for head value
virtual ~Semantic_elaboration()
Definition: Semantic_elaboration.h:280
Definition: SemanticIO.h:58
boost::array< Base_ptr, Traits::n_args > Child_array
Definition: Semantic_elaboration.h:538
bool is_terminal() const
query whether this elaboration is a terminal or not
Definition: Semantic_elaboration.h:692
int Referent_code
Definition: Semantic_elaboration.h:272
virtual const Step_code::Weights & step_filter() const =0
return a binary filter indicating what steps are allowed
Forward declarations.
Definition: prob_weight_array.h:28
const size_t & head_code() const
return underlying hash code for head value
Definition: Semantic_elaboration.h:609
void print(std::ostream &os) const
print contents at this node to ostream os
Definition: Semantic_elaboration.h:700
virtual Self_ptrs_read children() const =0
return pointer to child in a particular position
Base class for semantic elaborations.
Definition: Semantic_elaboration.h:257
Object thrown when the program does something thought impossible.
Definition: l_exception.h:358
boost::array< Token_map *, Traits::n_args > Arg_map_list
Definition: Semantic_elaboration.h:166
Object thrown when an argument to a function is not acceptable.
Definition: l_exception.h:377
Terminal_elaboration< Null_primitive > Null_semantic_terminal
Definition: Semantic_elaboration.h:87
void print(std::ostream &os) const
print contents at this node
Definition: Semantic_elaboration.h:511
Semantic_data< T > Data_type
Definition: Semantic_elaboration.h:531
Definition: SemanticIO.h:59
Traits Traits_t
Definition: Semantic_elaboration.h:396
boost::shared_ptr< Semantic_data< T, Traits > > Self_ptr
Definition: Semantic_elaboration.h:163
virtual const Referent_code & head_referent() const
get the integral code for the referent (if it exists)
Definition: Semantic_elaboration.h:332
D
Definition: APPgetLargeConnectedEdges.m:106
boost::array< Val_type, Traits::n_args > Arg_list
Definition: Semantic_elaboration.h:164
const Val_type & arg(const size_t &) const
return underlying hash code for head value
Definition: Semantic_elaboration.h:429
size_t type_code() const
return type code
Definition: Semantic_elaboration.h:457
Support for error handling exception classes in libKJB.
const size_t & args_code() const
return underlying hash code for args
Definition: Semantic_elaboration.h:613
#define IFTD(a, ex, msg, params)
Definition: l_exception.h:112
friend std::ostream & operator<<(std::ostream &os, Self_ptr)
Definition: Semantic_elaboration.cpp:34
static const Referent_code NULL_REFERENT
Definition: Semantic_elaboration.h:274
Semantic_elaboration::Self_ptr Base_ptr
Definition: Semantic_elaboration.h:533
Concrete semantic data class for storing hash codes about nodes.
Definition: Semantic_elaboration.h:62
virtual const Key_type & decode(const Val_type &val)
look up key associated with code
Definition: Token_map.cpp:33
const size_t & args_code() const
return hash code for arg list
Definition: Semantic_elaboration.h:212
const Key_type & head_s() const
return the actual head value
Definition: Semantic_elaboration.h:204
Code
Definition: SemanticIO.h:54
const Val_type & head() const
return code for head value
Definition: Semantic_elaboration.h:578
Base_ptr child(const size_t &) const
return pointer to child in a particular position
Definition: Semantic_elaboration.h:472
const Val_type & head() const
return the actual head value
Definition: Semantic_elaboration.h:200
boost::shared_ptr< Semantic_data_base > Base_ptr
Definition: Semantic_elaboration.h:113
Nonterminal_elaboration< T, Traits > Self_type
Definition: Semantic_elaboration.h:530
Data_type::Arg_list Arg_list
Definition: Semantic_elaboration.h:536
Definition: Semantic_db.h:16
Semantic_db::Val_type Val_type
Definition: Semantic_elaboration.h:111
const boost::shared_ptr< Null_semantic_terminal > & null_semantic_terminal()
creates a new "null" terminal node (w/ no semantic content)
Definition: Semantic_traits.cpp:46
static Map & global_head_map()
Definition: Semantic_elaboration.h:139
std::deque< Self_ptr_const > Self_ptrs_read
Definition: Semantic_elaboration.h:269
const Step_code::Weights & step_filter() const
return binary filter array indicating allowable steps
Definition: Semantic_elaboration.h:465