Esempio n. 1
0
void Optim_L1FormLin::SubsetOfFlags(ElFilo<INT> & Subset,INT flag)
{
     Subset.clear();
     for (INT k=0; k<_NbForm ; k++)
         if (flag & (1 << k))
            Subset.pushlast(1);
         else
            Subset.pushlast(0);
     
}
Esempio n. 2
0
void Optim_L1FormLin::CombinConjMinLoc
     (
        ElFilo<REAL>&  dic,
        ElFilo<INT> &  Subset,
        ElFilo<INT> &  FlagPos,
        INT            FlagSubset,
        INT            NbVarPos,
        INT            CurVarPos
     )
{
/*
     show_flag(FlagSubset);
     cout << " " << NbVarPos << " " << CurVarPos 
          << " [N= " << _NbVar << " M = " << _NbForm << "]"
          << "\n";
*/
     

     if (NbVarPos == _NbVar)
     {
        FlagPos.pushlast(FlagSubset);
        SubsetOfFlags(Subset,FlagSubset);
        dic[FlagSubset] = score(Subset);

        return;
     }
     if (CurVarPos == _NbForm)
        return;

     CombinConjMinLoc(dic,Subset,FlagPos,FlagSubset | (1<<CurVarPos),NbVarPos+1,CurVarPos+1);
     CombinConjMinLoc(dic,Subset,FlagPos,FlagSubset                 ,NbVarPos  ,CurVarPos+1);
}
Esempio n. 3
0
template <class T> INT get_best_intexe(const ElFifo<T> & fp,bool EnvConv)
{
   if (! fp.circ())
      return 0;

   if (fp.nb() < 4)
      return 0;


   INT delta = EnvConv ? 1 : std::min(5,(fp.nb()-2)/2);
   REAL min_cos = 10.0;
   INT best_index = 0;

   std::vector<INT> aVOk;
   std::vector<INT> aVPrec;
   std::vector<INT> aVSucc;

   for(INT aK=0 ; aK<INT(fp.size()) ; aK++)
   {
       aVOk.push_back(EnvConv ? 0 : 1);
       aVPrec.push_back(aK-delta);
       aVSucc.push_back(aK+delta);
   }
   if (EnvConv)
   {
      ElFilo<Pt2dr> aFLP;
      for(INT aK=0 ; aK<INT(fp.size()) ; aK++)
         aFLP.pushlast(fp[aK]);
      ElFifo<INT> Ind;
      env_conv(Ind,aFLP,true);
      for (INT aK=0 ; aK<Ind.nb() ; aK++)
      {
          aVOk[Ind[aK]] = 1;
          aVPrec[Ind[aK]] = Ind[(aK-1+Ind.nb())%Ind.nb()];
          aVSucc[Ind[aK]] = Ind[(aK+1)%Ind.nb()];
      }
   }

   for (INT k =0 ; k<fp.nb() ; k++)
   {
       if (aVOk[k])
       {
            T u1 = fp[k]-fp[aVPrec[k]];
            T u2 = fp[aVSucc[k]]-fp[k];
            double d1 = euclid(u1);
            double d2 = euclid(u2);
            if (d1 && d2)
            {
               double cosin = scal(u1,u2) / (d1*d2);
               if (cosin < min_cos)
               {
                  min_cos = cosin; 
                  best_index = k;
               }
            }
       }
   }
   return best_index ;
}
Esempio n. 4
0
void Optim_L1FormLin::CombinConjMinLoc
     (
        ElFilo<REAL>&  dic,
        ElFilo<INT> &  Subset,
        ElFilo<INT> &  FlagPos
     )
{
    CPT ++;
    INT NbF = (1<<_NbForm);
    for (INT k=dic.nb() ;k<NbF ; k++)
        dic.pushlast(1e20);

    FlagPos.clear();

    CombinConjMinLoc(dic,Subset,FlagPos,0,0,0);

    INT NbMin0 =0;
    INT NbMin1 =0;

    REAL M0 = 1e80,M1 = -1e80;

	{
    for (INT k=0 ; k< FlagPos.nb(); k++)
    {


        REAL VN = TestNeighConjMinLoc(FlagPos[k],dic);
        REAL V0 = dic[FlagPos[k]];

        if (V0 < VN)
           NbMin0 ++;
        if (V0 <=  VN)
        {
           NbMin1 ++;
           ElSetMin(M0,V0);
           ElSetMax(M1,V0);
        }

/*
        {
          show_flag(FlagPos[k]);
          cout << " : " << dic[FlagPos[k]];
          if (V0 <= VN) 
             cout << " ** ";
          cout << "\n";
        }
*/
    }
	}

/*
    if ((NbMin0!=1) || (NbMin1!=1))
        cout << NbMin0 << " " << NbMin1 << "\n";
*/

    BENCH_ASSERT(NbMin0 <= 1);
    BENCH_ASSERT(NbMin1 >= 1);

   cout << "MINS = " << M0 << " " << M1 << "\n";
   BENCH_ASSERT(std::abs(M0-M1)<epsilon);


   {
    for (INT k=0 ; k< FlagPos.nb(); k++)
        dic[FlagPos[k]] = 1e20;

   }
}