SpecificEntityAnnotation::
SpecificEntityAnnotation(const RecognizerMatch& entity,
                         FsaStringsPool& sp) :
m_head(0),
m_type(entity.getType()),
m_features(entity.features()),
m_string(sp[entity.getString()]),
m_normalizedString(sp[entity.getNormalizedString(sp)]),
m_normalizedForm(0),
m_position(entity.positionBegin()),
m_length(entity.length())
{
  Automaton::EntityFeatures::const_iterator 
    f=entity.features().find(DEFAULT_ATTRIBUTE);
  if (f!=entity.features().end()) {
    m_normalizedForm=sp[boost::any_cast<const LimaString&>((*f).getValue())];
  }

  if (entity.getHead() == 0)
  {
    m_head = entity[0].m_elem.first;
  }
  else
  {
    m_head = entity.getHead();
  }

  m_vertices.reserve(entity.size());

  Automaton::RecognizerMatch::const_iterator it, it_end;
  it = entity.begin(); it_end = entity.end();
  for (; it != it_end; it++)
  {
    if ( (*it).m_elem.second )
    {
      m_vertices.push_back((*it).m_elem.first);
    }
  }
}
void CreateIdiomaticAlternative::removeEdges(
    LinguisticGraph& graph, 
    const RecognizerMatch& match,
    AnalysisContent& analysis) const
{
#ifdef DEBUG_LP
   MORPHOLOGINIT;
   LDEBUG << "IdiomaticAlternatives: removing edges";
#endif
/*  if (first == last)
  {
    LDEBUG << "  first and last are equal => ignoring";
    return;
  }*/
  RecognizerData* recoData=static_cast<RecognizerData*>(analysis.getData("RecognizerData"));
  

  std::set< LinguisticGraphVertex > matchVertices;
  Automaton::RecognizerMatch::const_iterator matchIt, matchIt_end;

  // noeuds eventuellement pendants a verifier
  std::set< LinguisticGraphVertex > verticesToCheck;
  
  matchIt = match.begin();
  matchIt_end = match.end();
  for (; matchIt != matchIt_end; matchIt++)
  {
    matchVertices.insert((*matchIt).m_elem.first);
  }
  
  matchIt = match.begin();
  matchIt_end = match.end();
  // parcours des noeuds du match
  for (; matchIt != matchIt_end; matchIt++)
  {
    LinguisticGraphOutEdgeIt outIt, outIt_end;
    boost::tie (outIt, outIt_end) = boost::out_edges((*matchIt).m_elem.first, graph);
    // pour chaque arc sortant du noeud
    for (; outIt != outIt_end; outIt++)
    {
      // l'arc n'est pas membre du match
      if (matchVertices.find(target(*outIt, graph)) != matchVertices.end())
      {
        // on le stocke comme a supprimer
        recoData->setEdgeToBeRemoved(analysis, *outIt);
        // il va falloir verifier si le noeud cible de l'arc ne se retrouve pas pendant quand on aura supprime l'arc
        verticesToCheck.insert(target(*outIt, graph));
      }
    }

    LinguisticGraphInEdgeIt inIt, inIt_end;
    boost::tie (inIt, inIt_end) = boost::in_edges((*matchIt).m_elem.first, graph);
    // pour chaque arc entrant du noeud
    for (; inIt != inIt_end; inIt++)
    {
      // l'arc n'est pas membre du match
      if (matchVertices.find(source(*inIt, graph)) != matchVertices.end())
      {
        // on le stocke comme a supprimer
        recoData->setEdgeToBeRemoved(analysis, *inIt);
        // il va falloir verifier si le noeud source de l'arc ne se retrouve pas pendant quand on aura supprime l'arc
        verticesToCheck.insert(source(*inIt, graph));
      }
    }
  }
  // suppression des arcs stockes comme a supprimer
  recoData->removeEdges( analysis );

  //verification des noeuds extremites des arcs supprimes
  std::set< LinguisticGraphVertex >::const_iterator verticesToCheckIt, verticesToCheckIt_end;
  verticesToCheckIt = verticesToCheck.begin();
  verticesToCheckIt_end = verticesToCheck.end();
  for (;verticesToCheckIt != verticesToCheckIt_end; verticesToCheckIt++)
  {
    recoData->clearUnreachableVertices(analysis, *verticesToCheckIt);
  }

}