31#define DEBUG_THIS_FILE true
32#define LOG_ERROR_AND_THROW(msg, exc) { \
33 SENTENCEBOUNDARIESUPDATERLOGINIT; \
38#define LOG_ERROR_AND_EXIT(msg, err_code) { \
39 SENTENCEBOUNDARIESUPDATERLOGINIT; \
46inline string THIS_FILE_LOGGING_CATEGORY()
49 return logger.zone().toStdString();
53#if defined(DEBUG_LP) && defined(DEBUG_THIS_FILE)
54 #define LOG_MESSAGE(stream, msg) { stream << msg; }
55 #define LOG_MESSAGE_WITH_PROLOG(stream, msg) SENTENCEBOUNDARIESUPDATERLOGINIT; LOG_MESSAGE(stream, msg);
57 #define LOG_MESSAGE(stream, msg) ;
58 #define LOG_MESSAGE_WITH_PROLOG(stream, msg) ;
102 m_d->
init(unitConfiguration);
124 auto graph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(m_graphName));
125 if (graph ==
nullptr)
127 LOG_ERROR_AND_EXIT(
"SentenceBoundariesUpdaterPrivate::process graph" << m_graphName <<
"has not been produced: check pipeline",
131 auto sb = std::dynamic_pointer_cast<SegmentationData>(analysis.
getData(m_sbLayerName));
134 LOG_ERROR_AND_EXIT(
"SentenceBoundariesUpdaterPrivate::process segmentation data" << m_sbLayerName <<
"has not been produced: check pipeline",
138 updateBoundaries(*sb, *graph);
146 size_t segmentsMerged = 0;
148 map<LinguisticGraphVertex, vector<Segment>::iterator> lastVerticies;
150 for (
auto it = segments.begin(); it != segments.end(); it++)
153 if (lastVerticies.end() != lastVerticies.find(v))
155 LOG_ERROR_AND_EXIT(
"SentenceBoundariesUpdaterPrivate::updateBoundaries: vertex" << v <<
"mentioned twice as segment's end",
158 lastVerticies[v] = it;
161 list<pair<vector<Segment>::iterator, vector<Segment>::iterator>> segments_to_merge;
162 for (
auto it = segments.begin(); it != segments.end(); it++)
164 set<LinguisticGraphVertex> visited;
165 list<LinguisticGraphVertex> toVisit;
166 toVisit.push_back(it->getFirstVertex());
168 while (!toVisit.empty())
172 visited.insert(currentVertex);
174 auto iter = lastVerticies.find(currentVertex);
175 if (lastVerticies.end() != iter)
177 if (iter->second > it)
180 segments_to_merge.push_back(make_pair(it, iter->second));
184 else if (iter->second == it)
192 if (visited.end() == visited.find(next))
194 toVisit.push_back(next);
200 segments_to_merge.reverse();
201 for (
const pair<vector<Segment>::iterator, vector<Segment>::iterator>& p : segments_to_merge)
203 segmentsMerged += p.second - p.first;
206 p.second->setFirstVertex(p.first->getFirstVertex());
208 for (vector<Segment>::iterator i = p.first; i != p.second; i++)
214 p.second->setLength(p.second->getLength() + c);
217 segments.erase(p.first, p.second);
220 LDEBUG <<
"segmentsMerged==" << segmentsMerged;
221 return segmentsMerged;