17 using namespace shogun;
49 SG_ERROR(
"void glpkwrapper::setup(const int32_tnumkernels): input "
59 SG_ERROR(
"MKLMulticlassGradient::set_mkl_norm(float64_t norm) : parameter pnorm<1")
75 double pi4=3.151265358979238/2;
85 for(int32_t k=0; k< i+1 ;++k)
87 weights[k]*=cos( std::min(std::max(0.0,gammas[i]),pi4) );
89 weights[i+1]=sin( std::min(std::max(0.0,gammas[i]),pi4) );
96 weights[i]=pow(weights[i],2.0/
pnorm);
105 double pi4=3.151265358979238/2;
108 std::fill(gammagradient.begin(),gammagradient.end(),0.0);
117 for(int32_t k=0; k< std::min(i+1,dim+2) ;++k)
119 gammagradient[k]*=pow( cos( std::min(std::max(0.0,gammas[i]),pi4) ), 2.0/
pnorm) ;
122 gammagradient[i+1]=pow( sin( std::min(std::max(0.0,gammas[i]),pi4) ),2.0/
pnorm);
127 for(int32_t k=0; k< i+1 ;++k)
129 gammagradient[k]*= pow( cos( std::min(std::max(0.0,gammas[i]),pi4) ), 2.0/
pnorm-1.0)*(-1)*sin( std::min(std::max(0.0,gammas[i]),pi4) );
131 gammagradient[i+1]=pow( sin( std::min(std::max(0.0,gammas[i]),pi4) ),2.0/
pnorm-1)*cos( std::min(std::max(0.0,gammas[i]),pi4) );
158 int32_t maxhalfiter=20;
159 int32_t totaliters=6;
162 std::vector<float64_t> finalgamma,curgamma;
165 if(oldweights.empty())
167 std::fill(curgamma.begin(),curgamma.end(),pi4/2);
175 tmpbeta[i]=pow(oldweights[i],
pnorm/2);
180 curgamma[i-1]=asin(tmpbeta[i]);
184 if( cos(curgamma[i])<=0)
186 SG_SINFO(
"linesearch(...): at i %d cos(curgamma[i-1])<=0 %f\n",i, cos(curgamma[i-1]))
193 if(cos(curgamma[i-1])>0)
195 tmpbeta[k]/=cos(curgamma[i-1]);
198 SG_SINFO(
"linesearch(...): at k %d tmpbeta[k]>1 %f\n",k, tmpbeta[k])
200 tmpbeta[k]=std::min(1.0,std::max(0.0, tmpbeta[k]));
206 for(
size_t i=0;i<curgamma.size();++i)
208 SG_SINFO(
"linesearch(...): curgamma[i] %f\n",curgamma[i])
217 std::vector<float64_t> curbeta;
222 SG_SINFO(
"linesearch(...): objectives at i %f\n",minval)
226 SG_SINFO(
"linesearch(...): objectives at i %f\n",tmpval)
235 std::vector<float64_t> curgrad;
238 ::std::vector<float64_t> gammagradient;
240 curgrad.push_back(
objectives(gammagradient, minind));
243 std::vector<float64_t> maxalphas(numkernels-1,0);
245 for(int32_t i=0; i< numkernels-1 ;++i)
247 maxgrad=std::max(maxgrad,fabs(curgrad[i]) );
250 maxalphas[i]=(0-curgamma[i])/curgrad[i];
252 else if(curgrad[i]>0)
254 maxalphas[i]=(pi4-curgamma[i])/curgrad[i];
258 maxalphas[i]=1024*1024;
263 for(int32_t i=1; i< numkernels-1 ;++i)
265 maxalpha=std::min(maxalpha,maxalphas[i]);
268 if((maxalpha>1024*1023)|| (maxgrad<fingrad))
278 float64_t leftalpha=0, rightalpha=maxalpha, midalpha=(leftalpha+rightalpha)/2;
280 std::vector<float64_t> tmpgamma=curgamma, tmpbeta;
281 for(int32_t i=1; i< numkernels-1 ;++i)
283 tmpgamma[i]=tmpgamma[i]+rightalpha*curgrad[i];
289 curobj=std::min(curobj,
objectives(tmpbeta, i));
293 while((curobj < minval)&&(curhalfiter<maxhalfiter)&&(fabs(curobj/minval-1 ) > maxrelobjdiff ))
296 midalpha=(leftalpha+rightalpha)/2;
299 for(int32_t i=1; i< numkernels-1 ;++i)
301 tmpgamma[i]=tmpgamma[i]+rightalpha*curgrad[i];
307 curobj=std::min(curobj,
objectives(tmpbeta, i));
316 tmpobj=std::max(lobj,robj);
319 for(int32_t i=1; i< numkernels-1 ;++i)
321 tmpgamma[i]=tmpgamma[i]+midalpha*curgrad[i];
327 curobj=std::min(curobj,
objectives(tmpbeta, i));
340 midalpha=(leftalpha+rightalpha)/2;
343 while( fabs(curobj/tmpobj-1 ) > maxrelobjdiff );
348 if(longiters>= totaliters)
357 nor+=pow(finalbeta[i],
pnorm);
361 nor=pow(nor,1.0/
pnorm);
375 int32_t num_kernels=(int)oldweights.size();
376 int32_t nofKernelsGood=num_kernels;
378 finalbeta=oldweights;
380 for( int32_t p=0; p<num_kernels; ++p )
383 if( oldweights[p] >= 0.0 )
393 ASSERT( finalbeta[p] >= 0 )
398 for( int32_t p=0; p<num_kernels; ++p )
403 for( int32_t p=0; p<num_kernels; ++p )
408 for( int32_t p=0; p<num_kernels; ++p )
409 preR +=
CMath::pow( oldweights[p] - finalbeta[p], 2.0 );
415 SG_PRINT(
"MKL-direct: nofKernelsGood = %d\n", nofKernelsGood )
416 SG_PRINT(
"MKL-direct: Z = %e\n", Z )
417 SG_PRINT(
"MKL-direct: eps = %e\n", epsRegul )
418 for( int32_t p=0; p<num_kernels; ++p )
421 SG_PRINT(
"MKL-direct: t[%3d] = %e ( diff = %e = %e - %e )\n", p, t, oldweights[p]-finalbeta[p], oldweights[p], finalbeta[p] )
423 SG_PRINT(
"MKL-direct: preR = %e\n", preR )
426 SG_PRINT(
"MKL-direct: R = %e\n", R )
427 SG_ERROR(
"Assertion R >= 0 failed!\n" )
431 for( int32_t p=0; p<num_kernels; ++p )
435 ASSERT( finalbeta[p] >= 0 )
439 for( int32_t p=0; p<num_kernels; ++p )
442 ASSERT( finalbeta[p] >= 0.0 )
443 if( finalbeta[p] > 1.0 )
451 SG_ERROR(
"MKLMulticlassGradient::computeweights(std::vector<float64_t> & weights2) : parameter pnorm<1")
453 SG_SDEBUG(
"MKLMulticlassGradient::computeweights(...): pnorm %f\n",
pnorm)
455 std::vector<float64_t> initw(weights2);
458 SG_SINFO(
"MKLMulticlassGradient::computeweights(...): newweights \n")
459 for(
size_t i=0;i<weights2.size();++i)