summaryrefslogtreecommitdiff
path: root/gi/scfg/abc/agrammar.h
diff options
context:
space:
mode:
authorlinh.kitty <linh.kitty@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-16 17:44:44 +0000
committerlinh.kitty <linh.kitty@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-16 17:44:44 +0000
commit15a587e247dc0954de27e2627f5511126243943d (patch)
tree3fbcdfc8416814c528d1c686c10f757f798c8e1e /gi/scfg/abc/agrammar.h
parent3de962259255a3621f5cd150e805c7dbcf7a7666 (diff)
add
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@286 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'gi/scfg/abc/agrammar.h')
-rw-r--r--gi/scfg/abc/agrammar.h54
1 files changed, 51 insertions, 3 deletions
diff --git a/gi/scfg/abc/agrammar.h b/gi/scfg/abc/agrammar.h
index 8a7186bf..0a8a60ac 100644
--- a/gi/scfg/abc/agrammar.h
+++ b/gi/scfg/abc/agrammar.h
@@ -2,10 +2,39 @@
#define AGRAMMAR_H_
#include "grammar.h"
+#include "hg.h"
using namespace std;
+class aTRule: public TRule{
+ public:
+ aTRuleTRule : TRule(){ResetScore(0.00000001); }
+ aTRule(TRulePtr rule_);
+
+ void ResetScore(double initscore){//cerr<<"Reset Score "<<this->AsString()<<endl;
+ sum_scores_.set_value(FD::Convert("Prob"), initscore);}
+ void AddProb(double p ){
+ // cerr<<"in AddProb p="<<p<<endl;
+ // cerr<<"prob sumscores ="<<sum_scores_[FD::Convert("Prob")]<<endl;
+ sum_scores_.add_value(FD::Convert("Prob"), p);
+ // cerr<<"after AddProb\n";
+ }
+
+ void UpdateScore(double sumprob){
+ double minuslogp = 0 - log( sum_scores_.value(FD::Convert("Prob")) /sumprob);
+ if (sumprob< sum_scores_.value(FD::Convert("Prob"))){
+ cerr<<"UpdateScore sumprob="<<sumprob<< " sum_scores_.value(FD::Convert(\"Prob\"))="<< sum_scores_.value(FD::Convert("Prob"))<< this->AsString()<<endl;
+ exit(1);
+ }
+ this->scores_.set_value(FD::Convert("MinusLogP"), minuslogp);
+
+ }
+ private:
+ SparseVector<double> sum_scores_;
+};
+
+
class aTGImpl;
struct NTRule{
@@ -20,17 +49,19 @@ struct NTRule{
for (int i=0; i< rule->f().size(); i++)
if (rule->f().at(i) * -1 == nt)
ntPos_.push_back(i);
+
+
}
TRulePtr rule_;
- WordID nt_; //the labelID of the nt (WordID>0);
+ WordID nt_; //the labelID of the nt (nt_>0);
vector<int> ntPos_; //position of nt_ -1: lhs, from 0...f_.size() for nt of f_()
//i.e the rules is: NP-> DET NP; if nt_=5 is the labelID of NP then ntPos_ = (-1, 1): the indexes of nonterminal NP
-
};
+
struct aTextGrammar : public Grammar {
aTextGrammar();
aTextGrammar(const std::string& file);
@@ -46,9 +77,20 @@ struct aTextGrammar : public Grammar {
void setMaxSplit(int max_split);
void splitNonterminal(WordID wordID);
- void PrintAllRules() const;
+
+ void splitAllNonterminals();
+
+ void PrintAllRules(const string & filename) const;
void PrintNonterminalRules(WordID nt) const;
void SetGoalNT(const string & goal_str);
+
+ void ResetScore();
+
+ void UpdateScore();
+
+ void UpdateHgProsteriorProb(Hypergraph & hg);
+
+ void set_alpha(double alpha){alpha_ = alpha;}
private:
void RemoveRule(const TRulePtr & rule);
@@ -57,9 +99,15 @@ struct aTextGrammar : public Grammar {
int max_span_;
int max_split_;
boost::shared_ptr<aTGImpl> pimpl_;
+
map <WordID, vector<TRulePtr> > lhs_rules_;// WordID >0
map <WordID, vector<NTRule> > nt_rules_;
+ map <WordID, double> sum_probs_;
+ map <WordID, double> cnt_rules;
+
+ double alpha_;
+
// map<WordID, vector<WordID> > grSplitNonterminals;
WordID goalID;
};