#include <complex>
#include <iostream>
#include "blis.hh"
#include "test.hh"
using namespace blis;
using namespace std;
#define N 16
template< typename T >
void ref_dotc(int64_t n,
T *X,
T *Y,
T *res_ref
)
{
obj_t obj_x;
obj_t obj_y;
obj_t obj_res;
num_t dt;
if(is_same<T, complex<float>>::value)
dt = BLIS_SCOMPLEX;
else if(is_same<T, complex<double>>::value)
dt = BLIS_DCOMPLEX;
bli_obj_create_with_attached_buffer( dt, n, 1, X, 1, n, &obj_x );
bli_obj_create_with_attached_buffer( dt, n, 1, Y, 1, n, &obj_y );
bli_obj_set_conj(BLIS_CONJUGATE,&obj_x);
bli_obj_create_with_attached_buffer( dt, 1, 1, res_ref, 1, 1,&obj_res );
bli_dotv(&obj_x,
&obj_y,
&obj_res );
}
template< typename T >
void test_dotc()
{
T *X, *Y;
int n;
int incx, incy;
T res = 0, res_ref = 0;
n = N;
incx = 1;
incy = 1;
srand (time(NULL));
allocate_init_buffer(X , n , 1);
allocate_init_buffer(Y , n , 1);
#ifdef PRINT
printvector(X, n,(char *) "X");
printvector(Y, n,(char *) "Y");
#endif
res = blis::dotc<T>(
n,
X,
incx,
Y,
incy
);
#ifdef PRINT
cout<< "Dot product \n" << res << "\n";
#endif
ref_dotc(n, X, Y , &res_ref );
#ifdef PRINT
cout<< "Dot product ref\n" << res_ref << "\n";;
#endif
if(res != res_ref )
printf("%s TEST FAIL\n" ,__PRETTY_FUNCTION__);
else
printf("%s TEST PASS\n" , __PRETTY_FUNCTION__);
delete[]( X );
delete[]( Y );
}
int main( int argc, char** argv )
{
test_dotc<complex<float>>( );
test_dotc<complex<double>>( );
return 0;
}