Merge pull request #1745 from alalek:ocl_fix_svm_with_blas

This commit is contained in:
Andrey Pavlenko 2013-11-05 23:48:41 +04:00 committed by OpenCV Buildbot
commit 14b2eed17b
2 changed files with 12 additions and 17 deletions

View File

@ -686,9 +686,6 @@ float CvSVM_OCL::predict(const CvMat* samples, CV_OUT CvMat* results) const
}
#else
// TODO fix it
CV_Error(CV_StsNotImplemented, "This part of code contains mistakes. Install AMD BLAS in order to get a correct result or use CPU version of SVM");
double degree1 = 0.0;
if (params.kernel_type == CvSVM::POLY)
degree1 = params.degree;
@ -813,9 +810,6 @@ bool CvSVMSolver_ocl::solve_generic( CvSVMSolutionInfo& si )
}
#else
// TODO fix it
CV_Error(CV_StsNotImplemented, "This part of code contains mistakes. Install AMD BLAS in order to get a correct result or use CPU version of SVM");
double degree1 = 0.0;
if(params->kernel_type == CvSVM::POLY)
degree1 = params->degree;
@ -1000,13 +994,15 @@ void CvSVMKernel_ocl::calc( int vcount, const int row_idx, Qfloat* results, Mat&
//int j;
(this->*calc_func_ocl)( vcount, row_idx, results, src);
// FIXIT #if defined HAVE_CLAMDBLAS
#if !defined(HAVE_CLAMDBLAS)
// nothing
#else
const Qfloat max_val = (Qfloat)(FLT_MAX * 1e-3);
int j;
for( j = 0; j < vcount; j++ )
if( results[j] > max_val )
results[j] = max_val;
// FIXIT #endif
#endif
}
bool CvSVMKernel_ocl::create( const CvSVMParams* _params, Calc_ocl _calc_func, Calc _calc_func1 )
@ -1078,12 +1074,13 @@ void CvSVMKernel_ocl::calc_poly( int vcount, const int row_idx, Qfloat* results,
{
calc_non_rbf_base( vcount, row_idx, results, src);
//FIXIT #if defined HAVE_CLAMDBLAS
#if !defined(HAVE_CLAMDBLAS)
// nothing
#else
CvMat R = cvMat( 1, vcount, QFLOAT_TYPE, results );
if( vcount > 0 )
cvPow( &R, &R, params->degree );
//FIXIT #endif
#endif
}
@ -1091,7 +1088,9 @@ void CvSVMKernel_ocl::calc_sigmoid( int vcount, const int row_idx, Qfloat* resul
{
calc_non_rbf_base( vcount, row_idx, results, src);
// TODO: speedup this
//FIXIT #if defined HAVE_CLAMDBLAS
#if !defined(HAVE_CLAMDBLAS)
// nothing
#else
for(int j = 0; j < vcount; j++ )
{
Qfloat t = results[j];
@ -1101,7 +1100,7 @@ void CvSVMKernel_ocl::calc_sigmoid( int vcount, const int row_idx, Qfloat* resul
else
results[j] = (Qfloat)((e - 1.) / (e + 1.));
}
//FIXIT #endif
#endif
}
CvSVM_OCL::CvSVM_OCL()

View File

@ -126,8 +126,6 @@ OCL_TEST_P(KNN, Accuracy)
INSTANTIATE_TEST_CASE_P(OCL_ML, KNN, Combine(Values(6, 5), Values(Size(200, 400), Size(300, 600)),
Values(4, 3), Values(false, true)));
#ifdef HAVE_CLAMDBLAS // TODO does not work non-blas version of SVM
////////////////////////////////SVM/////////////////////////////////////////////////
PARAM_TEST_CASE(SVM_OCL, int, int, int)
@ -308,6 +306,4 @@ INSTANTIATE_TEST_CASE_P(OCL_ML, SVM_OCL, testing::Combine(
Values(2, 3, 4)
));
#endif // HAVE_CLAMDBLAS
#endif // HAVE_OPENCL