scikit-learn/sklearn/src/cblas/ATL_srefrot.c

171 lines
5.9 KiB
C

/* ---------------------------------------------------------------------
*
* -- Automatically Tuned Linear Algebra Software (ATLAS)
* (C) Copyright 2000 All Rights Reserved
*
* -- ATLAS routine -- Version 3.9.24 -- December 25, 2000
*
* Author : Antoine P. Petitet
* Originally developed at the University of Tennessee,
* Innovative Computing Laboratory, Knoxville TN, 37996-1301, USA.
*
* ---------------------------------------------------------------------
*
* -- Copyright notice and Licensing terms:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions, and the following disclaimer in
* the documentation and/or other materials provided with the distri-
* bution.
* 3. The name of the University, the ATLAS group, or the names of its
* contributors may not be used to endorse or promote products deri-
* ved from this software without specific written permission.
*
* -- Disclaimer:
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
* RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (IN-
* CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ---------------------------------------------------------------------
*/
/*
* Include files
*/
#include "atlas_refmisc.h"
#include "atlas_reflevel1.h"
void ATL_srefrot
(
const int N,
float * X,
const int INCX,
float * Y,
const int INCY,
const float C,
const float S
)
{
/*
* Purpose
* =======
*
* ATL_srefrot applies a plane rotation to the two n-vectors x and y.
* This routine computes:
*
* [ x_i ] [ c s ] [ x_i ]
* [ y_i ] = [ -s c ] [ y_i ] for all i = 1 .. n.
*
* If n <= 0 or if c = 1 and s = 0, this subroutine returns immediately.
*
* Arguments
* =========
*
* N (input) const int
* On entry, N specifies the length of the vector x. N must be
* at least zero. Unchanged on exit.
*
* X (input/output) float *
* On entry, X points to the first entry to be accessed of an
* incremented array of size equal to or greater than
* ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof( float ),
* that contains the vector x. On exit, the entries of the in-
* cremented array X are rotated with the entries of the incre-
* mented array Y.
*
* INCX (input) const int
* On entry, INCX specifies the increment for the elements of X.
* INCX must not be zero. Unchanged on exit.
*
* Y (input/output) float *
* On entry, Y points to the first entry to be accessed of an
* incremented array of size equal to or greater than
* ( 1 + ( n - 1 ) * abs( INCY ) ) * sizeof( float ),
* that contains the vector y. On exit, the entries of the in-
* cremented array Y are rotated with the entries of the incre-
* mented array X.
*
* INCY (input) const int
* On entry, INCY specifies the increment for the elements of Y.
* INCY must not be zero. Unchanged on exit.
*
* C (input) const float
* On entry, C specifies the scalar c definiting the plane rota-
* tion. Unchanged on exit.
*
* S (input) const float
* On entry, S specifies the scalar s definiting the plane rota-
* tion. Unchanged on exit.
*
* ---------------------------------------------------------------------
*/
/*
* .. Local Variables ..
*/
register float x0, x1, x2, x3, y0, y1, y2, y3;
register const float co = C, si = S;
float * StX;
register int i;
int nu;
const int incX2 = 2 * INCX, incY2 = 2 * INCY,
incX3 = 3 * INCX, incY3 = 3 * INCY,
incX4 = 4 * INCX, incY4 = 4 * INCY;
/* ..
* .. Executable Statements ..
*
*/
if( ( N > 0 ) && !Msone( co, si ) )
{
if( ( nu = ( N >> 2 ) << 2 ) != 0 )
{
StX = (float *)X + nu * INCX;
do
{
x0 = (*X); y0 = (*Y);
x1 = X[INCX ]; y1 = Y[INCY ];
x2 = X[incX2]; y2 = Y[incY2];
x3 = X[incX3]; y3 = Y[incY3];
*X = co * x0 + si * y0; *Y = co * y0 - si * x0;
X[INCX ] = co * x1 + si * y1; Y[INCY ] = co * y1 - si * x1;
X[incX2] = co * x2 + si * y2; Y[incY2] = co * y2 - si * x2;
X[incX3] = co * x3 + si * y3; Y[incY3] = co * y3 - si * x3;
X += incX4;
Y += incY4;
} while( X != StX );
}
for( i = N - nu; i != 0; i-- )
{
x0 = (*X);
y0 = (*Y);
*X = co * x0 + si * y0;
*Y = co * y0 - si * x0;
X += INCX;
Y += INCY;
}
}
/*
* End of ATL_srefrot
*/
}