807 LDEBUG <<
"creating compound tense for " << auxVertex <<
" and " << pastPartVertex;
810 if (m_macroAccessor->
empty(m_macro) || m_microAccessor->
empty(m_micro))
813 LDEBUG <<
"CreateCompoundTense: false because macro="
814 << m_macro <<
" and micro=" << m_micro;
819 auto syntacticData = std::dynamic_pointer_cast<SyntacticData>(analysis.
getData(
"SyntacticData"));
820 auto metadata = std::dynamic_pointer_cast<LinguisticMetaData>(analysis.
getData(
"LinguisticMetaData"));
821 auto annotationData = std::dynamic_pointer_cast< AnnotationData >(analysis.
getData(
"AnnotationData"));
822 if (annotationData==0)
836 Token* tokenAux = tokenMap[auxVertex];
837 Token* tokenPastPart = tokenMap[pastPartVertex];
839 if (dataAux->empty())
842 LERROR <<
"CreateCompoundTense::operator() morphosyntactic data is empty for aux. Abort.";
846 if (dataPastPart->empty())
849 LERROR <<
"CreateCompoundTense::operator() morphosyntactic data is empty for past participle. Abort.";
852 auto dataAuxMicro = dataAux->
firstValue(*m_microAccessor);
853 if (dataAuxMicro != m_micro)
856 LWARN <<
"CreateCompoundTense: false because expected micro="
857 << m_micro <<
" and actual micro=" << dataAuxMicro;
861 auto dataAuxTime = dataAux->
firstValue(*m_timeAccessor);
862 if (dataAuxTime != m_tense)
865 LWARN <<
"CreateCompoundTense: false because expected tense="
866 << m_tense <<
" and actual tense=" << dataAuxTime;
871 LDEBUG <<
"Tense = '" << tense <<
"' ";
877 StringsPoolIndex verbLemma = *((dataPastPart->
allLemma()).begin());
888 tokenNewVerb->
setStatus(tokenMap[auxVertex]->status());
893 syntacticData->ownedTokens().push_back(tokenNewVerb);
898 LDEBUG <<
"Creating a DicoWord: " << m_macro <<
" / " << verbFlex <<
" / " << m_micro <<
" / " << verbLemma;
904 syntacticData->ownedMorphosyntacticData().push_back(dataNewVerb);
907 elem.
lemma = verbLemma;
917 dataNewVerb->push_back(elem);
923 std::tie (newVertex, newDepVertex) = syntacticData->addVertex();
925 LDEBUG <<
"New vertices are " << newVertex <<
" (pos) and " << newDepVertex <<
" (dep)";
928 tokenMap[newVertex] = tokenNewVerb;
929 dataMap[newVertex] = dataNewVerb;
936 std::set< uint64_t> auxChainsIds;
937 VertexChainIdProp::iterator auxChainsIt, auxChainsIt_end;
938 auxChainsIt = auxChains.begin(); auxChainsIt_end = auxChains.end();
939 for (; auxChainsIt != auxChainsIt_end; auxChainsIt++)
940 auxChainsIds.insert((*auxChainsIt).chainId());
941 std::set< uint64_t > pastPartChainsIds;
942 VertexChainIdProp::iterator pastPartChainsIt, pastPartChainsIt_end;
943 pastPartChainsIt = pastPartChains.begin(); pastPartChainsIt_end = pastPartChains.end();
944 for (; pastPartChainsIt != pastPartChainsIt_end; pastPartChainsIt++)
945 pastPartChainsIds.insert((*pastPartChainsIt).chainId());
946 std::set< uint64_t > newVerbChainsIds;
947 std::set_intersection(
948 auxChainsIds.begin(), auxChainsIds.end(),
949 pastPartChainsIds.begin(), pastPartChainsIds.end(),
950 std::insert_iterator< std::set< uint64_t > >(newVerbChainsIds, newVerbChainsIds.end()));
952 std::set< LinguisticAnalysisStructure::ChainIdStruct > newVerbChains;
953 auxChainsIt = auxChains.begin(); auxChainsIt_end = auxChains.end();
954 for (; auxChainsIt != auxChainsIt_end; auxChainsIt++)
956 if ( newVerbChainsIds.find( (*auxChainsIt).chainId() ) != newVerbChainsIds.end() )
958 newVerbChains.insert(*auxChainsIt);
962 chainsIdsMap[auxVertex] = newVerbChains;
963 chainsIdsMap[pastPartVertex] = newVerbChains;
964 chainsIdsMap[newVertex] = newVerbChains;
968 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > > edgesToRemove;
971 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > > addedEdges;
975 LDEBUG <<
"The auxiliary has " << in_degree(auxVertex, *graph) <<
" in edges.";
978 std::tie(auxInEdgesIt, auxInEdgesIt_end) = in_edges(auxVertex, *graph);
979 for (; auxInEdgesIt != auxInEdgesIt_end; auxInEdgesIt++)
982 LDEBUG <<
"auxInEdge: " << source(*auxInEdgesIt, *graph) <<
" -> " << target(*auxInEdgesIt, *graph);
985 if (addedEdges.find(std::make_pair(auxInVertex,newVertex)) != addedEdges.end())
991 LDEBUG <<
"edge to add (step1): " << auxInVertex <<
" -> " << newVertex;
993 edgesToRemove.insert(std::make_pair(source(*auxInEdgesIt,*graph),target(*auxInEdgesIt,*graph)));
994 addedEdges.insert(std::make_pair(auxInVertex,newVertex));
999 std::tie(auxOutEdgesIt, auxOutEdgesIt_end) = out_edges(auxVertex, *graph);
1000 for (; auxOutEdgesIt != auxOutEdgesIt_end; auxOutEdgesIt++)
1003 if (auxOutVertex == pastPartVertex)
continue;
1004 chainsIdsMap[auxOutVertex] = newVerbChains;
1005 if (addedEdges.find(std::make_pair(newVertex,auxOutVertex)) != addedEdges.end())
1016 LDEBUG <<
"edge to add (step2): " << newVertex <<
" -> " << auxOutVertex;
1018 edgesToRemove.insert(std::make_pair(source(*auxOutEdgesIt,*graph),target(*auxOutEdgesIt,*graph)));
1019 addedEdges.insert(std::make_pair(newVertex,auxOutVertex));
1028 std::tie(pastPartInEdgesIt, pastPartInEdgesIt_end) = in_edges(pastPartVertex, *graph);
1029 for (; pastPartInEdgesIt != pastPartInEdgesIt_end; pastPartInEdgesIt++)
1032 if (pastPartInVertex == auxVertex)
1035 LDEBUG <<
"no vertex between past participle and auxiliary";
1037 pastPartInVertex = newVertex;
1041 LDEBUG <<
"past participle in vertex " << pastPartInVertex;
1043 edgesToRemove.insert(std::make_pair(source(*pastPartInEdgesIt,*graph),target(*pastPartInEdgesIt,*graph)));
1046 std::tie(pastPartOutEdgesIt, pastPartOutEdgesIt_end) = out_edges(pastPartVertex, *graph);
1047 for (; pastPartOutEdgesIt != pastPartOutEdgesIt_end; pastPartOutEdgesIt++)
1051 LDEBUG <<
"past participle out vertex " << pastPartOutVertex;
1054 chainsIdsMap[pastPartInVertex] = newVerbChains;
1055 if (addedEdges.find(std::make_pair(pastPartInVertex,pastPartOutVertex)) != addedEdges.end())
1066 LDEBUG <<
"edge to add (step3): " << pastPartInVertex <<
" -> " << pastPartOutVertex;
1068 edgesToRemove.insert(std::make_pair(source(*pastPartOutEdgesIt,*graph),target(*pastPartOutEdgesIt,*graph)));
1069 addedEdges.insert(std::make_pair(pastPartInVertex,pastPartOutVertex));
1074 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > >::const_iterator
1075 edgesToRemoveIt, edgesToRemoveIt_end;
1076 edgesToRemoveIt = edgesToRemove.begin();
1077 edgesToRemoveIt_end = edgesToRemove.end();
1078 for (; edgesToRemoveIt != edgesToRemoveIt_end; edgesToRemoveIt++)
1081 LDEBUG <<
"remove edge " << (*edgesToRemoveIt).first <<
" -> " << (*edgesToRemoveIt).second;
1083 remove_edge( (*edgesToRemoveIt).first, (*edgesToRemoveIt).second,*graph);
1086 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > >::const_iterator addedEdgesIt, addedEdgesIt_end;
1087 addedEdgesIt = addedEdges.begin(); addedEdgesIt_end = addedEdges.end();
1088 for (; addedEdgesIt != addedEdgesIt_end; addedEdgesIt++)
1092 std::tie(e, success) = add_edge(addedEdgesIt->first, addedEdgesIt->second, *graph);
1096 LDEBUG <<
"edge added : " << e.m_source <<
" -> " << e.m_target;
1102 LERROR <<
"could not add edge : " << addedEdgesIt->first <<
" -> " << addedEdgesIt->second;
1112 syntacticData-> depVertexForTokenVertex(auxVertex);
1114 std::tie(auxDepVertexInEdgeIt, auxDepVertexInEdgeIt_end) =
1115 in_edges(auxDepVertex,depGraph);
1116 for (; auxDepVertexInEdgeIt != auxDepVertexInEdgeIt_end;
1117 auxDepVertexInEdgeIt++)
1121 std::tie(e, success) = add_edge(source(*auxDepVertexInEdgeIt,depGraph),newDepVertex,depGraph);
1125 LDEBUG <<
"edge added : " << e.m_source <<
" -> " << e.m_target;
1127 edgeTypeMap[e] = edgeTypeMap[*auxDepVertexInEdgeIt];
1131 std::tie(auxDepVertexOutEdgeIt, auxDepVertexOutEdgeIt_end) =
1132 out_edges(auxDepVertex,depGraph);
1133 for (; auxDepVertexOutEdgeIt != auxDepVertexOutEdgeIt_end;
1134 auxDepVertexOutEdgeIt++)
1138 std::tie(e, success) = add_edge(newDepVertex, target(*auxDepVertexOutEdgeIt,depGraph),depGraph);
1142 LDEBUG <<
"edge added : " << e.m_source <<
" -> " << e.m_target;
1144 edgeTypeMap[e] = edgeTypeMap[*auxDepVertexOutEdgeIt];
1147 clear_vertex(auxDepVertex, depGraph);
1150 syntacticData-> depVertexForTokenVertex(pastPartVertex);
1152 std::tie(pastPartDepVertexInEdgeIt, pastPartDepVertexInEdgeIt_end) =
1153 in_edges(pastPartDepVertex,depGraph);
1154 for (; pastPartDepVertexInEdgeIt != pastPartDepVertexInEdgeIt_end;
1155 pastPartDepVertexInEdgeIt++)
1159 std::tie(e, success) =
1160 add_edge(source(*pastPartDepVertexInEdgeIt,depGraph),newDepVertex,depGraph);
1164 LDEBUG <<
"edge added : " << e.m_source <<
" -> " << e.m_target;
1166 edgeTypeMap[e] = edgeTypeMap[*pastPartDepVertexInEdgeIt];
1170 std::tie(pastPartDepVertexOutEdgeIt, pastPartDepVertexOutEdgeIt_end) =
1171 out_edges(pastPartDepVertex,depGraph);
1172 for (; pastPartDepVertexInEdgeIt != pastPartDepVertexInEdgeIt_end;
1173 pastPartDepVertexInEdgeIt++)
1177 std::tie(e, success) =
1178 add_edge(newDepVertex, target(*pastPartDepVertexOutEdgeIt,depGraph),depGraph);
1182 LDEBUG <<
"edge added : " << e.m_source <<
" -> " << e.m_target;
1184 edgeTypeMap[e] = edgeTypeMap[*pastPartDepVertexOutEdgeIt];
1187 clear_vertex(pastPartDepVertex, depGraph);
1194 annotationData->addMatching(
"PosGraph",newVertex,
"annot",agv);
1196 AnnotationGraphVertex annotAuxVertex = *(annotationData->matches(
"PosGraph",auxVertex,
"annot").begin());
1197 AnnotationGraphVertex annotPastPartVertex = *(annotationData->matches(
"PosGraph",pastPartVertex,
"annot").begin());
1202 bool res = syntacticData->relation(auxVertex,
1207 LDEBUG <<
"CreateCompoundTense: " << m_tempCompType << res;
1209 auto recoData = std::dynamic_pointer_cast<RecognizerData>(analysis.
getData(
"RecognizerData"));
1212 recoData = std::make_shared<RecognizerData>();
1213 analysis.
setData(
"RecognizerData", recoData);
1216 LDEBUG <<
"CreateCompoundTense setNextVertex:" << newVertex;
1218 recoData->setNextVertex(newVertex);
1221 LDEBUG <<
"aux vertex "<<auxDepVertex<<
" out edges num: " << out_degree(auxDepVertex, depGraph);
1222 LDEBUG <<
"past part vertex "<<pastPartDepVertex<<
" out edges num: " << out_degree(pastPartDepVertex, depGraph);