All files / lapack/base/dlaqr1/lib dlaqr1.js

100% Statements 91/91
100% Branches 12/12
100% Functions 1/1
100% Lines 91/91

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 922x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 28x 28x 28x 28x 28x 13x 13x 28x 3x 3x 28x 4x 4x 28x 4x 4x 4x 4x 4x 4x 8x 28x 2x 2x 2x 2x 2x  
/**
* @license Apache-2.0
*
* Copyright (c) 2025 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var isLayout = require( '@stdlib/blas/base/assert/is-layout' );
var isRowMajor = require( '@stdlib/ndarray/base/assert/is-row-major-string' );
var isColumnMajor = require( '@stdlib/ndarray/base/assert/is-column-major-string' );
var max = require( '@stdlib/math/base/special/max' );
var format = require( '@stdlib/string/format' );
var base = require( './base.js' );
 
 
// MAIN //
 
/**
* Computes the scalar multiple of the first column of `K` where `K = (H - Z1)*(H - Z2)` for a 2-by-2 or a 3-by-3 matrix `H` and where `Z1 = z1*I`, `Z2 = z2*I`, `z1 = a + bi`, `z2 = c + di`, and `I` is the identity matrix.
*
* ## Notes
*
* -   It is expected that either `sr1 = sr2` and `si1 + si2 = 0` or `si1 = si2 = 0` (i.e., they represent complex conjugate values).
* -   This is useful for starting double implicit shift bulges in the QR algorithm.
* -   `V` should have at least `N` indexed elements.
*
* @param {string} order - storage layout
* @param {PositiveInteger} N - number of row/columns in `H`
* @param {Float64Array} H - input matrix
* @param {PositiveInteger} LDH - stride of the first dimension of `H` (a.k.a., leading dimension of the matrix `H`)
* @param {number} sr1 - real part of the first conjugate complex shift
* @param {number} si1 - imaginary part of the first conjugate complex shift
* @param {number} sr2 - real part of the second conjugate complex shift
* @param {number} si2 - imaginary part of the second conjugate complex shift
* @param {Float64Array} V - output array
* @throws {RangeError} second argument must be either 2 or 3
* @throws {TypeError} first argument must be a valid order
* @throws {RangeError} fourth argument must be greater than or equal to max(1,N)
* @returns {Float64Array} `V`
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
*
* var H = new Float64Array( [ 1.0, 3.0, 2.0, 2.0, 4.0, 6.0, 0.0, 5.0, 7.0 ] ); // => [ [ 1.0, 3.0, 2.0 ], [ 2.0, 4.0, 6.0 ], [ 0.0, 5.0, 7.0 ] ]
* var V = new Float64Array( 3 );
*
* var out = dlaqr1( 'row-major', 3, H, 3, 1.5, 0.0, 2.5, 0.0, V );
* // returns <Float64Array>[ ~1.93, ~0.57, ~2.86 ]
*/
function dlaqr1( order, N, H, LDH, sr1, si1, sr2, si2, V ) {
	var sh1;
	var sh2;
 
	if ( !isLayout( order ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ) );
	}
	if ( isRowMajor( order ) && LDH < max( 1, N ) ) {
		throw new RangeError( format( 'invalid argument. Fourth argument must be greater than or equal to max(1,%d). Value: `%d`.', N, LDH ) );
	}
	if ( N !== 2 && N !== 3 ) {
		throw new RangeError( format( 'invalid argument. Second argument must be either %d or %d. Value: `%d`.', 2, 3, N ) );
	}
	if ( isColumnMajor( order ) ) {
		sh1 = 1;
		sh2 = LDH;
	} else { // order === 'row-major'
		sh1 = LDH;
		sh2 = 1;
	}
	return base( N, H, sh1, sh2, 0, sr1, si1, sr2, si2, V, 1, 0 );
}
 
 
// EXPORTS //
 
module.exports = dlaqr1;