Skip to content

Commit 271f5d5

Browse files
authored
refactor: reduce code duplication in blas/base level 1 routines
PR-URL: #2517 Reviewed-by: Athan Reines <[email protected]>
1 parent 243ab4d commit 271f5d5

File tree

13 files changed

+87
-645
lines changed

13 files changed

+87
-645
lines changed

lib/node_modules/@stdlib/blas/base/daxpy/lib/daxpy.js

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818

1919
'use strict';
2020

21-
// VARIABLES //
21+
// MODULES //
2222

23-
var M = 4;
23+
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
24+
var ndarray = require('./ndarray.js');
2425

2526

2627
// MAIN //
@@ -49,48 +50,12 @@ var M = 4;
4950
function daxpy( N, alpha, x, strideX, y, strideY ) {
5051
var ix;
5152
var iy;
52-
var m;
53-
var i;
5453
if ( N <= 0 || alpha === 0.0 ) {
5554
return y;
5655
}
57-
// Use unrolled loops if both strides are equal to `1`...
58-
if ( strideX === 1 && strideY === 1 ) {
59-
m = N % M;
60-
61-
// If we have a remainder, run a clean-up loop...
62-
if ( m > 0 ) {
63-
for ( i = 0; i < m; i++ ) {
64-
y[ i ] += alpha * x[ i ];
65-
}
66-
}
67-
if ( N < M ) {
68-
return y;
69-
}
70-
for ( i = m; i < N; i += M ) {
71-
y[ i ] += alpha * x[ i ];
72-
y[ i+1 ] += alpha * x[ i+1 ];
73-
y[ i+2 ] += alpha * x[ i+2 ];
74-
y[ i+3 ] += alpha * x[ i+3 ];
75-
}
76-
return y;
77-
}
78-
if ( strideX < 0 ) {
79-
ix = (1-N) * strideX;
80-
} else {
81-
ix = 0;
82-
}
83-
if ( strideY < 0 ) {
84-
iy = (1-N) * strideY;
85-
} else {
86-
iy = 0;
87-
}
88-
for ( i = 0; i < N; i++ ) {
89-
y[ iy ] += alpha * x[ ix ];
90-
ix += strideX;
91-
iy += strideY;
92-
}
93-
return y;
56+
ix = stride2offset( N, strideX );
57+
iy = stride2offset( N, strideY );
58+
return ndarray( N, alpha, x, strideX, ix, y, strideY, iy );
9459
}
9560

9661

lib/node_modules/@stdlib/blas/base/ddot/lib/ddot.js

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818

1919
'use strict';
2020

21-
// VARIABLES //
21+
// MODULES //
2222

23-
var M = 5;
23+
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
24+
var ndarray = require( './ndarray.js' );
2425

2526

2627
// MAIN //
@@ -45,50 +46,14 @@ var M = 5;
4546
* // returns -5.0
4647
*/
4748
function ddot( N, x, strideX, y, strideY ) {
48-
var dot;
4949
var ix;
5050
var iy;
51-
var m;
52-
var i;
53-
54-
dot = 0.0;
5551
if ( N <= 0 ) {
56-
return dot;
57-
}
58-
// Use unrolled loops if both strides are equal to `1`...
59-
if ( strideX === 1 && strideY === 1 ) {
60-
m = N % M;
61-
62-
// If we have a remainder, run a clean-up loop...
63-
if ( m > 0 ) {
64-
for ( i = 0; i < m; i++ ) {
65-
dot += x[ i ] * y[ i ];
66-
}
67-
}
68-
if ( N < M ) {
69-
return dot;
70-
}
71-
for ( i = m; i < N; i += M ) {
72-
dot += ( x[ i ] * y[ i ] ) + ( x[ i+1 ] * y[ i+1 ] ) + ( x[ i+2 ] * y[ i+2 ] ) + ( x[ i+3 ] * y[ i+3 ] ) + ( x[ i+4 ] * y[ i+4 ] ); // eslint-disable-line max-len
73-
}
74-
return dot;
75-
}
76-
if ( strideX < 0 ) {
77-
ix = ( 1-N ) * strideX;
78-
} else {
79-
ix = 0;
80-
}
81-
if ( strideY < 0 ) {
82-
iy = ( 1-N ) * strideY;
83-
} else {
84-
iy = 0;
85-
}
86-
for ( i = 0; i < N; i++ ) {
87-
dot += ( x[ ix ] * y[ iy ] );
88-
ix += strideX;
89-
iy += strideY;
52+
return 0.0;
9053
}
91-
return dot;
54+
ix = stride2offset( N, strideX );
55+
iy = stride2offset( N, strideY );
56+
return ndarray( N, x, strideX, ix, y, strideY, iy );
9257
}
9358

9459

lib/node_modules/@stdlib/blas/base/drot/lib/drot.js

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818

1919
'use strict';
2020

21+
// MODULES //
22+
23+
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
24+
var ndarray = require( './ndarray.js' );
25+
26+
2127
// MAIN //
2228

2329
/**
@@ -43,42 +49,15 @@
4349
* // y => <Float64Array>[ ~4.2, 4.4, 4.6, 4.8, 5.0 ]
4450
*/
4551
function drot( N, x, strideX, y, strideY, c, s ) {
46-
var tmp;
4752
var ix;
4853
var iy;
49-
var i;
5054

5155
if ( N <= 0 ) {
5256
return y;
5357
}
54-
// If both strides are equal to `1`...
55-
if ( strideX === 1 && strideY === 1 ) {
56-
for ( i = 0; i < N; i++ ) {
57-
tmp = ( c * x[ i ] ) + ( s * y[ i ] );
58-
y[ i ] = ( c * y[ i ] ) - ( s * x[ i ] );
59-
x[ i ] = tmp;
60-
}
61-
return y;
62-
}
63-
// If both strides are not equal to `1`...
64-
if ( strideX < 0 ) {
65-
ix = ( 1 - N ) * strideX;
66-
} else {
67-
ix = 0;
68-
}
69-
if ( strideY < 0 ) {
70-
iy = ( 1 - N ) * strideY;
71-
} else {
72-
iy = 0;
73-
}
74-
for ( i = 0; i < N; i++ ) {
75-
tmp = ( c * x[ ix ] ) + ( s * y[ iy ] );
76-
y[ iy ] = ( c * y[ iy ] ) - ( s * x[ ix ] );
77-
x[ ix ] = tmp;
78-
ix += strideX;
79-
iy += strideY;
80-
}
81-
return y;
58+
ix = stride2offset( N, strideX );
59+
iy = stride2offset( N, strideY );
60+
return ndarray( N, x, strideX, ix, y, strideY, iy, c, s );
8261
}
8362

8463

lib/node_modules/@stdlib/blas/base/drotm/lib/drotm.js

Lines changed: 9 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818

1919
'use strict';
2020

21+
// MODULES //
22+
23+
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
24+
var ndarray = require( './ndarray.js' );
25+
26+
2127
// MAIN //
2228

2329
/**
@@ -44,108 +50,16 @@
4450
*/
4551
function drotm( N, x, strideX, y, strideY, param ) {
4652
var dflag;
47-
var dh11;
48-
var dh12;
49-
var dh21;
50-
var dh22;
5153
var ix;
5254
var iy;
53-
var i;
54-
var w;
55-
var z;
5655

5756
dflag = param[ 0 ];
5857
if ( N <= 0 || dflag === -2.0 ) {
5958
return y;
6059
}
61-
if ( strideX === strideY && strideX > 0 ) {
62-
ix = 0;
63-
if ( dflag < 0.0 ) {
64-
dh11 = param[ 1 ];
65-
dh12 = param[ 3 ];
66-
dh21 = param[ 2 ];
67-
dh22 = param[ 4 ];
68-
for ( i = 0; i < N; i++ ) {
69-
w = x[ ix ];
70-
z = y[ ix ];
71-
x[ ix ] = ( w * dh11 ) + ( z * dh12 );
72-
y[ ix ] = ( w * dh21 ) + ( z * dh22 );
73-
ix += strideX;
74-
}
75-
return y;
76-
}
77-
if ( dflag === 0.0 ) {
78-
dh12 = param[ 3 ];
79-
dh21 = param[ 2 ];
80-
for ( i = 0; i < N; i++ ) {
81-
w = x[ ix ];
82-
z = y[ ix ];
83-
x[ ix ] = w + ( z * dh12 );
84-
y[ ix ] = ( w * dh21 ) + z;
85-
ix += strideX;
86-
}
87-
return y;
88-
}
89-
dh11 = param[ 1 ];
90-
dh22 = param[ 4 ];
91-
for ( i = 0; i < N; i++ ) {
92-
w = x[ ix ];
93-
z = y[ ix ];
94-
x[ ix ] = ( w * dh11 ) + z;
95-
y[ ix ] = -w + ( z * dh22 );
96-
ix += strideX;
97-
}
98-
return y;
99-
}
100-
if ( strideX < 0 ) {
101-
ix = ( 1 - N ) * strideX;
102-
} else {
103-
ix = 0;
104-
}
105-
if ( strideY < 0 ) {
106-
iy = ( 1 - N ) * strideY;
107-
} else {
108-
iy = 0;
109-
}
110-
if ( dflag < 0.0 ) {
111-
dh11 = param[ 1 ];
112-
dh12 = param[ 3 ];
113-
dh21 = param[ 2 ];
114-
dh22 = param[ 4 ];
115-
for ( i = 0; i < N; i++ ) {
116-
w = x[ ix ];
117-
z = y[ iy ];
118-
x[ ix ] = ( w * dh11 ) + ( z * dh12 );
119-
y[ iy ] = ( w * dh21 ) + ( z * dh22 );
120-
ix += strideX;
121-
iy += strideY;
122-
}
123-
return y;
124-
}
125-
if ( dflag === 0.0 ) {
126-
dh12 = param[ 3 ];
127-
dh21 = param[ 2 ];
128-
for ( i = 0; i < N; i++ ) {
129-
w = x[ ix ];
130-
z = y[ iy ];
131-
x[ ix ] = w + ( z * dh12 );
132-
y[ iy ] = ( w * dh21 ) + z;
133-
ix += strideX;
134-
iy += strideY;
135-
}
136-
return y;
137-
}
138-
dh11 = param[ 1 ];
139-
dh22 = param[ 4 ];
140-
for ( i = 0; i < N; i++ ) {
141-
w = x[ ix ];
142-
z = y[ iy ];
143-
x[ ix ] = ( w * dh11 ) + z;
144-
y[ iy ] = -w + ( z * dh22 );
145-
ix += strideX;
146-
iy += strideY;
147-
}
148-
return y;
60+
ix = stride2offset( N, strideX );
61+
iy = stride2offset( N, strideY );
62+
return ndarray( N, x, strideX, ix, y, strideY, iy, param );
14963
}
15064

15165

lib/node_modules/@stdlib/blas/base/dsdot/lib/dsdot.js

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818

1919
'use strict';
2020

21-
// VARIABLES //
21+
// MODULES //
2222

23-
var M = 5;
23+
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
24+
var ndarray = require( './ndarray.js' );
2425

2526

2627
// MAIN //
@@ -45,50 +46,14 @@ var M = 5;
4546
* // returns -5.0
4647
*/
4748
function dsdot( N, x, strideX, y, strideY ) {
48-
var dot;
4949
var ix;
5050
var iy;
51-
var m;
52-
var i;
53-
54-
dot = 0.0;
5551
if ( N <= 0 ) {
56-
return dot;
57-
}
58-
// Use unrolled loops if both strides are equal to `1`...
59-
if ( strideX === 1 && strideY === 1 ) {
60-
m = N % M;
61-
62-
// If we have a remainder, run a clean-up loop...
63-
if ( m > 0 ) {
64-
for ( i = 0; i < m; i++ ) {
65-
dot += x[ i ] * y[ i ];
66-
}
67-
}
68-
if ( N < M ) {
69-
return dot;
70-
}
71-
for ( i = m; i < N; i += M ) {
72-
dot += ( x[i]*y[i] ) + ( x[i+1]*y[i+1] ) + ( x[i+2]*y[i+2] ) + ( x[i+3]*y[i+3] ) + ( x[i+4]*y[i+4] ); // eslint-disable-line max-len
73-
}
74-
return dot;
75-
}
76-
if ( strideX < 0 ) {
77-
ix = ( 1-N ) * strideX;
78-
} else {
79-
ix = 0;
80-
}
81-
if ( strideY < 0 ) {
82-
iy = ( 1-N ) * strideY;
83-
} else {
84-
iy = 0;
85-
}
86-
for ( i = 0; i < N; i++ ) {
87-
dot += x[ ix ] * y[ iy ];
88-
ix += strideX;
89-
iy += strideY;
52+
return 0.0;
9053
}
91-
return dot;
54+
ix = stride2offset( N, strideX );
55+
iy = stride2offset( N, strideY );
56+
return ndarray( N, x, strideX, ix, y, strideY, iy );
9257
}
9358

9459

0 commit comments

Comments
 (0)