136 std::vector<TMVA::SVEvent*>::iterator idIter;
139 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
140 if((*idIter)->GetAlpha()>0)
141 fErrorC_J += (*idIter)->GetAlpha()*(*idIter)->GetTypeFlag()*fKVals[k];
149 if((jevt->
GetIdx() == 1) && (fErrorC_J < fB_up )){
153 else if ((jevt->
GetIdx() == -1)&&(fErrorC_J > fB_low)) {
160 if((jevt->
GetIdx()>=0) && (fB_low - fErrorC_J > 2*fTolerance)) {
165 if((jevt->
GetIdx()<=0) && (fErrorC_J - fB_up > 2*fTolerance)) {
170 if (converged)
return kFALSE;
173 if(fB_low - fErrorC_J > fErrorC_J - fB_up) ievt = fTEventLow;
174 else ievt = fTEventUp;
177 if (TakeStep(ievt, jevt))
return kTRUE;
186 if (ievt == jevt)
return kFALSE;
187 std::vector<TMVA::SVEvent*>::iterator idIter;
194 Float_t newAlpha_I, newAlpha_J;
208 s =
Int_t( type_I * type_J );
216 if (type_I == type_J) {
217 Float_t gamma = alpha_I + alpha_J;
247 Float_t gamma = alpha_I - alpha_J;
250 if ( gamma >= (c_i - c_j) )
257 if ( (c_i - c_j) >= gamma)
265 Float_t kernel_II, kernel_IJ, kernel_JJ;
267 kernel_II = fKMatrix->GetElement(ievt->
GetNs(),ievt->
GetNs());
268 kernel_IJ = fKMatrix->GetElement(ievt->
GetNs(), jevt->
GetNs());
269 kernel_JJ = fKMatrix->GetElement(jevt->
GetNs(),jevt->
GetNs());
271 eta = 2*kernel_IJ - kernel_II - kernel_JJ;
273 newAlpha_J = alpha_J + (type_J*( errorC_J - errorC_I ))/eta;
274 if (newAlpha_J <
l) newAlpha_J =
l;
275 else if (newAlpha_J >
h) newAlpha_J =
h;
282 Float_t c_J = type_J*( errorC_I - errorC_J ) - eta * alpha_J;
283 lobj = c_I *
l *
l + c_J *
l;
284 hobj = c_I *
h *
h + c_J *
h;
286 if (lobj > hobj + epsilon) newAlpha_J =
l;
287 else if (lobj < hobj - epsilon) newAlpha_J =
h;
288 else newAlpha_J = alpha_J;
291 if (
TMath::Abs( newAlpha_J - alpha_J ) < ( epsilon * ( newAlpha_J + alpha_J+ epsilon ))){
295 newAlpha_I = alpha_I - s*( newAlpha_J - alpha_J );
297 if (newAlpha_I < 0) {
298 newAlpha_J += s* newAlpha_I;
301 else if (newAlpha_I > c_i) {
302 Float_t temp = newAlpha_I - c_i;
303 newAlpha_J += s * temp;
307 Float_t dL_I = type_I * ( newAlpha_I - alpha_I );
308 Float_t dL_J = type_J * ( newAlpha_J - alpha_J );
310 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
311 if((*idIter)->GetIdx()==0){
312 Float_t ii = fKMatrix->GetElement(ievt->
GetNs(), (*idIter)->GetNs());
313 Float_t jj = fKMatrix->GetElement(jevt->
GetNs(), (*idIter)->GetNs());
315 (*idIter)->UpdateErrorCache(dL_I * ii + dL_J * jj);
325 ievt->
SetErrorCache(errorC_I + dL_I*kernel_II + dL_J*kernel_IJ);
326 jevt->
SetErrorCache(errorC_J + dL_I*kernel_IJ + dL_J*kernel_JJ);
333 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
334 if((*idIter)->GetIdx()==0){
335 if((*idIter)->GetErrorCache()> fB_low){
336 fB_low = (*idIter)->GetErrorCache();
337 fTEventLow = (*idIter);
339 if( (*idIter)->GetErrorCache()< fB_up){
340 fB_up =(*idIter)->GetErrorCache();
341 fTEventUp = (*idIter);
385 Int_t numChanged = 0;
386 Int_t examineAll = 1;
389 Int_t deltaChanges = 0;
392 std::vector<TMVA::SVEvent*>::iterator idIter;
394 while ((numChanged > 0) || (examineAll > 0)) {
397 for (idIter = fInputData->begin(); idIter!=fInputData->end(); ++idIter){
398 if(!fdoRegression) numChanged += (
UInt_t)ExamineExample(*idIter);
399 else numChanged += (
UInt_t)ExamineExampleReg(*idIter);
403 for (idIter = fInputData->begin(); idIter!=fInputData->end(); ++idIter) {
404 if ((*idIter)->IsInI0()) {
405 if(!fdoRegression) numChanged += (
UInt_t)ExamineExample(*idIter);
406 else numChanged += (
UInt_t)ExamineExampleReg(*idIter);
415 if (examineAll == 1) examineAll = 0;
416 else if (numChanged == 0 || numChanged < 10 || deltaChanges > 3 ) examineAll = 1;
418 if (numChanged == numChangedOld) deltaChanges++;
419 else deltaChanges = 0;
420 numChangedOld = numChanged;
423 if (numit >= nMaxIter) {
425 <<
"Max number of iterations exceeded. "
426 <<
"Training may not be completed. Try use less Cost parameter" <<
Endl;
473 if (ievt == jevt)
return kFALSE;
474 std::vector<TMVA::SVEvent*>::iterator idIter;
475 const Float_t epsilon = 0.001*fTolerance;
482 const Float_t eta = -2*kernel_IJ + kernel_II + kernel_JJ;
488 Bool_t caseA, caseB, caseC, caseD, terminated;
489 caseA = caseB = caseC = caseD = terminated =
kFALSE;
490 Float_t b_alpha_i, b_alpha_j, b_alpha_i_p, b_alpha_j_p;
506 Float_t tmp_alpha_i, tmp_alpha_j;
507 tmp_alpha_i = tmp_alpha_j = 0.;
510 if((caseA ==
kFALSE) && (b_alpha_i > 0 || (b_alpha_i_p == 0 && deltafi > 0)) && (b_alpha_j > 0 || (b_alpha_j_p == 0 && deltafi < 0)))
517 tmp_alpha_j = b_alpha_j - (deltafi/eta);
520 tmp_alpha_i = b_alpha_i - (tmp_alpha_j - b_alpha_j);
523 if( IsDiffSignificant(b_alpha_j,tmp_alpha_j, epsilon) || IsDiffSignificant(b_alpha_i,tmp_alpha_i, epsilon)){
524 b_alpha_j = tmp_alpha_j;
525 b_alpha_i = tmp_alpha_i;
534 else if((caseB==
kFALSE) && (b_alpha_i>0 || (b_alpha_i_p==0 && deltafi >2*epsilon )) && (b_alpha_j_p>0 || (b_alpha_j==0 && deltafi>2*epsilon)))
538 high =
TMath::Min( b_cost_i , b_cost_j + gamma);
542 tmp_alpha_j = b_alpha_j_p - ((deltafi-2*epsilon)/eta);
545 tmp_alpha_i = b_alpha_i - (tmp_alpha_j - b_alpha_j_p);
548 if( IsDiffSignificant(b_alpha_j_p,tmp_alpha_j, epsilon) || IsDiffSignificant(b_alpha_i,tmp_alpha_i, epsilon)){
549 b_alpha_j_p = tmp_alpha_j;
550 b_alpha_i = tmp_alpha_i;
558 else if((caseC==
kFALSE) && (b_alpha_i_p>0 || (b_alpha_i==0 && deltafi < -2*epsilon )) && (b_alpha_j>0 || (b_alpha_j_p==0 && deltafi< -2*epsilon)))
565 tmp_alpha_j = b_alpha_j - ((deltafi+2*epsilon)/eta);
568 tmp_alpha_i = b_alpha_i_p - (tmp_alpha_j - b_alpha_j);
571 if( IsDiffSignificant(b_alpha_j,tmp_alpha_j, epsilon) || IsDiffSignificant(b_alpha_i_p,tmp_alpha_i, epsilon)){
572 b_alpha_j = tmp_alpha_j;
573 b_alpha_i_p = tmp_alpha_i;
581 else if((caseD ==
kFALSE) &&
582 (b_alpha_i_p>0 || (b_alpha_i==0 && deltafi <0 )) &&
583 (b_alpha_j_p>0 || (b_alpha_j==0 && deltafi >0 )))
590 tmp_alpha_j = b_alpha_j_p + (deltafi/eta);
593 tmp_alpha_i = b_alpha_i_p - (tmp_alpha_j - b_alpha_j_p);
595 if( IsDiffSignificant(b_alpha_j_p,tmp_alpha_j, epsilon) || IsDiffSignificant(b_alpha_i_p,tmp_alpha_i, epsilon)){
596 b_alpha_j_p = tmp_alpha_j;
597 b_alpha_i_p = tmp_alpha_i;
611 if( IsDiffSignificant(b_alpha_i, ievt->
GetAlpha(), epsilon) ||
612 IsDiffSignificant(b_alpha_j, jevt->
GetAlpha(), epsilon) ||
613 IsDiffSignificant(b_alpha_i_p, ievt->
GetAlpha_p(), epsilon) ||
614 IsDiffSignificant(b_alpha_j_p, jevt->
GetAlpha_p(), epsilon) ){
622 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
624 if((*idIter)->GetIdx()==0){
625 Float_t k_ii = fKMatrix->GetElement(ievt->
GetNs(), (*idIter)->GetNs());
626 Float_t k_jj = fKMatrix->GetElement(jevt->
GetNs(), (*idIter)->GetNs());
628 (*idIter)->UpdateErrorCache(diff_alpha_i * k_ii + diff_alpha_j * k_jj);
645 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
646 if((!(*idIter)->IsInI3()) && ((*idIter)->GetErrorCache()> fB_low)){
647 fB_low = (*idIter)->GetErrorCache();
648 fTEventLow = (*idIter);
651 if((!(*idIter)->IsInI2()) && ((*idIter)->GetErrorCache()< fB_up)){
652 fB_up =(*idIter)->GetErrorCache();
653 fTEventUp = (*idIter);
674 std::vector<TMVA::SVEvent*>::iterator idIter;
677 for(idIter = fInputData->begin(); idIter != fInputData->end(); ++idIter){
678 fErrorC_J -= (*idIter)->GetDeltaAlpha()*fKVals[k];
686 if(fErrorC_J + feps < fB_up ){
687 fB_up = fErrorC_J + feps;
690 else if(fErrorC_J -feps > fB_low) {
691 fB_low = fErrorC_J - feps;
694 }
else if((jevt->
IsInI2()) && (fErrorC_J + feps > fB_low)){
695 fB_low = fErrorC_J + feps;
697 }
else if((jevt->
IsInI3()) && (fErrorC_J - feps < fB_up)){
698 fB_up = fErrorC_J - feps;
706 if( fB_low -fErrorC_J + feps > 2*fTolerance){
709 if(fErrorC_J-feps-fB_up > fB_low-fErrorC_J+feps){
712 }
else if(fErrorC_J -feps - fB_up > 2*fTolerance){
715 if(fB_low - fErrorC_J+feps > fErrorC_J-feps -fB_up){
723 if( fB_low -fErrorC_J - feps > 2*fTolerance){
726 if(fErrorC_J+feps-fB_up > fB_low-fErrorC_J-feps){
729 }
else if(fErrorC_J + feps - fB_up > 2*fTolerance){
732 if(fB_low - fErrorC_J-feps > fErrorC_J+feps -fB_up){
740 if( fB_low -fErrorC_J - feps > 2*fTolerance){
743 if(fErrorC_J+feps-fB_up > fB_low-fErrorC_J-feps){
746 }
else if(fErrorC_J - feps - fB_up > 2*fTolerance){
749 if(fB_low - fErrorC_J+feps > fErrorC_J-feps -fB_up){
757 if( fErrorC_J + feps -fB_up > 2*fTolerance){
765 if(fB_low -fErrorC_J +feps > 2*fTolerance){
771 if(converged)
return kFALSE;
772 if (TakeStepReg(ievt, jevt))
return kTRUE;