Пример #1
0
/****************************************************************************
 Устанавливает или добавляет указанную координатную пару.

 Если координатная пара с таким же, как у toset, индексом координаты,
 присутствует в списке измерений, то просто изменяем ее состояние на
 переданное в toset. В противном случае добавляем координатную пару
 к списку.

 NB: Если кординат типа toset несколько в нашем списке, то будем добавлять.
*****************************************************************************/
void Word_Form::SetState( const GramCoordPair& toset, bool do_add, bool apply_versions )
{
 iversion = seq_iversion++;

 const int ipair = pair.FindOnce(toset.GetCoord());

 if( ipair==UNKNOWN )
  {
   // Так как такой координаты еще нет, то однозначно добавляем.
   pair.push_back(GramCoordEx(toset));
  }
 else
  {
   int ncount=0;
   for( Container::size_type i=0; i<pair.size(); i++ )
    if( pair[i].GetCoord()==toset.GetCoord() )
     ncount++;

   if( ncount>1 || do_add )
    pair.push_back(GramCoordEx(toset));
   else
    pair[ipair].SetState(toset.GetState());
  }

 if( apply_versions )
  for( lem::Container::size_type i=0; i<alt.size(); ++i )
   alt[i]->SetState( toset, do_add );

 return;
}
Пример #2
0
void SG_EntryForm::SaveTxt(
                           OFormatter& txtfile,
                           Grammar &gram,
                           const SG_Entry &entry
                          ) const
{
 const GramClass &c = gram.classes()[ entry.GetClass() ];
 txtfile.printf( "  " );

 for( Container::size_type i=0; i<coords().size(); i++ )
  {
   const GramCoordPair cp = coords()[i];

   if( find( c.attrs(), cp.GetCoord() )!=UNKNOWN )
    continue;

   const GramCoord& c = gram.coords()[cp.GetCoord().GetIndex()];
   const UCString& dim_name = c.GetName()[cp.GetCoord().GetVar()];

   if( !c.states().empty() )
    {
     const UCString &state_name = c.GetStateName(cp.GetState());

     if( c.IsDefState(cp.GetState()) && c.IsHeadState(cp.GetState() ) )
      txtfile.printf(
                     "%us%us%us%us%us ",
                     dim_name.c_str(),
                     sol_get_token(B_COLON).c_str(),
                     sol_get_token(B_OROUNDPAREN).c_str(),
                     state_name.c_str(),
                     sol_get_token(B_CROUNDPAREN).c_str()
                    );
     else
      txtfile.printf(
                     "%us%us%us ",
                     dim_name.c_str(),
                     sol_get_token(B_COLON).c_str(),
                     state_name.c_str()
                    );
    }
   else
    {
     UCString prefix;

     if(!cp.GetState())
      prefix=sol_get_token(B_NEGATIVE);

     txtfile.printf( "%us%us ", prefix.c_str(), dim_name.c_str() );
    }
  }

 txtfile.printf(
                " %us %us %us\n",
                sol_get_token(B_OFIGPAREN).c_str(),
                content->c_str(),
                sol_get_token(B_CFIGPAREN).c_str()
               );
 return;
}
Пример #3
0
// ****************************************************************************
// С учетом весов координат, возвращается суммарный вес соответствующих пар
// ****************************************************************************
int SG_EntryForm::count_matches( const CP_Array& Dim, const lem::MCollect<int>& weight ) const
{
 int count=0;

 const int ndim=CastSizeToInt(Dim.size());

 for( int i=0; i<ndim; i++ )
  {
   const GramCoordPair Pair = Dim[i];
   const GramCoordAdr a1 = Pair.GetCoord();

   bool fixed=false;
   for( Container::size_type j=0; j<dim->size(); j++ )
    {
     const GramCoordPair pair = (*dim)[j];
     const GramCoordAdr a2 = pair.GetCoord();

     if( a1==a2 )
      {
       if( pair.GetState()==ANY_STATE || Pair.GetState()==ANY_STATE )
        {
         fixed=true;
         break;
        }

       if( pair.GetState()==Pair.GetState() )
        {
         fixed=true;
         break;
        }
      }
    }

   if( fixed )
    count+=weight[i];
  }

 return count;
}
Пример #4
0
// *****************************************************************************
// Возвращает число координатных пар, совпадающих у списка формы и Dim.
// Если у списков есть координаты с несовпадающими состояниями, то возвращается
// 0.
// *****************************************************************************
int SG_EntryForm::get_equal_coords( const CP_Array& Dim ) const
{
 int n=0;

 const Container::size_type ndim=Dim.size();

 for( Container::size_type i=0; i<ndim; i++ )
  {
   const GramCoordPair Pair = Dim[i];
   const GramCoordAdr a1 = Pair.GetCoord();

   for( Container::size_type j=0; j<dim->size(); j++ )
    {
     const GramCoordPair pair = (*dim)[j];
     const GramCoordAdr a2 = pair.GetCoord();

     if( a1==a2 )
      {
       if( pair.GetState()==ANY_STATE || Pair.GetState()==ANY_STATE )
        break;

/*
       if( pair.GetState()!=Pair.GetState() )
        // Первое же несовпадение портит весь результат...
        return 0;
       n++; 
*/
       // 15.01.2009 - из-за наличия "многоохватных" координат типа падежа для
       // глаголов или предлогов, будем искать именно совпадения. Несовпадение еще
       // не означает провал поиска.
       if( pair.GetState()==Pair.GetState() )
        n++;
      }
    }
  }

 return n;
}
Пример #5
0
bool SG_EntryForm::does_match( const CP_Array& Dim ) const
{
 const int ndim=CastSizeToInt(Dim.size());

 for( int i=0; i<ndim; i++ )
  {
   const GramCoordPair Pair = Dim[i];
   const GramCoordAdr a1 = Pair.GetCoord();

   bool fixed=false;
   for( Container::size_type j=0; j<dim->size(); j++ )
    {
     const GramCoordPair pair = (*dim)[j];
     const GramCoordAdr a2 = pair.GetCoord();

     if( a1==a2 )
      {
       if( pair.GetState()==ANY_STATE || Pair.GetState()==ANY_STATE )
        {
         fixed=true;
         break;
        }

       if( pair.GetState()==Pair.GetState() )
        {
         fixed=true;
         break;
        }
      }
    }

   if( !fixed )
    return false;
  }

 return true;
}
Пример #6
0
static bool dims_sorter(const GramCoordPair &x, const GramCoordPair &y)
{
    return x.GetCoord().GetIndex() < y.GetCoord().GetIndex();
}