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); }
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; } }