Security News
New Python Packaging Proposal Aims to Solve Phantom Dependency Problem with SBOMs
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Javascript Pure Implementation of BLAS Level 1, level 2, level 3 functions
This is a 100% Pure Javascript ( TypeScript ) re-write of the reference implementation Basic Linear Algebra SubPrograms
(BLAS) numerical library found here.
This is a full manual re-write, "emscripten" was not used.
BLASjs contains all the functions (Complex, Real) of the reference implementation capable for 32 bit
and 64 bit
floating point arithmatic:
The resulting bundled blasjs
file is an agnostic UMD library, it can be used in a web client
as-well as in a server side node environment.
$ npm i blasjs
Usage:
//node
const blas = require('blasjs');
//or typescript
import * as blas from 'blasjs';
The module directory contains a standalone bundle for use in html <script>
insertion. The library assigns window.BLAS
after loading.
<!-- <script src="your_server_url/blasjs.min.js"></script> -->
<!-- this example uses unpkg as CDN -->
<script src="https://unpkg.com/blasjs@latest/dist/lib/blasjs.min.js"></script>
<script>
const blas = window.BLAS; //UMD exposes it as BLAS
//fetch some level3 complex 64 bit precision matrix-matrix operations
const {
level3: { zsyrk, ztrmm, ztrsm }
} = blas;
</script>
fpArray
FortranArr
Type Complex
Matrix
Matrix.prototype.slice
Matrix.prototype.setLower
Matrix.prototype.setUpper
Matrix.prototype.upperBand
Matrix.prototype.lowerBand
Matrix.prototype.real
Matrix.prototype.imaginary
Matrix.prototype.packedUpper
Matrix.prototype.packedLower
Matrix.prototype.toArr
H
FORTRAN language can instrinsicly work with non-zero based multidimensional arrays and complex numbers. Below are some examples from FORTRAN that have no Javascript counterpart. The reference implementation of BLAS functions expect inputs of these types.
The FORTRAN complex scalar, complex array and complex "Matrix"
! double precision Complex number
COMPLEX*16 alpha
!
! double precision Complex array with offset 2
COMPLEX*16 vector(2,10)
!
! double precision complex MultiDimensional Array (matrix)
! rows 1 to 5 , columns 1 to 10
COMPLEX*16 A(1:5,1:10)
To work with the concept of non-zero based arrays and complex numbers in JS,
these FORTRAN constructs have equivalents in the blasjs
library.
The blasjs
helpers to create complex scalar, complex array and complex "Matrix" objects
const blas = require('blasjs');
const {
helper:{
/* create complex Object from 2 real numbers */
complex,
/* create single precision Real/complex arrays, */
fortranArrComplex32,
/* create double precision Real/Complex arrays */
fortranArrComplex64,
/* create single precision 2 dimensional Real/Complex arrays */
fortranMatrixComplex32,
/* Double precision 2 dimensional Real/Complex arrays */
fortranMatrixComplex64,
}
} = blas;
These functions are extensively documented in the helper functions. It is recommended you read this introductory part of the documentation first. before anything else.
blasjs
uses "FORTRAN like" complex number 32/64 bit precision multidimensional complex/real data.
These helper functions have been designed to significantly ease the use of working with these
data types in JavaScript.
Typescript types/interfaces to mimic FORTRAN native (complex) multidimensional arrays.
fpArray
Wraps JS types Float32Array and Float64Array into a single type.
decl:
export type fpArray = Float32Array | Float64Array;
FortranArr
Abstraction of a 1 dimensional single/double precision complex/real FORTRAN array.
Used by level 1 and level 2 blasjs
functions.
FortranArr
objects should be created by the fortranArrComplex32
and fortranArrComplex64
helper functions.
decl:
export declare type FortranArr = {
base: number;
r: fpArray;
i?: fpArray;
s: (index: number) => (re?: number, im?: number) => number | Complex;
toArr: () => Complex[] | number[];
};
fields:
base
: fortran by default has a 1-value based array. Mimiced by this property.r
: See decl fpArray. The Real part of complex array.i
: (optional). See decl fpArray. The Imaginary part of the complex array.s
: set, get values of the array. Uses FORTRAN style array indexes taking the value of base
into account.toArr
generates an JavaScript array from the r
and i
(optional) data.Usage:
const blas = require('blasjs');
const { helper: { fortranArrComplex64 } } = blas;
// You can also use the helper "complex" or "muxComplex"
// to generate JS complex arrays
const complexDataArr = [
{ re: 1.8, im: -0.2 },
{ re: 2.3, im: 0.6 }
];
// Create an object that mimics FORTRAN COMPLEX*16 SP(2:3)
// and fill it with above data
const sp = fortranArrComplex64(complexArr)(2);
// fast! normal JS TypedArray access
let re = sp.r[ 2 - sp.base ];
// 1.8
let im = sp.i[ 2 - sp.base ];
// -0.2
// not so fast, but easier syntax
let v = sp.s(2)(); // Terse syntax,
// { re: 1.8, im: -0.2 }
// sets the value at index 3 to complex: 0.11 - i0.9
// and returns the old value: 2.3 + i0.6
let old = sp.s(3)(0.11, -0.9);
sp.toArr();
// [ { re:1.8, im: -0.2 },
// { re:0.11, im: -0.9 } ]
Usage TypeScript:
import {
// pure types
Complex,
fpArray,
FortranArr,
// helper
helper
} from 'blasjs';
const { fortranArrComplex64 } = helper;
const complexArr: Complex[] [
{ re: 1.8, im: -0.2 },
{ re: 2.3, im: 0.6 }
];
// Create an object that mimics FORTRAN COMPLEX*16 SP(2:3)
// and fill it with above data
const sp: FortranArr = fortranArrComplex64(complexArr)(2);
let re = sp.r[ 2 - sp.base ]; //fastest! direct TypedArray access
// 1.8
let im = sp.i[ 2 - sp.base ]; //fastest! direct TypedArray access
// -0.2
// not so fast, but easier syntax
let v = sp.s(2)(); // Terse syntax,
// { re: 1.8, im: -0.2 }
// sets the value at index 3 to complex: 0.11 - i0.9
// and returns the old value: 2.3 + i0.6
let old = sp.s(3)(0.11, -0.9);
// {re: 2.3, im: 0.6 }
Type Complex
Typescript definition of a complex scalar.
decl:
declare type Complex = {
re: number;
im?: number;
}
Usage:
import { Complex /* pure type */ } from 'blasjs';
const complexArr: Complex[] [
{ re: 1.8, im: -0.2 },
{ re: 2.3, im: 0.6 }
];
Matrix
The Matrix
object is the input of many level-2 and level-3 blasjs
functions.
Matrix
is created by the helpers fortranMatrixComplex32 and
fortranMatrixComplex64.
Matrix
encapsulates objects of Float32Array or Float64Array, the blasjs.
In this section the internals of Matrix
are explained in detail and how blasjs
accesses the data in the JS TypesArrays.
The Matrix
object has 2 properties r
and i
for respectively real and imaginary parts of matrix elements. These are the actual aforementioned JS TypedArrays. The imaginary property part is optional if it is not defined the Matrix represents solely an array of real elements.
declare type Matrix = { //Incomplete declaration
.
r: Float64Array|Float32Array;
i: Float64Array|Float32Array;
.
}
Contrary to languages like JavaScript. FORTRAN defines arrays ( aka DIMENSIONS
in FORTRAN lingo ) as 1 based arrays by default.. This can be changed by specifying a different base in the declaration.
Some examples:
DOUBLE PRECISION A1(4) ! array indexes 1,2,3,4
DOUBLE PRECISION A2(-1:3) ! array indexes -1,0,2,3
DOUBLE PRECISION A3(0:3) ! Javascript like Array with 4 elements
This expands to 2-dimensional arrays (matrices).
! (default) first index loops from 1 to 4(inclusive), second index loops from 1 to 5(inclusive)
DOUBLE PRECISION A1(4,5)
! first index loops from -2 to 4(inclusive), second index loops from -5 to -7(inclusive)
DOUBLE PRECISION A2(-2:4,-5:-7)
The values of the FORTRAN array basis are preserved as rowBase
(first index) and colBase
(second index).
declare type Matrix = { //SHOW PARTIAL TYPE
.
rowBase: number;
colBase: number;
.
}
JavaScript doesn't have the notion of typed 2-dimensional arrays
. The Matrix
objects handles this by mapping 2 dimensional arrays to single 1-dimensional array, by serializing data on a column-first basis.
For example the elements 2x2 Matrix will be mapped in a TypedArray as:
matrix A =
* *
| a11 a12 |
| a21 a22 |
* *
# Stored in TypedArray as
At = [a11,a21, a12, a22]
In case of complex values for A, the real part will be stored in r
and the imaginary part in i
each in the same column-first manner.
Direct access to TypedArrays within the Matrix
object is the preferable way to get/set matrix data.
Since BLAS (and therefore blasjs
) functions access matrices mostly to iterate over matrix row's first . It was decided to story 2 dimensional an a column-first basis.
To help with the calculation of finding/setting an element A(i,j) in Matrix
the following helper member functions have been added to Matrix
.
declare type Matrix = { //SHOW PARTIAL TYPE
.
rowBase: number;
colBase: number;
nrCols: number;
nrRows: number;
.
colOfEx(number): number;
coord(col): (row) => number;
setCol(col: number, rowStart: number, rowEnd: number, value: number): void;
.
}
Explanation:
nrRows
: The number of rows in the matrix.nrCols
: The number of columns in the matrix.colofEx
: Calculates the physical location of a column offset
within the TypedArray
. Taking int account the column base colBase
and row base colBase
. The index of A(i,j) = (j - colBase)*nrRows + i - rowBase
.coord
: Curried, emulates non-zero based FORTRAN index values for 2 dimensional Arrays. The index that is iterated over the least (usually) is used as the first to create the curried function.setCol
: Uses underlying TypedArray
, fill
method to set multiple column elements to a single value.One can create/transform new Matrix instances form existing onces. A copy of all relevant data is made into the new Matrix
instance.
Matrix.prototype.slice
Slices a rectangular piece of data out of an matrix into a new Matrix
instance. All arguments are FORTRAN-style non-zero based indexes.
declare type Matrix = { // only "slice" is shown
.
slice(rowStart: number, rowEnd: number, colStart: number, colEnd: number): Matrix;
.
}
rowStart
: The row in the matrix to begin slicing.rowEnd
: The last row to include in the slice.colStart
: The column in the matrix to begin slicing.colEnd
: The last column to include in the slice.Matrix.prototype.setLower
Returns a new Matrix where everything below the matrix diagonal is set to a value
.
Sets the real (and imaginary part, if it exist) to said value.
declare type Matrix = { // only "setLower" is shown.
.
setLower(value = 0): Matrix;
.
}
Matrix.prototype.setUpper
Returns a new Matrix where everything below the matrix diagonal is set to a value
.
Sets the real (and imaginary part, if it exist) to said value.
declare type Matrix = { //only "setUpper" is shown
.
setUpper(value = 0): Matrix;
.
}
Matrix.prototype.upperBand
Returns a new Matrix
object where the k
super-diagonals are retained into the new copy.
The efficient storage format of BLAS
band matrices is used.
declare type Matrix = { //only "upperBand" is shown
.
upperBand(k = nrRows - 1): Matrix;
.
}
The default value for k
is the the maximum size possible for the number of super-diagonals: ( nrRows-1
)
Matrix.prototype.lowerBand
Returns a new Matrix
object where the k
sub-diagonals are retained into the new copy.
The efficient storage format of BLAS
band matrices is used.
declare type Matrix = { // Only "lowerBand" is shown
.
lowerBand(k = nrRows-1): Matrix;
.
}
The default value for k
is the the maximum size possible for the number of sub-diagonals: ( nrRows-1
)
Matrix.prototype.real
Returns a new Matrix
object where with only real elements (omits the imaginary part during copy).
declare type Matrix = { // Only "real" is shown
.
real(): Matrix;
.
}
Matrix.prototype.imaginary
Returns a new Matrix
object where with only imaginary part of the element (omits the real part during copy).
If there were now imaginary elements
declare type Matrix = { // Only "imaginary" is shown.
.
imaginary(): Matrix;
.
}
BLAS ( and therefore blasjs
) can work with upper/lower-matrices and band-matrices in the most compacted form, aka packed matrices
.
With packed matrices
there are no unused elements in the matrix (no zeros). Packed matrices are instances of FortranArr. BLAS reference implementation in FORTRAN uses 1 dimensional arrays as an analog.
Matrix.prototype.packedUpper
Creates a packed array from a normal/upper Matrix only referencing the diagonal and super-diagonals.
declare type Matrix = { // Only "packedUpper" is shown.
.
packedUpper(k = nrRows-1): FortranArr;
.
}
The default value for k
is the the maximum size possible for the number of super-diagonals: ( nrRows-1
)
Matrix.prototype.packedLower
Creates a packed array from a normal/upper Matrix only referencing the diagonal and sub-diagonals.
declare type Matrix = { // Only "packedUpper" is shown.
.
packedLower(k = nrRows-1): FortranArr;
.
}
The default value for k
is the the maximum size possible for the number of sub-diagonals: ( nrRows-1
)
declare type Matrix = { // Only "packedUpper" is shown.
.
packedLower(k = nrRows - 1): FortranArr;
.
}
The default value for k
is the the maximum size possible for the number of sub-diagonals: ( nrRows - 1
)
The Matrix
object can convert the underlying TypedArray(s) to real JavaScript arrays.
Matrix.prototype.toArr
Creates a normal JS Array with element of type 'number' or of type Complex
declare type Matrix = { // Only "toArr" is shown.
.
toArr(): number[]|Complex[];
.
}
Putting it all together, here is the full type declaration of Matrix
:
declare type Matrix = {
rowBase: number;
colBase: number;
nrCols: number;
nrRows: number;
r: fpArray;
i?: fpArray; //optional
//
// methods
//
colOfEx(column: number): void;
coord(col: number): (row: number): void;
setCol(col: number, rowStart: number, rowEnd: number, value: number): void;
//
slice(rowStart: number, rowEnd: number, colStart: number, colEnd: number): Matrix;
setLower(value?: number): Matrix;
setUpper(value?: number): Matrix;
upperBand(k: number): Matrix;
lowerBand(k: number): Matrix;
real(): Matrix;
imaginary(): Matrix;
//
packedUpper(value?: number): FortranArr;
packedLower(value?: number): FortranArr;
//
toArr(): Complex[] | number[];
}
Common usage of the Matrix type.
const blas = require('../blasjs');
const { fortranMatrixComplex64 } = blas.helper;
// some matrix data 3x3 array aka a_row_column
const a11 = { re: .2, im: -.11 };
const a21 = { re: .1, im: -.2 };
const a31 = { re: .3, im: .9 };
const a12 = { re: .4, im: .5 };
const a22 = { re: .9, im: -.34 };
const a32 = { re: -.2, im: .45 };
const a13 = { re: -.1, im: .89 };
const a23 = { re: .43, im: .23 };
const a33 = { re: .23, im: .56 };
//create Matrix A
const A = fortranMatrixComplex64([
a11, a21, a31, a12, a22, a32, a13, a23, a33
])(3, 3);
// get the second column
const columnj = A.colOfEx(3); // formula: (j - colBase )* nrRows
A.r[A.coord(1, 2)] === a12.re // true
A.slice(1, 2, 2, 3);// creates new matrix with elements from A
/*[
a12 a13
a22 a23
]*/
A.setLower(0); // creates new Matrix object from A
/*[
a11 a12 a13
0 a22 a23
0 0 a33
]*/
A.setUpper(0); //creates new Matrix object from A
/*[
a11 0 0
a21 a22 0
a31 a32 a33
]*/
A.upperBand(1); // banded array storage for BLAS(js)
/*[
0 a12 a23
a11 a22 a33
]*/
A.lowerBand(1); // banded array storage for BLAS(js)
/*[
a11 a22 a33
a21 a32 0
]*/
const Areal = A.real();
// Areal.i is undefined
// Areal.r =
/*[
0.2 0.4 -0.1
0.1 0.9 0.43
0.3 -0.2, 0.23
]*/
const Aimag = A.imaginary();
// imaginary parts are copied to real side in new Matrix
// Aimag.i is undefined
// Aimag.r =
/*[
-0.11 0.5, 0.89
-0.2 -0.34 0.23
0.9 0.45 0.56
]*/
A.packedUpper(1)
/* [ a11 a12 a22 a23 a 33] */
A.packedLower(1)
/* [ a11 a21 a22 a32 a33] */
A.toArr(); // returns JavaScript Array
/*[
{ re: 0.2, im: -0.11 },
{ re: 0.1, im: -0.2 },
{ re: 0.3, im: 0.9 },
{ re: 0.4, im: 0.5 },
{ re: 0.9, im: -0.34 },
{ re: -0.2, im: 0.45 },
{ re: -0.1, im: 0.89 },
{ re: 0.43, im: 0.23 },
{ re: 0.23, im: 0.56 }
]
*/
Collection of helper function to manipulate common JS array and object types in a functional way.
arrayrify
Creates a new function from an existing one, to add the ability to accept vectorized input.
Example:
const blas = require('blasjs');
const { helper: { arrayrify } } = blas;
const PI = Math.PI;
//
const sin = arrayrify(Math.sin)
sin([PI/3, PI/4, PI/6]); // returns array aswell
// [ 0.866025, 0.7071067811, 0.5 ]
sin(PI/3); // returns scalar
sin( [ PI/3 ] ); // returns scalar
// 0.866025
sin([]) // edge case
// undefined
sin() //
//NaN same as Math.sin()
complex
Mimics the GNU Fortran extension complex.
Creates a JS object that represents a complex scalar number.
Used by blasjs
for scalar input arguments.
Example:
const blas = require('blasjs');
const { helper: { complex } } = blas;
const c1 = complex(0.1,0.3);
//c1 = { re: 0.1, im: 0.3 }
const c2 = complex();
//c2 = { re: 0, im: 0 }
const c3 = complex(0.5);
//c3 = { re: 0.5, im:0 }
each
Curried functional analog to Array.prototype.forEach
, but takes arbitrary input.
Example:
const blas = require('blasjs');
const { helper: { each } } = blas;
//Iterates over an object like a map
const curry1 = each( { hello: 'world', ts: new Date() })
curry1( (val, key) => console.log(`${val} ':' ${key}`)))
//world: hello
//2018-05-10T13:57:08.923Z : ts
//Handles array also
each( ['a','b','c','d'])( (v,idx) =>console.log(v,idx, typeof idx))
//a 0 number
//b 1 number
//c 2 number
//d 3 number
//Edge cases
each()(console.log)
//nothing happens
each(null)(console.log)
//nothing happens
each([])(console.log)
//nothing happens
map
Curried functional analog to Array.prototype.map
, but takes arbitrary input.
:warning: Forces the output to be a an array regardless of the input.
Example:
const blas = require('blasjs');
const { helper: { map } } = blas;
//trivial
map([1,2,3])(v=>v*2);
//[ 2, 4, 6 ]
//key properties
map({ a:'A', b:'B' })( (val, key) => key+'='+val);
//[ 'a=A', 'b=B' ]
map(null)( v => '/'+v);
//[]
map()( v => '/'+v);
//[]
map()()
//[]
muxCmplx
Creates an array of complex numbers from arrayed input. The result is always an array type.
Example:
const blas = require('blasjs');
const { helper: { muxCmplx } } = blas;
const reals = [ 0.1, -0.2, 0.3, 0.45 ];
const imaginary = [ 0.1, -0.2, 0.3, 0.45 ];
// normal usage
muxCmplx(reals, imaginary)
/*[ { re: 0.1, im: 0.1 },
{ re: -0.2, im: -0.2 },
{ re: 0.3, im: 0.3 },
{ re: 0.45, im: 0.45 } ]*/
//R recycling rule is used
muxCmplx([1,2], imaginary)
/*^[ { re: 1, im: 0.1 },
{ re: 2, im: -0.2 },
{ re: 1, im: 0.3 },
{ re: 2, im: 0.45 } ]*/
//dont care about imaginary
muxCmplx(reals)
/*[ { re: 0.1, im: undefined },
{ re: -0.2, im: undefined },
{ re: 0.3, im: undefined },
{ re: 0.45, im: undefined } ]*/
muxCmplx() //
// [ { re: undefined, im: undefined } ]
muxCmplx(1) //
// [ { re: 1, im: undefined } ]
//3 specify real and imaginary
muxCmplx(1,-2)//
//[ { re: 1, im: -2 } ]
numberPrecision
Enforces significant figure of a number, or on the properties of a JS object (deep search) with numeric values.
Example:
const blas = require('blasjs');
const { helper: { numberPrecision } } = blas;
const _4 = numberPrecision(4);
_4(0.123456789);
//0.1235
_4(123456789)
//123500000
//enforce significance over properties
_4( { car: 'Mazda' , aux: { priceUSD: 24.3253E+3, maxWarpSpeed:3.42111E-4 } } );
//{ car: 'Mazda', aux: { priceUSD: 24330, maxWarpSpeed: 0.0003421 } }
_4([0.123456, 0.78901234]);
//[ 0.1235, 0.789 ]
These constructors create the FortranArr
object for working with single/double precision complex/real Arrays.
fortranArrComplex32
Constructs a FortranArr object using Float32Array as the underlying array(s) (plural in the case of complex) elements.
declare function fortranArrComplex32(
...rest: (number | number[] | Complex | Complex[])[]
): (offset = 1) => FortranArr;
Argument list
:
rest
: takes as input.
offset
: the Fortran dimension offset (defaults to 1)See Examples
fortranArrComplex64
Constructs a FortranArr object using Float64Array as the underlying array(s) (plural in the case of complex) elements.
declare function fortranArrComplex64(
...rest: (number | number[] | Complex | Complex[])[]
): (offset = 1) => FortranArr;
Argument list
:
const blas = require('blasjs');
const { fortranArrComplex64, fortranArrComplex32 } = blas.helper;
const complexDataArr = [
{ re: 1.8, im: -0.2 },
{ re: 2.3, im: 0.6 }
];
const realData = [ 0.1, 2, 0.34, .56 ];
const sp1 = fortranArrComplex32(complexDataArr)();
//sp1.r = [ 1.7999999523162842, 2.299999952316284 ],
//sp1.i = [ -0.20000000298023224, 0.6000000238418579 ],
const sp2 = fortranArrComplex32(realData)();
//sp2.r = [ 0.10000000149011612, 2, 0.3400000035762787, 0.5600000023841858 ]
//sp2.i = undefined
const sp3 = fortranArrComplex32({re:0.2, im:-0.3})();
//[ 0.20000000298023224 ]
//[ -0.30000001192092896 ]
const sp4 = fortranArrComplex32(123)(4);
/*{
base: 4,
r: Float32Array [ 123 ],
i: undefined,
}*/
const sdp1 = fortranArrComplex64(complexDataArr)();
//sp1.r = [ 1.8, 2.3 ],
//sp1.i = [ -0.2, 0.6 ],
const sdp2 = fortranArrComplex64(realData)();
//sp2.r = [ 0.1, 2, 0.34, 0.56 ]
//sp2.i = undefined
const sp3 = fortranArrComplex64({re:0.2, im:-0.3})();
//[ 0.2 ]
//[ -0.3 ]
const sp4 = fortranArrComplex64(123)(4);
/*{
base: 4,
r: Float32Array [ 123 ],
i: undefined,
}*/
These constructors create the Matrix
object for working with single/double precision complex/real Matrices.
fortranMatrixComplex32
Constructs a Matrix object using Float32Array as the underlying array(s) (plural in the case of complex) elements.
declare function fortranMatrixComplex32(...rest: (Complex | Complex[])[]):
(nrRows: number, nrCols: number, rowBase?: number, colBase?: number) => Matrix
Argument list
:
rest
: takes as input.
nrRows
: where nrRows is equal to n
in the matrix A(m,n).nrCols
: where nrCols is equal to m
in the matrix A(m,n).rowBase
: FORTRAN offset for the first dimension (rows) as explained in Language differences.rowBase
: FORTRAN offset for the second dimension (columns) as explained in Language differences.See Examples
fortranMatrixComplex64
Constructs a Matrix object using Float64Array as the underlying array(s) (plural in the case of complex) elements.
declare function fortranMatrixComplex64(...rest: (Complex | Complex[])[]):
(nrRows: number, nrCols: number, rowBase?: number, colBase?: number) => Matrix
Argument list
:
rest
: takes as input.
nrRows
: where rnRows is equal to n
in the matrix A(m,n).nrCols
: where nrCols is equal to m
in the matrix A(m,n).rowBase
: FORTRAN offset for the first dimension (rows) as explained in Language differences.rowBase
: FORTRAN offset for the second dimension (columns) as explained in Language differences.const blas = require('blasjs');
const {
fortranMatrixComplex64,
fortranMatrixComplex32
} = blas.helper;
// some matrix data 3x3 array aka a_row_column
const a11 = { re: .2, im: -.11 };
const a21 = { re: .1, im: -.2 };
const a31 = { re: .3, im: .9 };
const a12 = { re: .4, im: .5 };
const a22 = { re: .9, im: -.34 };
const a32 = { re: -.2, im: .45 };
const a13 = { re: -.1, im: .89 };
const a23 = { re: .43, im: .23 };
const a33 = { re: .23, im: .56 };
const {
fortranMatrixComplex64,
fortranMatrixComplex32
} = blas.helper;
// Some matrix data 3x3 array aka a_row_column
const a11 = { re: .2, im: -.11 };
const a21 = { re: .1, im: -.2 };
const a31 = { re: .3, im: .9 };
const a12 = { re: .4, im: .5 };
const a22 = { re: .9, im: -.34 };
const a32 = { re: -.2, im: .45 };
const a13 = { re: -.1, im: .89 };
const a23 = { re: .43, im: .23 };
const a33 = { re: .23, im: .56 };
//functional curry to prepare for different mappings of A()
const A32 = fortranMatrixComplex64([
a11, a21, a31, a12, a22, a32, a13, a23, a33
]);
//matrix 1
const m1 = A32(3, 3); // 3x3 matrix with rowBase=1, colBase=1
// mimic FORTRAN "COMPLEX*8 A(-2:1, -3:0)"
const m2 = A32(3, 3, -2, -3);
//same as FORTRAN default COMPLEX*8 A(3,3) !aka A(1:3,1:3)
const m3 = A32(3, 3, 1, 1)
/* double precision */
/* double precision */
/* double precision */
const A64 = fortranMatrixComplex64([
a11, a21, a31, a12, a22, a32, a13, a23, a33
]);
// matrix 1 FORTRAN "COMPLEX*16 A(-2:1, -3:0).
const m1 = A64(3, 3); // 3x3 matrix with rowBase=1, colBase=1
// mimic FORTRAN "COMPLEX*16 A(-2:1, -3:0)"
const m2 = A64(3, 3, -2, -3);
// same as FORTRAN default COMPLEX*16 A(3,3) !aka A(1:3,1:3)
const m3 = A64(3, 3, 1, 1);
In blasjs
, contrary to the FORTRAN reference implementation, the numeric precision of a routine, is not determined by its name but by how its arguments like FortranArr
and Matrix
are constructed before used as arguments in blasjs
routines. The original FORTRAN names are kept for backwards compatibility to ease the porting of FORTRAN code toward blasjs
.
In FORTRAN a subroutine can have IN, OUT and IN/OUT scalar arguments. In JavaScript only arguments of type object
are passed by reference. To mimic OUT and IN/OUT FORTRAN arguments, scalars are wrapped in a JS object. See Construct a Givens plane rotation for an example.
Routines categorized as Level 1 perform scalar-vector and vector-vector operations.
Calculates the norm of a (complex) vector.
xᴴ is the conjugate of x
xᵀ is the transpose of x
scrnm2
: complex, single or double precision. See blas ref.dznrm2
: complex, (alias for scrnm2
). See blas ref.snrm2
: real, single or double precision. See blas ref.dnrm2
: real, (alias for dnrm2
). See blas ref.decl
function scnrm2(n: number, x: FortranArr, incx: number): number;
function dznrm2(n: number, x: FortranArr, incx: number): number;
function snrm2(n: number, x: FortranArr, incx: number): number;
function dnrm2(n: number, x: FortranArr, incx: number): number;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { scnrm2, dznrm2, snrm2, dnrm2 } = BLAS.level1;
See wiki.
|c -s| × |a| = |r |
|s c| |b| |0 |
r = √( a² + b² )
srotg
: real, (alias for drotg
). See blas ref.drotg
: real, single or double precision. See blas ref.crotg
: complex, single or double precision. See blas ref.zrotg
: complex, (alias for crotg
). See blas ref.decl
function srotg(p: { sa: number, sb: number, c: number, s: number } ): void;
function drotg(p: { sa: number, sb: number, c: number, s: number } ): void;
function crotg(ca: Complex, cb: Complex, c: { val: number }, s: Complex ): void
function zrotg(ca: Complex, cb: Complex, c: { val: number }, s: Complex ): void
Usage:
const BLAS = require('blasjs');
const { srotg, drotg, crotg, zrotg } = BLAS.level1;
H
Construct the modified Givens transformation matrix H which zeros the second component of the 2 vector ( sx1*√(sd1) , sy1* √(sd2) ) See researchgate.net.
srotmg
: real, (alias for drotmg
). See blas ref.drotmg
: real, single or double precision. See blas ref.decl
function srotmg(p: { sd1: number, sd2: number, sx1: number, sy1: number, sparam: FortranArr }): void;
function drotmg(p: { sd1: number, sd2: number, sx1: number, sy1: number, sparam: FortranArr }): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { srotmg, drotmg } = BLAS.level1;
See wiki.
srotm
: real, (alias for drotm
). See blas ref.drotm
: real, single or double precision. See blas ref.decl
function srotm(n: number, sy: FortranArr, incx: number, sy: FortranArr, incy: number, sparam: FortranArr)): void;
function drotm(n: number, sy: FortranArr, incx: number, sy: FortranArr, incy: number, sparam: FortranArr)): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { srotm, drotm } = BLAS.level1;
See researchgate.net.
srot
: real, (alias for drot
). See blas ref.drot
: real, single or double precision. See blas ref.csrot
: complex, (alias for zdrot
). See blas ref.zdrot
: complex, single or double precision. See blas ref.decl
function srot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number, c: number, s: number): void;
function drot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number, c: number, s: number): void;
function csrot: (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number, c: number, s: number): void;
function zdrot: (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number, c: number, s: number): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { srot, drot, csrot, zdrot } = BLAS.level1;
x ⟵ α·x
sscal
: Alias for dscal
. See blas ref.dscal
: by a REAL constant. See blas ref.cscal
: Alias for zscal
. See blas ref.zscal
: Scales a COMPLEX vector with a COMPLEX constant. See blas ref.csscal
: Alias for zdscal
. blas ref.zdscal
: Scales a COMPLEX vector with a REAL constant. See blas ref.decl
function sscal(n: number, sa: number, sx: FortranArr, incx: number): void;
function dscal(n: number, sa: number, sx: FortranArr, incx: number): void;
function cscal(n: number, ca: Complex,cx: FortranArr, incx: number): void;
function zscal(n: number, ca: Complex,cx: FortranArr, incx: number): void;
function csscal(n: number, sa: number, cx: FortranArr, incx: number): void;
function zdscal(n: number, sa: number, cx: FortranArr, incx: number): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { sscal, dscal, cscal, zscal, csscal, zdscal } = BLAS.level1;
s ⟵ ∑ ∥ Re( x ) ∥ + ∥ Im( x ) ∥
sasum
: Alias for dasum
. See blas refdasum
: uses REAL vector, ( single or double precision ). See blas-ref.scasum
: Alias for dzasum
. See blas ref.dzasum
: uses Complex vector, ( single or double precision ). See blas-ref.decl
function sasum(n: number, sx: FortranArr, incx: number): number;
function dasum(n: number, sx: FortranArr, incx: number): number;
function scasum(n: number, cx: FortranArr, incx: number): number;
function dzasum(n: number, cx: FortranArr, incx: number): number;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { sasum, dasum, scasum, dzasum } = BLAS.level1;
Swap 2 vectors.
sswap
: Alias for dswap
. See blas ref.dswap
: REAL vector, ( single or double precision ). See blas ref.cswap
: Alias for zswap
. See blas ref.zswap
: REAL vector, ( single or double precision ). See blas ref.decl
function sswap(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): void;
function dswap(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): void;
function cswap(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): void;
function zswap(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { sswap, dswap, cswap, zswap } = BLAS.level1;
xᵀ·y or xᴴ·y
cdotu
: Alias for zdotu
. See blas ref.cdotc
: Alias for zdotc
. See blas ref.zdotu
: xᵀ·y
. Complex arguments, ( single or double precision ). See blas-ref.zdotc
: xᴴ·y
. The fist complex vector argument is made conjugate, ( single or double precision ). See blas-ref.decl
function cdotu(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): Complex;
// first argument sx is made conjugate
function cdotc(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): Complex;
function zdotu(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): Complex;
// first argument sx is made conjugate
function zdotc(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): Complex;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { cdotu, cdotc, zdotu, zdotc } = BLAS.level1;
xᵀ·y
sdot
: Alias for dsdot
. See blas ref.ddot
: Alias for dsdot
. See blas ref.sdsdot
: Alias for dsdot
. See blas ref.dsdot
: xᵀ·y
Inner product of 2 vectors ( single or double precision ). See blas ref.decl
function sdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;
function ddot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;
function sdsdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;
function dsdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { sdot, ddot, sdsdot, dsdot } = BLAS.level1;
Find k for wich: ∥ xₖ ∥ > ∥ xₜ ∥ for all t ∈ [1, n].
isamax
: Alias for idamax
. See [blas ref]:ref-isamaxidamax
: Find the index of the maximum element of a REAL vector ( single or double precision ). See blas ref.icamax
: Alias for izamax
. See [blas ref]:ref-icamaxizamax
: Find the index of the maximum element of a COMPLEX vector ( single or double precision ). See blas ref.decl
function isamax: (n: number, sx: FortranArr, incx: number): number;
function idamax: (n: number, sx: FortranArr, incx: number): number;
function icamax: (n: number, sx: FortranArr, incx: number): number;
function izamax: (n: number, sx: FortranArr, incx: number): number;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { isamax, idamax, icamax, izamax } = BLAS.level1;
scopy
: Alias for dcopy
. See [blas ref]:ref-scopydcopy
: Copies a REAL vector ( single or double precision ). See blas ref.ccopy
: Alias for zcopy
. See [blas ref]:ref-ccopyzcopy
: Copies a COMPLEX vector ( single or double precision ). See blas ref.decl
function scopy (n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;
function dcopy (n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;
function ccopy (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;
function zcopy (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { scopy, dcopy, ccopy, zcopy } = BLAS.level1;
y ⟵ y + a·x where y, a and x can be complex or a real number.
saxpy
: Alias for daxpy
. See [blas ref]:[ref-saxpy].daxpy
: REAL constant used in multiplication with a vector ( single or double precision ). See [blas ref]:ref-daxpy.caxpy
: Alias for zaxpy
. See [blas ref]:[ref-saxpy].zaxpy
: Complex constant used in multiplication with a vector ( single or double precision ). See [blas ref]:ref-zaxpy.decl
function saxpy(n: number, sa: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;
function daxpy(n: number, sa: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;
function caxpy(n: number, ca: Complex, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;
function zaxpy(n: number, ca: Complex, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;
See: how to create fortranArr.
Usage:
const BLAS = require('blasjs');
const { saxpy, daxpy, caxpy, zaxpy } = BLAS.level1;
Routines categorized as Level 2 perform Matrix-vector operations.
( ᴴ means conjugate transpose )
For the routines chpr2
and zhpr2
the matrix A is in packed form ( a fortranArr ).
For the routines cher2
and zher2
the matrix symmetry is exploited (use only upper/lower triangular part of the matrix).
cher2
: alias for zher2
. See blas ref.zher2
: The Matrix A
is in upper or lower triangular form ( single or double precision ). See blas ref.chpr2
: alias for zhpr2
. See blas ref.zhpr2
: The matrix A
is in packed form ( single or double precision ). See blas ref.decl
function cher2|zher2(
uplo: "u" | "l",
n: number,
alpha: Complex,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
a: Matrix,
lda: number): void;
function chpr2|zhpr2(
uplo: "u" | "l",
n: number,
alpha: Complex,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
ap: FortranArr): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { cher2, zher2, chpr, zhpr } = BLAS.level2;
For the routines sspr2
and dspr2
the matrix A is in packed form ( a fortranArr ).
For the routines ssyr2
and dsyr2
the matrix symmetry is exploited (use only upper/lower triangular part of the matrix).
sspr2
: Alias for dspr2. See blas ref.dspr2
: The matrix A
is in packed form ( single or double precision ). See blas ref.ssyr2
: Alias for dsyr2. See blas ref.dsyr2
: The Matrix A
is in upper or lower triangular form ( single or double precision ). See blas ref.decl
function sspr2|dspr2(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
ap: FortranArr):void;
function ssyr2|dsyr2(
uplo: 'u' | 'l',
n: number,
alpha: number,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
A: Matrix,
lda: number): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { sspr2, dspr2, ssyr2, dsyr2 } = BLAS.level2;
( ᴴ means conjugate transpose )
The subroutines sger
and dger
perform A ⟵ α·x·yᵀ + A. Where α is a REAL scalar,
A, x, y are single or double precision REAL Matrix and vectors.
The subroutines cgerc
and zgerc
perform A ⟵ α·x·yᴴ + A. Where α is a COMPLEX scalar,
A, x, y are single or double precision COMPLEX Matrix and vectors.
The subroutines cgeru
and zgeru
perform A ⟵ α·x·yᵀ + A. Where α is a COMPLEX scalar,
A, x, y are single or double precision COMPLEX Matrix and vectors.
sger
: alias for dger
. See blas ref.dger
: See blas ref.cgerc
: alias for zgerc
. See blas ref.zgerc
: See blas ref.cgeru
: alias for zgeru
. See blas ref.zgeru
: See blas ref.decl
function sger|dger(
m: number,
n: number,
alpha: number,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
a: Matrix,
lda: number):void;
function cgerc|zgerc(
m: number,
n: number,
alpha: Complex,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
a: Matrix,
lda: number): void;
function cgeru|zgeru(
m: number,
n: number,
alpha: Complex,
x: FortranArr,
incx: number,
y: FortranArr,
incy: number,
a: Matrix,
lda: number): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { sger, dger, cgerc, zgerc, cgeru, zgeru } = BLAS.level2;
( ᴴ means conjugate transpose )
For the routines cher
and zher
α is a REAL scalar, the matrix symmetry of A is exploited (use only upper/lower triangular part of the matrix).
For the routines chpr
and zhpr
α is a REAL scalar, the matrix A is in packed form ( a fortranArr ).
cher
: alias for zher
. See blas ref.zher
: For single or double precision complex x
and A
. See blas ref.chpr
: alias for zher
. See blas ref.zhpr
: For single or double precision complex x
and A
. See blas ref.function cher(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
a: Matrix,
lda: number): void;
function zher(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
a: Matrix,
lda: number): void;
function chpr(u
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
ap: FortranArr): void;
function zhpr(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
ap: FortranArr): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { cher, zher, chpr, zhpr } = BLAS.level2;
For the routines ssyr
and dsyr
α is a REAL scalar, the symmetry of the REAL matrix A is exploited (use only upper/lower triangular part of the matrix).
For the routines sspr
and dspr
α is a REAL scalar, the REAL matrix A is in packed form ( a fortranArr ).
sspr
: alias for dspr
. See blas ref.dspr
: For single or double precision REAL α
, x
and A
. See blas ref.ssyr
: alias for ssyr
. See blas ref.dsyr
: For single or double precision REAL α
, x
and A
. See blas ref.decl
function sspr(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
ap: FortranArr): void;
function dspr(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
ap: FortranArr): void;
function ssyr(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
a: Matrix,
lda: number): void;
function dsyr(
uplo: "u" | "l",
n: number,
alpha: number,
x: FortranArr,
incx: number,
a: Matrix,
lda: number): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { sspr, dspr, ssyr, dsyr } = BLAS.level2;
Aᴴ is the complex conjugate transpose of matrix A
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix A | blas ref link |
---|---|---|---|---|---|
cgbmv/zgbmv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y, y ⟵ α·Aᴴ·x + β·y | α, A, β | none | upper/lower band | cgbmv/zgbmv |
chbmv/zhbmv | y ⟵ α·A·x + β·y | α, A, β | none | upper/lower band | chbmv/zhbmv |
ssbmv/dsbmv | y ⟵ α·A·x + β·y | none | α, A, β | upper/lower band | chbmv/zhbmv |
sgbmv/dgbmv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y | none | α, A, β | upper/lower band | sgbmv/dgbmv |
stbmv/dtbmv | y ⟵ α·A·x + β·y | none | α, A, β | upper/lower band | stbmv/dtbmv |
chemv/zhemv | y ⟵ α·A·x + β·y | α, A, β | none | triangular upper/lower | chemv/zhemv |
sgemv/dgemv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y | none | α, A, β | full m x n | sgemv/dgemv |
cgemv/zgemv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y, y ⟵ α·Aᴴ·x + β·y | α, A, β | none | full m x n | cgemv/zgemv |
chpmv/zhpmv | y ⟵ α·A·x + β·y | α, A, β | none | packed upper/lower triangular | cgemv/zgemv |
sspmv/dspmv | y ⟵ α·A·x + β·y | none | α, A, β | packed upper/lower triangular | sspmv/dspmv |
ssymv/dsymv | y ⟵ α·A·x + β·y | α, A, β | none | upper/lower triangular | ssymv/dsymv |
decl
function cgbmv|zgbmv(
trans: 'n' | 't' | 'c',
m: number,
n: number,
kl: number,
ku: number,
alpha: Complex,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: Complex,
y: FortranArr,
incy: number
): void;
function chbmv|zhbmv(
uplo: 'u' | 'l',
n: number,
k: number,
alpha: Complex,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: Complex,
y: FortranArr,
incy: number
): void;
export function ssbmv|dsbmv(
uplo: string,
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: number,
y: FortranArr,
incy: number
): void;
function sgbmv|dgbmv(
trans: string,
m: number,
n: number,
kl: number,
ku: number,
alpha: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: number,
y: FortranArr,
incy: number
): void;
function stbmv | dtbmv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
k: number,
A: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function chemv|zhemv(
uplo: 'u' | 'l',
n: number,
alpha: Complex,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: Complex,
y: FortranArr,
incy: number
): void
function sgemv|dgemv(
trans: string,
m: number,
n: number,
alpha: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: number,
y: FortranArr,
incy: number
): void;
function cgemv|zgemv(
trans: 'n' | 't' | 'c',
m: number,
n: number,
alpha: Complex,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: Complex,
y: FortranArr,
incy: number
): void;
function chpmv|zhpmv(
uplo: 'u' | 'l',
n: number,
alpha: Complex,
ap: FortranArr,
x: FortranArr,
incx: number,
beta: Complex,
y: FortranArr,
incy: number
): void;
function sspmv|dspmv(
uplo: 'u' | 'l',
n: number,
alpha: number,
ap: FortranArr, // a symmetric matrix in packed form
x: FortranArr,
incx: number,
beta: number,
y: FortranArr,
incy: number
): void
function ssymv|dsymv(
uplo: 'u' | 'l',
n: number,
alpha: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number,
beta: number,
y: FortranArr,
incy: number
): void
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const {
cgbmv, chbmv, dgbmv, dsbmv, sgbmv, ssbmv, zgbmv, zhbmv,
cgemv, chemv, dgemv, sgemv, zgemv, zhemv,
chpmv, dspmv, sspmv, zhpmv, dsymv, ssymv } = BLAS.level2;
Aᴴ is the complex conjugate transpose of matrix A
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix A | blas ref link |
---|---|---|---|---|---|
stbmv/dtbmv | x ⟵ A·x, or x ⟵ Aᵀ·x | none | A, x | upper/lower band | stbmv/dtbmv |
ctbmv/ztbmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x | none | upper/lower band | ctbmv/ztbmv |
stpmv/dtpmv | x ⟵ A·x, or x ⟵ Aᵀ·x | none | A, x | upper/lower triangular packed | stpmv/dtpmv |
ctpmv/ztpmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x | none | upper/lower triangular packed | ctpmv/ztpmv |
strmv/dtrmv | x ⟵ A·x, or x ⟵ Aᵀ·x | none | A, x | upper/lower triangular | strmv/dtrmv |
ctrmv/ztrmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x | none | upper/lower triangular | ctrmv/ztrmv |
decl
function stbmv|dtbmv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
k: number,
A: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function ctbmv|ztbmv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
k: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function stpmv|zhbmv (
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
ap: FortranArr,
x: FortranArr,
incx: number
): void;
function ctpmv|ztpmv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
ap: FortranArr,
x: FortranArr,
incx: number
): void;
function strmv|dtrmv(
uplo: 'u' | 'l',
trans: 't' | 'c' | 'n',
diag: 'u' | 'n',
n: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function ctrmv|ztrmv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const {
stbmv, dtbmv, ctbmv, ztbmv, stpmv, dtpmv, ctpmv, ztpmv, strmv
dtrmv, ctrmv, ztrmv } = BLAS.level2;
Aᴴ is the complex conjugate transpose of matrix A
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix A | blas ref link |
---|---|---|---|---|---|
stbsv/dtbsv | A·x = b, or Aᵀ·x = b | none | A, b, x | upper/lower band | stbsv/dtbsv |
ctbsv/ztbsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none | upper/lower band | ctbsv/ztbsv |
stpsv/dtpsv | A·x = b, or Aᵀ·x = b | none | A, b, x | packed upper/lower triangular | stpsv/dtpsv |
ctpsv/ztpsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none | packed upper/lower triangular | ctpsv/ztpsv |
ctrsv/ztrsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none | upper/lower triangular | ctrsv/ztrsv |
strsv/dtrsv | A·x = b, or Aᵀ·x = b | none | A, b, x | upper/lower triangular | strsv/dtrsv |
decl
function stbsv|dtbsv(
uplo: 'u' | 'l',
trans: 't' | 'n' | 'c',
diag: 'u' | 'n',
n: number,
k: number,
A: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function ctbsv|ztbsv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
k: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void;
function stpsv|dtpsv(
uplo: 'u' | 'l',
trans: 't' | 'n' | 'c',
diag: 'u' | 'n',
n: number,
ap: FortranArr,
x: FortranArr,
incx: number
): void;
function ctpsv|ztpsv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
ap: FortranArr,
x: FortranArr,
incx: number
): void
function ctrsv|ztrsv(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
diag: 'u' | 'n',
n: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void
function strsv|dtrsv(
uplo: 'u' | 'l',
trans: 't' | 'c' | 'n',
diag: 'u' | 'n',
n: number,
a: Matrix,
lda: number,
x: FortranArr,
incx: number
): void
See: how to create fortranArr.
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const {
stbsv, dtbsv, ctbsv, ztbsv, stpsv,
dtpsv, ctpsv, ztpsv, ctrsv, ztrsv,
strsv, dtrsv } = BLAS.level2;
Routines categorized as Level 2 perform Matrix-vector operations.
con( α ) is the conjugate of α.
Aᴴ is the conjugate transpose of Matrix A.
Bᴴ isthe conjugate transpose of Matrix B.
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix C | blas ref link |
---|---|---|---|---|---|
cher2k/zher2k | C ⟵ α·A·Bᴴ + con( α )·B·Aᴴ + β·C or C ⟵ α·Aᴴ·B + con( α )·Bᴴ·A + β·C | α, A, B, C | β | upper/lower triangular | cher2k/zher2k |
decl
function cher2k | zher2k(
uplo: 'u' | 'l',
trans: 'n' | 'c',
n: number,
k: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: number,
c: Matrix,
ldc: number
): void;
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { cher2k, zher2k } = BLAS.level3;
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix C | blas ref link |
---|---|---|---|---|---|
ssyr2k/dsyr2k | C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B + α·Bᵀ·A + β·C | none | α, A, β, B, C | upper/lower triangular | cher2k/zher2k |
csyr2k/zsyr2k | C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B + α·Bᵀ·A + β·C | α, A, β, B, C | none | upper/lower triangular | csyr2k/zsyr2k |
decl
function ssyr2k|dsyr2k(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: number,
c: Matrix,
ldc: number
): void;
function csyr2k|zsyr2k(
uplo: 'u' | 'l',
trans: 'n' | 't',
n: number,
k: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: Complex,
c: Matrix,
ldc: number
): void
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { ssyr2k, dsyr2k, csyr2k, zsyr2k } = BLAS.level3;
Aᴴ is the conjugate transpose of Matrix A.
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix C | blas ref link |
---|---|---|---|---|---|
cherk/zherk | C ⟵ α·A·Aᴴ + β·C, or C ⟵ α·Aᴴ·A + β·C | A, C | α, β | upper/lower triangular | cherk/zherk |
decl
function cherk|zherk(
uplo: 'u' | 'l',
trans: 'n' | 'c',
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
beta: number,
c: Matrix,
ldc: number
): void;
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { cherk, zherk } = BLAS.level3;
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | complex | real | type of matrix C | blas ref link |
---|---|---|---|---|---|
ssyrk/dsyrk | C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C | none | α, A, β, C | upper/lower triangular | ssyrk/dsyrk |
csyrk/zsyrk | C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C | α, A, β, C | none | upper/lower triangular | csyrk/zsyrk |
decl
function ssyrk|dsyrk(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
beta: number,
c: Matrix,
ldc: number
): void;
function csyrk|zsyrk(
uplo: 'u' | 'l',
trans: 'n' | 't' | 'c',
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
beta: number,
c: Matrix,
ldc: number
): void;
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { ssyrk, dsyrk, csyrk, zsyrk } = BLAS.level3;
f(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)
h(B) is an operation on matrix B, like Bᵀ, Bᴴ, or B (no-op)
S(A) is the set of all possible results of f(A) for a routine.
S(B) is the set of all possible results of h(B) for a routine.
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | S(A) | S(B) | real | complex | type of matrix C | blas ref link |
---|---|---|---|---|---|---|---|
sgemm/dgemm | C ⟵ α·f(A)·h(B) + β·C | Aᵀ, A | Bᵀ, B | α, A, β, B, C | none | m x n | sgemm/dgemm |
cgemm/zgemm | C ⟵ α·f(A)·h(B) + β·C | Aᴴ, Aᵀ, A | Bᴴ, Bᵀ, B | none | α, A, β, B, C | m x n | cgemm/zgemm |
decl
function sgemm|dgemm(
transA: 'n' | 't' | 'c',
transB: 'n' | 't' | 'c',
m: number,
n: number,
k: number,
alpha: number,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: number,
c: Matrix,
ldc: number
): void;
function cgemm|zgemm(
transA: 'n' | 't' | 'c',
transB: 'n' | 't' | 'c',
m: number,
n: number,
k: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: Complex,
c: Matrix,
ldc: number
): void
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { sgemm, dgemm, cgemm, zgemm } = BLAS.level3;
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | real | complex | type of matrix C | blas ref link |
---|---|---|---|---|---|
chemm/zhemm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | none | α, A, B, β, C | m x n | chemm/zhemm |
ssymm/dsymm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | α, A, B, β, C | none | m x n | ssymm/dsymm |
csymm/zsymm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | none | α, A, B, β, C | m x n | csymm/zsymm |
decl
function chemm|zhemm(
side: 'l' | 'r',
uplo: 'u' | 'l',
m: number,
n: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: Complex,
c: Matrix,
ldc: number
): void;
function ssymm|dsymm(
side: 'l' | 'r',
uplo: 'u' | 'l',
m: number,
n: number,
alpha: number,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: number,
c: Matrix,
ldc: number
): void
function csymm|zsymm(
side: 'l' | 'r',
uplo: 'u' | 'l',
m: number,
n: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number,
beta: Complex,
c: Matrix,
ldc: number
): void
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { chemm, zhemm, ssymm, dsymm, csymm, zsymm } = BLAS.level3;
f(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)
S(A) is the set of all possible results of f(A) for a routine.
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | S(A) | real | complex | type of matrix B | blas ref link |
---|---|---|---|---|---|---|
strmm/dtrmm | B ⟵ α·f(A)·B or B ⟵ α·B·f(A) | A, Aᵀ | α, B | none | m x n | strmm/dtrmm |
ctrmm/ztrmm | B ⟵ α·f(A)·B or B ⟵ α·B·f(A) | A, Aᵀ, Aᴴ | none | α, A, B | m x n | ctrmm/ztrmm |
decl
function strmm|dtrmm(
side: 'l' | 'r',
uplo: 'u' | 'l',
transA: 'n' | 't' | 'c',
diag: 'u' | 'n',
m: number,
n: number,
alpha: number,
a: Matrix,
lda: number,
b: Matrix,
ldb: number
): void;
function ctrmm|ztrmm(
side: 'l' | 'r',
uplo: 'u' | 'l',
transA: 'n' | 't' | 'c',
diag: 'u' | 'n',
m: number,
n: number,
alpha: Complex,
a: Matrix,
lda: number,
b: Matrix,
ldb: number
): void;
See: how to create Matrix.
Usage:
const BLAS = require('blasjs');
const { strmm, dtrmm, ctrmm, ztrmm } = BLAS.level3;
f(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)
S(A) is the set of all possible results of f(A) for a routine.
The naming in blasjs does not reflect the precision used, precision is determined by argument construction. The naming is maintained for compatibility with the reference implementation.
subroutine | operation | S(A) | real | complex | type of matrix B | blas ref link |
---|---|---|---|---|---|---|
strsm/dtrsm | f( A )·X = α·B, or X·f( A ) = α·B | A, Aᵀ | α, A, B | none | m x n | strsm/dtrsm |
ctrsm/ztrsm | f( A )·X = α·B, or X·f( A ) = α·B | A, Aᵀ, Aᴴ | none | α, A, B | m x n | ctrsm/ztrsm |
Changes 1.0.15
FAQs
Javascript Pure Implementation of BLAS Level 1, level 2, level 3 functions
The npm package blasjs receives a total of 34 weekly downloads. As such, blasjs popularity was classified as not popular.
We found that blasjs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Security News
Socket CEO Feross Aboukhadijeh discusses open source security challenges, including zero-day attacks and supply chain risks, on the Cyber Security Council podcast.
Security News
Research
Socket researchers uncover how threat actors weaponize Out-of-Band Application Security Testing (OAST) techniques across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.