summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdecoder/apply_fsa_models.cc7
-rw-r--r--decoder/hg.h3
-rw-r--r--decoder/inside_outside.h2
-rw-r--r--decoder/viterbi.h2
-rwxr-xr-xutils/agenda.h1
-rw-r--r--utils/d_ary_heap.h12
6 files changed, 18 insertions, 9 deletions
diff --git a/decoder/apply_fsa_models.cc b/decoder/apply_fsa_models.cc
index 4a928206..83083fc5 100755
--- a/decoder/apply_fsa_models.cc
+++ b/decoder/apply_fsa_models.cc
@@ -495,9 +495,8 @@ typedef Item *ItemP;
/* we use a single type of item so it can live in a single best-first queue. we hold them by pointer so they can have mutable state, e.g. priority/location, but also lists of predictions and kbest completions (i.e. completions[L,r] = L -> * (r,s), by 1best for each possible s. we may discover more s later. we could use different subtypes since we hold by pointer, but for now everything will be packed as variants of Item */
struct Item : ItemPrio,ItemKey {
- explicit Item(NodeP dot,int next=0) : ItemKey(dot),next(next),from(0) { }
- explicit Item(NodeP dot,FFState const& state,int next=0) : ItemKey(dot,state),next(next),from(0) { }
- unsigned location;
+ explicit Item(NodeP dot,int next=0) : ItemKey(dot),next(next),from(0),location(D_ARY_HEAP_NULL_INDEX) { }
+ explicit Item(NodeP dot,FFState const& state,int next=0) : ItemKey(dot,state),next(next),from(0),location(D_ARY_HEAP_NULL_INDEX) { }
typedef std::queue<ItemP> Predicted;
Predicted predicted; // this is empty, unless this is a predicted L -> .asdf item, or a to-complete L -> asdf .
int next; // index of dot->adj to complete (if dest==0), or predict (if NT), or scan (if word). note: we could store pointer inside adj since it and trie are @ fixed addrs. less pointer arith, more space.
@@ -517,6 +516,7 @@ struct Item : ItemPrio,ItemKey {
o<< ']';
}
PRINT_SELF(Item)
+ unsigned location;
};
struct GetItemKey {
@@ -645,6 +645,7 @@ void ApplyFsa<F>::ApplyEarley()
Chart<F> chart(cfg,smeta,fsa);
// don't need to uniq - option to do that already exists in cfg_options
//TODO:
+ *oh=hgcfg.ih;
}
diff --git a/decoder/hg.h b/decoder/hg.h
index 76b2b8f0..a78746b0 100644
--- a/decoder/hg.h
+++ b/decoder/hg.h
@@ -298,6 +298,9 @@ public:
std::swap(is_linear_chain_, other.is_linear_chain_);
other.edges_.swap(edges_);
}
+ friend inline void swap(Hypergraph &a,Hypergraph &b) {
+ a.swap(b);
+ }
void ResizeNodes(int size) {
nodes_.resize(size);
diff --git a/decoder/inside_outside.h b/decoder/inside_outside.h
index 73d4ec6a..e6289176 100644
--- a/decoder/inside_outside.h
+++ b/decoder/inside_outside.h
@@ -55,7 +55,7 @@ WeightType Inside(const Hypergraph& hg,
*cur_node_inside_score += score;
}
}
- return inside_score.back();
+ return inside_score.empty() ? WeightType(0) : inside_score.back();
}
template<class WeightType, class WeightFunction>
diff --git a/decoder/viterbi.h b/decoder/viterbi.h
index e78cd157..ac0b9a11 100644
--- a/decoder/viterbi.h
+++ b/decoder/viterbi.h
@@ -55,6 +55,8 @@ typename WeightFunction::Weight Viterbi(const Hypergraph& hg,
antsb[k] = &vit_result[edgeb.tail_nodes_[k]];
traverse(edgeb, antsb, cur_node_best_result);
}
+ if (vit_result.empty())
+ return WeightType(0);
std::swap(*result, vit_result.back());
return vit_weight.back();
}
diff --git a/utils/agenda.h b/utils/agenda.h
index 1937ad1a..a4940a00 100755
--- a/utils/agenda.h
+++ b/utils/agenda.h
@@ -64,6 +64,7 @@ struct Less {
};
// LocMap and PrioMap are boost property maps put(locmap,key,size_t), Better(get(priomap,k1),get(priomap,k2)) means k1 should be above k2 (be popped first). Locmap and PrioMap may have state; the rest are assumed stateless functors
+// make sure the (default) location is not -1 for anything you add, or else an assertion may trigger
template <class Item,class Better=Less, /* intern_pool args */ class KeyF=get_key<Item>,class HashKey=boost::hash<typename KeyF::result_type>,class EqKey=std::equal_to<typename KeyF::result_type>, class Pool=boost::object_pool<Item> >
struct Agenda : intern_pool<Item,KeyF,HashKey,EqKey,Pool> {
typedef intern_pool<Item,KeyF,HashKey,EqKey,Pool> Intern; // inherited because I want to use construct()
diff --git a/utils/d_ary_heap.h b/utils/d_ary_heap.h
index eee8efe0..20cdab95 100644
--- a/utils/d_ary_heap.h
+++ b/utils/d_ary_heap.h
@@ -12,6 +12,9 @@
#define D_ARY_VERIFY_HEAP 1
// This is a very expensive test so it should be disabled even when NDEBUG is not defined
+# undef D_ARY_HEAP_NULL_INDEX
+# define D_ARY_HEAP_NULL_INDEX (-1) // if you want to test contains before adding, init location to this.
+
/* adapted from boost/graph/detail/d_ary_heap.hpp
local modifications:
@@ -112,8 +115,6 @@
typename Equal = std::equal_to<Value> >
class d_ary_heap_indirect {
BOOST_STATIC_ASSERT (Arity >= 2);
-# undef D_ARY_HEAP_NULL_INDEX
-# define D_ARY_HEAP_NULL_INDEX ((size_type)(-1))
public:
typedef Container container_type;
typedef Size size_type;
@@ -285,9 +286,10 @@
#pragma GCC diagnostic ignored "-Wtype-limits"
// because maybe size_type is signed or unsigned
inline bool contains(const Value &v,size_type i) const {
- return D_ARY_TRACK_OUT_OF_HEAP ?
- (i != D_ARY_HEAP_NULL_INDEX) :
- i>=0 && i<data.size() && equal(v,data[i]); // note: size_type may be signed (don't recommend it, though) - thus i>=0 check to catch uninit. data
+ if (D_ARY_TRACK_OUT_OF_HEAP)
+ return i != D_ARY_HEAP_NULL_INDEX;
+ size_type sz=data.size();
+ return i>=0 && i<sz && equal(v,data[i]); // note: size_type may be signed (don't recommend it, though) - thus i>=0 check to catch uninit. data
}
#include "warning_pop.h"