本文整理汇总了C++中CStateItem::Move方法的典型用法代码示例。如果您正苦于以下问题:C++ CStateItem::Move方法的具体用法?C++ CStateItem::Move怎么用?C++ CStateItem::Move使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CStateItem
的用法示例。
在下文中一共展示了CStateItem::Move方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: work
void CConParser::work(const CTwoStringVector &sentence, const CSentenceParsed &correct, CCoNLLOutput *o_conll){
const int length = sentence.size();
static int tmp_i,tmp_j;
static CAction correct_action;
m_lCache.clear();
m_lWordLen.clear();
for (tmp_i=0; tmp_i<length; tmp_i++ ) {
m_lCache.push_back( CTaggedWord<CTag, TAG_SEPARATOR>(sentence[tmp_i].first , sentence[tmp_i].second) );
m_lWordLen.push_back( getUTF8StringLength(sentence[tmp_i].first) );
}
std::vector<CStateItem> p(MAX_SENTENCE_SIZE*(2+UNARY_MOVES)+2);
CStateItem *correctState = &p[0];
//getLabeledBrackets(correct, correctState->gold_lb);
correctState->clear();
correctState->words = (&m_lCache);
tmp_i = 1;
while(true){
correctState->StandardMove(correct, correct_action);
//std::cerr<<correct_action<<std::endl;
correctState->Move(&p[tmp_i],correct_action);
correctState = &p[tmp_i];
tmp_i ++;
if (correctState == 0 || correctState->IsTerminated()) break; // while
}
correctState->GenerateStanford(sentence, o_conll);
p.clear();
}
示例2: GetOrUpdateStackScore
/*---------------------------------------------------------------
*
* extract_features - extract features from an example (counts
* recorded to parser model as weights)
*
*---------------------------------------------------------------*/
void
CDepParser::extract_features(const CDependencyParse &input) {
CStateItem item;
unsigned action;
CPackedScoreType<SCORE_TYPE, action::kMax> empty;
// word and pos
m_lCache.clear();
#ifdef LABELED
m_lCacheLabel.clear();
#endif
for (int i = 0; i < input.size(); ++ i) {
m_lCache.push_back(CTaggedWord<CTag, TAG_SEPARATOR>(input[i].word,
input[i].tag));
#ifdef LABELED
m_lCacheLabel.push_back(CDependencyLabel(input[i].label));
#endif
}
// make standard item
item.clear();
item.len_ = input.size();
for (int i = 0; i < input.size() * 2; ++ i) {
unsigned action = item.StandardMove(input
#ifdef LABELED
, m_lCacheLabel
#endif
);
GetOrUpdateStackScore(&item, empty, action, 1, 1);
item.Move(action);
}
}
示例3: updateScoreForState
inline void CDepParser::updateScoreForState( const CStateItem &from, const CStateItem *outout , const SCORE_TYPE &amount ) {
static CStateItem item(&m_lCache);
static unsigned action;
static CPackedScoreType<SCORE_TYPE, action::MAX> empty;
item = from;
while ( item != *outout ) {
action = item.FollowMove( outout );
getOrUpdateStackScore( &item, empty, action, amount, m_nTrainingRound );
#ifdef LABELED
// if ( action::getLabel(action) )
// getOrUpdateStackScore( &item, empty, action::getUnlabeledAction(action), amount, m_nTrainingRound );
#endif
item.Move( action );
}
}
示例4: updateScoresForStates
void CDepParser::updateScoresForStates( const CStateItem *outout , const CStateItem *correct , SCORE_TYPE amount_add, SCORE_TYPE amount_subtract ) {
// do not update those steps where they are correct
static CStateItem item(&m_lCache);
static unsigned action, correct_action;
item.clear();
while ( item != *outout ) {
action = item.FollowMove( outout );
correct_action = item.FollowMove( correct );
if ( action == correct_action )
item.Move( action );
else break;
}
// for the necessary information for the correct and outout parsetree
updateScoreForState( item, correct , amount_add ) ;
updateScoreForState( item, outout , amount_subtract ) ;
m_nTotalErrors++;
}
示例5: work
//.........这里部分代码省略.........
#endif
( pGenerator->stackempty() || m_supertags == 0 || m_supertags->canShift( pGenerator->size() ) ) && // supertags
( pGenerator->stackempty() || !m_weights->rules() || canBeRoot( m_lCache[pGenerator->size()].tag.code() ) || hasRightHead(m_lCache[pGenerator->size()].tag.code()) ) // rules
) {
shift(pGenerator, packed_scores) ;
}
}
if ( !pGenerator->stackempty() ) {
if (
#ifndef FRAGMENTED_TREE
( pGenerator->size() < length-1 || pGenerator->headstacksize() == 1 ) && // one root
#endif
( m_supertags == 0 || m_supertags->canArcRight(pGenerator->stacktop(), pGenerator->size()) ) && // supertags conform to this action
( !m_weights->rules() || hasLeftHead(m_lCache[pGenerator->size()].tag.code()) ) // rules
) {
arcright(pGenerator, packed_scores) ;
}
}
if ( (!m_bCoNLL && !pGenerator->stackempty()) ||
(m_bCoNLL && pGenerator->stacksize()>1) // make sure that for conll the first item is not popped
) {
if ( pGenerator->head( pGenerator->stacktop() ) != DEPENDENCY_LINK_NO_HEAD ) {
reduce(pGenerator, packed_scores) ;
}
else {
if ( (m_supertags == 0 || m_supertags->canArcLeft(pGenerator->size(), pGenerator->stacktop())) && // supertags
(!m_weights->rules() || hasRightHead(m_lCache[pGenerator->stacktop()].tag.code())) // rules
) {
arcleft(pGenerator, packed_scores) ;
}
}
}
}
// insert item
for (unsigned i=0; i<m_Beam->size(); ++i) {
pCandidate = *pGenerator;
pCandidate.score = m_Beam->item(i)->score;
pCandidate.Move( m_Beam->item(i)->action );
m_Agenda->pushCandidate(&pCandidate);
}
if (bTrain && *pGenerator == correctState) {
bCorrect = true ;
}
pGenerator = m_Agenda->generatorNext() ;
}
// when we are doing training, we need to consider the standard move and update
if (bTrain) {
#ifdef EARLY_UPDATE
if (!bCorrect) {
TRACE("Error at the "<<correctState.size()<<"th word; total is "<<correct.size())
updateScoresForStates(m_Agenda->bestGenerator(), &correctState, 1, -1) ;
#ifndef LOCAL_LEARNING
return ;
#else
m_Agenda->clearCandidates();
m_Agenda->pushCandidate(&correctState);
#endif
}
#endif
if (bCorrect) {
#ifdef LABELED
correctState.StandardMoveStep(correct, m_lCacheLabel);
#else
correctState.StandardMoveStep(correct);
#endif
}
#ifdef LOCAL_LEARNING
++m_nTrainingRound; // each training round is one transition-action
#endif
}
m_Agenda->nextRound(); // move round
}
if (bTrain) {
correctState.StandardFinish(); // pop the root that is left
// then make sure that the correct item is stack top finally
if ( *(m_Agenda->bestGenerator()) != correctState ) {
TRACE("The best item is not the correct one")
updateScoresForStates(m_Agenda->bestGenerator(), &correctState, 1, -1) ;
return ;
}
}
TRACE("Outputing sentence");
m_Agenda->sortGenerators();
for (int i=0; i<std::min(m_Agenda->generatorSize(), nBest); ++i) {
pGenerator = m_Agenda->generator(i) ;
if (pGenerator) {
pGenerator->GenerateTree( sentence , retval[i] ) ;
if (scores) scores[i] = pGenerator->score;
}
}
TRACE("Done, the highest score is: " << m_Agenda->bestGenerator()->score ) ;
TRACE("The total time spent: " << double(clock() - total_start_time)/CLOCKS_PER_SEC) ;
}
示例6: next_correct_state
int
CDepParser::work(const bool is_train,
const CTwoStringVector & sentence,
CDependencyParse * retval0, CDependencyParse * retval1,
const CDependencyParse & oracle_tree0, const CDependencyParse & oracle_tree1,
int nbest,
SCORE_TYPE *scores) {
#ifdef DEBUG
clock_t total_start_time = clock();
#endif
const int length = sentence.size();
const int max_round = length * 4 + 1;
const int max_lattice_size = (kAgendaSize + 1) * max_round;
ASSERT(length < MAX_SENTENCE_SIZE,
"The size of sentence is too long.");
CStateItem * lattice = GetLattice(max_lattice_size);
CStateItem * lattice_wrapper[max_lattice_size];
CStateItem ** lattice_index[max_round];
CStateItem * correct_state = lattice;
for (int i = 0; i < max_lattice_size; ++ i) {
lattice_wrapper[i] = lattice + i;
lattice[i].len_ = length;
}
lattice[0].clear();
correct_state = lattice;
lattice_index[0] = lattice_wrapper;
lattice_index[1] = lattice_index[0] + 1;
static CPackedScoreType<SCORE_TYPE, action::kMax> packed_scores;
TRACE("Initialising the decoding process ...");
m_lCache.clear();
for (int i = 0; i < length; ++ i) {
m_lCache.push_back(CTaggedWord<CTag, TAG_SEPARATOR>(sentence[i].first,
sentence[i].second));
#ifdef LABELED
if (is_train) {
if (i == 0) { m_lCacheLabel0.clear(); m_lCacheLabel1.clear(); }
m_lCacheLabel0.push_back(CDependencyLabel(oracle_tree0[i].label));
m_lCacheLabel1.push_back(CDependencyLabel(oracle_tree1[i].label));
}
#endif
}
int num_results = 0;
int round = 0;
bool is_correct; // used for training to specify correct state in lattice
// loop with the next word to process in the sentence,
// `round` represent the generators, and the condidates should be inserted
// into the `round + 1`
for (round = 1; round < max_round; ++ round) {
if (lattice_index[round - 1] == lattice_index[round]) {
// there is nothing in generators, the proning has cut all legel
// generator. actually, in this kind of case, we should raise a
// exception. however to achieve a parsing tree, an alternative
// solution is go back to the previous round
WARNING("Parsing Failed!");
-- round;
break;
}
int current_beam_size = 0;
// loop over the generator states
// std::cout << "round : " << round << std::endl;
for (CStateItem ** q = lattice_index[round - 1];
q != lattice_index[round];
++ q) {
const CStateItem * generator = (*q);
m_Beam->clear(); packed_scores.reset();
GetOrUpdateStackScore(generator, packed_scores, action::kNoAction);
Transit(generator, packed_scores);
for (unsigned i = 0; i < m_Beam->size(); ++ i) {
CStateItem candidate; candidate = (*generator);
// generate candidate state according to the states in beam
int curIndex = candidate.nextactionindex();
candidate.Move(curIndex, m_Beam->item(i)->action);
candidate.score = m_Beam->item(i)->score;
candidate.previous_ = generator;
current_beam_size += InsertIntoBeam(lattice_index[round],
&candidate,
current_beam_size,
kAgendaSize);
}
}
//.........这里部分代码省略.........
示例7: next_correct_state
/*---------------------------------------------------------------
*
* work - the working process shared by training and parsing
*
* Returns: makes a new instance of CDependencyParse
*
*--------------------------------------------------------------*/
int
CDepParser::work(const bool is_train,
const CTwoStringVector & sentence,
CDependencyParse * retval,
const CDependencyParse & oracle_tree,
int nbest,
SCORE_TYPE *scores) {
#ifdef DEBUG
clock_t total_start_time = clock();
#endif
const int length = sentence.size();
const int max_round = length * 2 + 1;
const int max_lattice_size = (kAgendaSize + 1) * max_round;
ASSERT(length < MAX_SENTENCE_SIZE,
"The size of sentence is too long.");
CStateItem * lattice = GetLattice(max_lattice_size);
CStateItem * lattice_index[max_round];
CStateItem * correct_state = lattice;
for (int i = 0; i < max_lattice_size; ++ i) {
lattice[i].len_ = length;
}
lattice[0].clear();
correct_state = lattice;
lattice_index[0] = lattice;
lattice_index[1] = lattice_index[0] + 1;
static CPackedScore packed_scores;
TRACE("Initialising the decoding process ...");
m_lCache.clear();
for (int i = 0; i < length; ++ i) {
m_lCache.push_back(CTaggedWord<CTag, TAG_SEPARATOR>(sentence[i].first,
sentence[i].second));
#ifdef LABELED
if (is_train) {
if (i == 0) {
m_lCacheLabel.clear();
}
m_lCacheLabel.push_back(CDependencyLabel(oracle_tree[i].label));
}
#endif
}
int num_results = 0;
int round = 0;
bool is_correct; // used for training to specify correct state in lattice
// loop with the next word to process in the sentence, 'round' represent the
// generators, and the condidates should be inserted into the 'round + 1'
for (round = 1; round < max_round; ++ round) {
if (lattice_index[round - 1] == lattice_index[round]) {
// There is nothing in generators, the proning has cut all legel
// generator. Actually, in this kind of case, we should raise a
// exception. However to achieve a parsing tree, an alternative
// solution is go back to the previous round
WARNING("Parsing Failed!");
-- round;
break;
}
current_beam_size_ = 0;
// loop over the generator states
// std::cout << "round : " << round << std::endl;
for (CStateItem * q = lattice_index[round - 1]; q != lattice_index[round];
++ q) {
const CStateItem * generator = q;
packed_scores.reset();
GetOrUpdateStackScore(generator, packed_scores, action::kNoAction);
Transit(generator, packed_scores);
}
for (unsigned i = 0; i < current_beam_size_; ++ i) {
const CScoredTransition& transition = m_kBestTransitions[i];
CStateItem* target = lattice_index[round]+ i;
(*target) = (*transition.source);
// generate candidate state according to the states in beam
target->Move(transition.action);
target->score = transition.score;
target->previous_ = transition.source;
}
lattice_index[round + 1] = lattice_index[round] + current_beam_size_;
if (is_train) {
CStateItem next_correct_state(*correct_state);
next_correct_state.StandardMoveStep(oracle_tree
#ifdef LABELED
, m_lCacheLabel
//.........这里部分代码省略.........