void run_func();
void prepare_to_validation( int test_case_idx );
CvScalar alpha;
+ bool test_nd;
};
CxCore_ScaleAddTest::CxCore_ScaleAddTest() :
CxCore_MatrixTest( "matrix-scaleadd", "cvScaleAdd", 3, 1, false, false, 4 )
{
alpha = cvScalarAll(0);
+ test_nd = false;
}
CxCore_MatrixTest::get_test_array_types_and_sizes( test_case_idx, sizes, types );
sizes[INPUT][2] = cvSize(1,1);
types[INPUT][2] &= CV_MAT_DEPTH_MASK;
+ test_nd = cvTsRandInt(ts->get_rng()) % 2 != 0;
}
int code = CxCore_MatrixTest::prepare_test_case( test_case_idx );
if( code > 0 )
alpha = cvGet1D( &test_mat[INPUT][2], 0 );
+ if( test_nd )
+ alpha.val[1] = 0;
return code;
}
void CxCore_ScaleAddTest::run_func()
{
- cvScaleAdd( test_array[INPUT][0], alpha, test_array[INPUT][1], test_array[OUTPUT][0] );
+ if(!test_nd)
+ cvScaleAdd( test_array[INPUT][0], alpha, test_array[INPUT][1], test_array[OUTPUT][0] );
+ else
+ {
+ cv::MatND c = cv::cvarrToMatND(test_array[OUTPUT][0]);
+ cv::scaleAdd( cv::cvarrToMatND(test_array[INPUT][0]), alpha.val[0],
+ cv::cvarrToMatND(test_array[INPUT][1]), c);
+ }
}
void CxCore_InvertTest::get_minmax_bounds( int /*i*/, int /*j*/, int /*type*/, CvScalar* low, CvScalar* high )
{
- *low = cvScalarAll(-2.);
- *high = cvScalarAll(2.);
+ *low = cvScalarAll(-1.);
+ *high = cvScalarAll(1.);
}
}
-static double cvTsSVDet( CvMat* mat )
+static double cvTsSVDet( CvMat* mat, double* ratio )
{
int type = CV_MAT_TYPE(mat->type);
int i, nm = MIN( mat->rows, mat->cols );
{
for( i = 0; i < nm; i++ )
det *= w->data.fl[i];
+ *ratio = w->data.fl[nm-1] < FLT_EPSILON ? FLT_MAX : w->data.fl[0]/w->data.fl[nm-1];
}
else
{
for( i = 0; i < nm; i++ )
det *= w->data.db[i];
+ *ratio = w->data.db[nm-1] < FLT_EPSILON ? DBL_MAX : w->data.db[0]/w->data.db[nm-1];
}
cvReleaseMat( &w );
void CxCore_InvertTest::prepare_to_validation( int )
{
CvMat* input = &test_mat[INPUT][0];
- double det = cvTsSVDet( input );
+ double ratio = 0, det = cvTsSVDet( input, &ratio );
double threshold = (CV_MAT_DEPTH(input->type) == CV_32F ? FLT_EPSILON : DBL_EPSILON)*500;
+ double rthreshold = CV_MAT_DEPTH(input->type) == CV_32F ? 1e6 : 1e12;
if( CV_MAT_TYPE(input->type) == CV_32FC1 )
cvTsConvert( input, &test_mat[TEMP][1] );
cvTsCopy( input, &test_mat[TEMP][1], 0 );
if( (method == CV_LU && result == 0) ||
- (det < threshold || result < threshold) )
+ det < threshold ||
+ (method == CV_LU && ratio > rthreshold) ||
+ (method == CV_SVD && result < threshold) )
{
cvTsZero( &test_mat[OUTPUT][0] );
cvTsZero( &test_mat[REF_OUTPUT][0] );
void CxCore_SolveTest::get_minmax_bounds( int /*i*/, int /*j*/, int /*type*/, CvScalar* low, CvScalar* high )
{
- *low = cvScalarAll(-2.);
- *high = cvScalarAll(2.);
+ *low = cvScalarAll(-1.);
+ *high = cvScalarAll(1.);
}
double CxCore_SolveTest::get_success_error_level( int /*test_case_idx*/, int, int )
{
- return CV_MAT_DEPTH(cvGetElemType(test_array[OUTPUT][0])) == CV_32F ? 3e-2 : 1e-8;
+ return CV_MAT_DEPTH(cvGetElemType(test_array[OUTPUT][0])) == CV_32F ? 1e-2 : 1e-8;
}
{
//int rank = test_mat[REF_OUTPUT][0].rows;
CvMat* dst;
+ CvMat* input = &test_mat[INPUT][0];
- if( method == CV_LU && result == 0 )
+ if( method == CV_LU )
{
- if( CV_MAT_TYPE(test_mat[INPUT][0].type) == CV_32FC1 )
- cvTsConvert( &test_mat[INPUT][0], &test_mat[TEMP][1] );
- else
- cvTsCopy( &test_mat[INPUT][0], &test_mat[TEMP][1], 0 );
+ if( result == 0 )
+ {
+ if( CV_MAT_TYPE(input->type) == CV_32FC1 )
+ cvTsConvert( input, &test_mat[TEMP][1] );
+ else
+ cvTsCopy( input, &test_mat[TEMP][1], 0 );
- cvTsZero( &test_mat[OUTPUT][0] );
- double det = cvTsLU( &test_mat[TEMP][1], 0, 0 );
- cvTsAdd( 0, cvScalarAll(0.), 0, cvScalarAll(0.), cvScalarAll(det != 0),
- &test_mat[REF_OUTPUT][0], 0 );
- return;
+ cvTsZero( &test_mat[OUTPUT][0] );
+ double det = cvTsLU( &test_mat[TEMP][1], 0, 0 );
+ cvTsAdd( 0, cvScalarAll(0.), 0, cvScalarAll(0.), cvScalarAll(det != 0),
+ &test_mat[REF_OUTPUT][0], 0 );
+ return;
+ }
+
+ double threshold = (CV_MAT_DEPTH(input->type) == CV_32F ? FLT_EPSILON : DBL_EPSILON)*500;
+ double rthreshold = CV_MAT_DEPTH(input->type) == CV_32F ? 1e6 : 1e12;
+ double ratio = 0, det = cvTsSVDet( input, &ratio );
+ if( det < threshold || ratio > rthreshold )
+ {
+ cvTsZero( &test_mat[OUTPUT][0] );
+ cvTsZero( &test_mat[REF_OUTPUT][0] );
+ return;
+ }
}
+
- dst = test_mat[INPUT][0].rows <= test_mat[INPUT][0].cols ? &test_mat[OUTPUT][0] : &test_mat[INPUT][1];
+ dst = input->rows <= input->cols ? &test_mat[OUTPUT][0] : &test_mat[INPUT][1];
- cvTsGEMM( &test_mat[INPUT][0], &test_mat[TEMP][0], 1., &test_mat[INPUT][1], -1., dst, 0 );
+ cvTsGEMM( input, &test_mat[TEMP][0], 1., &test_mat[INPUT][1], -1., dst, 0 );
if( dst != &test_mat[OUTPUT][0] )
- cvTsGEMM( &test_mat[INPUT][0], dst, 1., 0, 0., &test_mat[OUTPUT][0], CV_GEMM_A_T );
+ cvTsGEMM( input, dst, 1., 0, 0., &test_mat[OUTPUT][0], CV_GEMM_A_T );
cvTsZero( &test_mat[REF_OUTPUT][0] );
}