// to be called with countF-1 instead of countF REO_POS getOrientPhraseModel (SentenceAlignment & sentence, REO_MODEL_TYPE modelType, bool connectedLeftTop, bool connectedRightTop, int startF, int endF, int startE, int endE, int countF, int zero, int unit, bool (*ge)(int, int), bool (*lt)(int, int), const HSentenceVertices & inBottomRight, const HSentenceVertices & inBottomLeft){ HSentenceVertices::const_iterator it; if((connectedLeftTop && !connectedRightTop) || ((it = inBottomRight.find(startE - unit)) != inBottomRight.end() && it->second.find(startF-unit) != it->second.end())) return LEFT; if(modelType == REO_MONO) return UNKNOWN; if((!connectedLeftTop && connectedRightTop) || ((it = inBottomLeft.find(startE - unit)) != inBottomLeft.end() && it->second.find(endF + unit) != it->second.end())) return RIGHT; if(modelType == REO_MSD) return UNKNOWN; connectedLeftTop = false; for(int indexF=startF-2*unit; (*ge)(indexF, zero) && !connectedLeftTop; indexF=indexF-unit) if((connectedLeftTop = (it = inBottomRight.find(startE - unit)) != inBottomRight.end()) && it->second.find(indexF) != it->second.end()) return DRIGHT; connectedRightTop = false; for(int indexF=endF+2*unit; (*lt)(indexF, countF) && !connectedRightTop; indexF=indexF+unit) if((connectedRightTop = (it = inBottomLeft.find(startE - unit)) != inBottomRight.end()) && it->second.find(indexF) != it->second.end()) return DLEFT; return UNKNOWN; }
void insertVertex( HSentenceVertices & corners, int x, int y ){ set<int> tmp; tmp.insert(x); pair<HSentenceVertices::iterator, bool> ret = corners.insert(make_pair(y, tmp)); if (ret.second == false) ret.first->second.insert(x); }
void PhraseOrientation::InsertVertex( HSentenceVertices & corners, int x, int y ) { std::set<int> tmp; tmp.insert(x); std::pair< HSentenceVertices::iterator, bool > ret = corners.insert( std::pair<int, std::set<int> > (y, tmp) ); if (ret.second == false) { ret.first->second.insert(x); } }
// to be called with countF-1 instead of countF PhraseOrientation::REO_CLASS PhraseOrientation::GetOrientHierModel(REO_MODEL_TYPE modelType, int startF, int endF, int startE, int endE, int countF, int zeroF, int zeroE, int unit, bool (*ge)(int, int), bool (*le)(int, int), const HSentenceVertices & bottomRight, const HSentenceVertices & bottomLeft) const { bool leftSourceSpanIsAligned = ( (startF != zeroF) && SourceSpanIsAligned(zeroF,startF-unit) ); bool topTargetSpanIsAligned = ( (startE != zeroE) && TargetSpanIsAligned(zeroE,startE-unit) ); if (!topTargetSpanIsAligned && !leftSourceSpanIsAligned) return REO_CLASS_LEFT; HSentenceVertices::const_iterator it; if (//(connectedLeftTop && !connectedRightTop) || ((it = bottomRight.find(startE - unit)) != bottomRight.end() && it->second.find(startF-unit) != it->second.end())) return REO_CLASS_LEFT; if (modelType == REO_MODEL_TYPE_MONO) return REO_CLASS_UNKNOWN; if (//(!connectedLeftTop && connectedRightTop) || ((it = bottomLeft.find(startE - unit)) != bottomLeft.end() && it->second.find(endF + unit) != it->second.end())) return REO_CLASS_RIGHT; if (modelType == REO_MODEL_TYPE_MSD) return REO_CLASS_UNKNOWN; for (int indexF=startF-2*unit; (*ge)(indexF, zeroF); indexF=indexF-unit) { if ((it = bottomRight.find(startE - unit)) != bottomRight.end() && it->second.find(indexF) != it->second.end()) return REO_CLASS_DLEFT; } for (int indexF=endF+2*unit; (*le)(indexF, countF); indexF=indexF+unit) { if ((it = bottomLeft.find(startE - unit)) != bottomLeft.end() && it->second.find(indexF) != it->second.end()) return REO_CLASS_DRIGHT; } return REO_CLASS_UNKNOWN; }
// to be called with countF-1 instead of countF REO_POS getOrientHierModel (SentenceAlignment & sentence, REO_MODEL_TYPE modelType, bool connectedLeftTop, bool connectedRightTop, int startF, int endF, int startE, int endE, int countF, int zero, int unit, bool (*ge)(int, int), bool (*lt)(int, int), const HSentenceVertices & inBottomRight, const HSentenceVertices & inBottomLeft, const HSentenceVertices & outBottomRight, const HSentenceVertices & outBottomLeft, REO_POS phraseOrient) { HSentenceVertices::const_iterator it; if(phraseOrient == LEFT || (connectedLeftTop && !connectedRightTop) || // (startE == 0 && startF == 0) || //(startE == sentence.target.size()-1 && startF == sentence.source.size()-1) || ((it = inBottomRight.find(startE - unit)) != inBottomRight.end() && it->second.find(startF-unit) != it->second.end()) || ((it = outBottomRight.find(startE - unit)) != outBottomRight.end() && it->second.find(startF-unit) != it->second.end())) return LEFT; if(modelType == REO_MONO) return UNKNOWN; if(phraseOrient == RIGHT || (!connectedLeftTop && connectedRightTop) || ((it = inBottomLeft.find(startE - unit)) != inBottomLeft.end() && it->second.find(endF + unit) != it->second.end()) || ((it = outBottomLeft.find(startE - unit)) != outBottomLeft.end() && it->second.find(endF + unit) != it->second.end())) return RIGHT; if(modelType == REO_MSD) return UNKNOWN; if(phraseOrient != UNKNOWN) return phraseOrient; connectedLeftTop = false; for(int indexF=startF-2*unit; (*ge)(indexF, zero) && !connectedLeftTop; indexF=indexF-unit) { if((connectedLeftTop = (it = inBottomRight.find(startE - unit)) != inBottomRight.end() && it->second.find(indexF) != it->second.end()) || (connectedLeftTop = (it = outBottomRight.find(startE - unit)) != outBottomRight.end() && it->second.find(indexF) != it->second.end())) return DRIGHT; } connectedRightTop = false; for(int indexF=endF+2*unit; (*lt)(indexF, countF) && !connectedRightTop; indexF=indexF+unit) { if((connectedRightTop = (it = inBottomLeft.find(startE - unit)) != inBottomRight.end() && it->second.find(indexF) != it->second.end()) || (connectedRightTop = (it = outBottomLeft.find(startE - unit)) != outBottomRight.end() && it->second.find(indexF) != it->second.end())) return DLEFT; } return UNKNOWN; }