#include <complex>
#include <iostream>
#include "blis.hh"
#include "test.hh"
using namespace blis;
using namespace std;
template< typename T>
void test_rotmg()
{
T d1, d2, b1, b2;
T d1_ref, d2_ref, b1_ref;
T h[5] = { -999.0f, -999.1f, -999.2f, -999.3f, -999.4f };
T h_ref[5] = {-1.0f, 0.0f, 0.0f, 0.0f,0.0f};
T h_double[5] = { -999.0, -999.1, -999.2, -999.3, -999.4 };
T h_ref_double[5] = { 1, 0, 0, 0};
if(is_same<T , float>::value)
{
d1 = -1630.28519312f;
d2 = 44320.1964703f;
b1 = 1274.7681352f;
b2 = 0.983006912864f;
d1_ref= 0.0f;
d2_ref= 0.0f;
b1_ref= 0.0f;
}else{
d1 = -49.1978123005;
d2 = 0.228703451277;
b1 = 1.8901039144;
b2 = 7081.47754386;
d1_ref= 0;
d2_ref= 0;
b1_ref= 0;
}
#ifdef PRINT
cout<< "Before blis::rotmg \nd1 Value : " << d1 << "\n" ;
cout<< "d2 Value : " << d2 << "\n" ;
cout<< "b1 Value : " << b1 << "\n" ;
printvector(h, 5,(char *) "param");
#endif
if(is_same<T , float>::value)
{
blis::rotmg<T>(
&d1,
&d2,
&b1,
b2,
h
);
}else{
blis::rotmg<T>(
&d1,
&d2,
&b1,
b2,
h_double
);
}
#ifdef PRINT
cout<< "After blis::rotmg \nd1 Value : " << d1 << "\n" ;
cout<< "d2 Value : " << d2 << "\n" ;
cout<< "b1 Value : " << b1 << "\n" ;
printvector(h, 5,(char *) "param");
#endif
#ifdef PRINT
cout<< "Expected Output from blis::rotmg \nd1 Value : " << d1_ref << "\n" ;
cout<< "d2 Value : " << d2_ref << "\n" ;
cout<< "b1 Value : " << b1_ref << "\n" ;
printvector(h_ref, 5,(char *) "param");
#endif
if( (d1 != d1_ref ) || (d2 != d2_ref ) || (b1 != b1_ref ) )
printf("%s TEST FAIL\n" , __PRETTY_FUNCTION__);
else if(is_same<T , float>::value){
if(computeErrorV(1, 1 , 5, h, h_ref )==1)
printf("%s TEST FAIL\n" , __PRETTY_FUNCTION__);
else
printf("%s TEST PASS\n" , __PRETTY_FUNCTION__);
}else if(is_same<T , float>::value){
if(computeErrorV(1, 1 , 5, h_double, h_ref_double )==1)
printf("%s TEST FAIL\n" , __PRETTY_FUNCTION__);
else
printf("%s TEST PASS\n" , __PRETTY_FUNCTION__);
}else
printf("%s TEST PASS\n" , __PRETTY_FUNCTION__);
}
int main( int argc, char** argv )
{
test_rotmg<float>( );
test_rotmg<double>( );
return 0;
}