All files ndarray.js

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

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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 1143x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 21x 21x 21x 1x 1x 21x 2x 2x 21x 4x 4x 21x 4x 4x 10x 10x 21x 3x 3x 3x 3x 3x  
/**
* @license Apache-2.0
*
* Copyright (c) 2026 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 format = require( '@stdlib/string/format' );
var isPositiveInteger = require( '@stdlib/assert/is-positive-integer' );
var resolveMetricStr = require( '@stdlib/ml/base/kmeans/metric-resolve-str' );
var prng = require( './prng.js' );
var base = require( './base.js' );
 
 
// MAIN //
 
/**
* Initializes centroids by performing the k-means++ initialization procedure on double-precision floating-point data points using alternative indexing semantics.
*
* @param {PositiveInteger} M - number of data points
* @param {PositiveInteger} N - number of features
* @param {PositiveInteger} k - number of clusters
* @param {PositiveInteger} trials - number of potential centroids per iteration (>= 1)
* @param {string} metric - distance metric
* @param {Float64Array} X - input array
* @param {integer} sx1 - first stride length of `X`
* @param {integer} sx2 - second stride length of `X`
* @param {NonNegativeInteger} ox - starting index of `X`
* @param {Float64Array} out - output array
* @param {integer} so1 - first stride length of `out`
* @param {integer} so2 - second stride length of `out`
* @param {NonNegativeInteger} oo - starting index of `out`
* @param {Float64Array} W1 - first workspace array of size `2*M` for tracking squared distances and probabilities
* @param {integer} sw1 - stride length of `W1`
* @param {NonNegativeInteger} ow1 - starting index of `W1`
* @param {Float64Array} W2 - second workspace array for tracking centroid candidates
* @param {integer} sw2 - stride length of `W2`
* @param {NonNegativeInteger} ow2 - starting index of `W2`
* @param {Options} [options] - function options
* @param {PRNG} [options.prng] - pseudorandom number generator which generates uniformly distributed pseudorandom numbers
* @param {PRNGSeedMT19937} [options.seed] - pseudorandom number generator seed
* @param {PRNGStateMT19937} [options.state] - pseudorandom number generator state
* @param {boolean} [options.copy=true] - boolean indicating whether to copy a provided pseudorandom number generator state
* @throws {RangeError} first argument must be greater than or equal to third argument
* @throws {RangeError} fourth argument must be a positive integer
* @throws {TypeError} fifth argument must be a valid supported metric
* @returns {Float64Array} centroids
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
* var Int32Array = require( '@stdlib/array/int32' );
*
* var k = 3;
* var M = 5;
* var N = 2;
*
* var out = new Float64Array( k*N );
* var W1 = new Float64Array( 2*M );
* var W2 = new Int32Array( k );
*
* // Specify data points:
* var xbuf = new Float64Array([
*    0.0, 0.0,
*    1.0, 1.0,
*    1.0, -1.0,
*    -1.0, -1.0,
*    -1.0, 1.0
* ]);
*
* var opts = {
*    'seed': 1234
* }
*
* dkmeansInitPlusPlus( M, N, k, 3, 'sqeuclidean', xbuf, 2, 1, 0, out, 2, 1, 0, W1, 1, 0, W2, 1, 0, opts );
* // out => <Float64Array>[ 1.0, -1.0, 0.0, 0.0, -1.0, 1.0 ]
*/
function dkmeansInitPlusPlus( M, N, k, trials, metric, X, sx1, sx2, ox, out, so1, so2, oo, W1, sw1, ow1, W2, sw2, ow2, options ) { // eslint-disable-line max-len, max-params
	var generators;
	if ( k > M ) {
		throw new RangeError( format( 'invalid argument. First argument `M` must be greater than or equal to third argument `k`. Value: `M=%d, k=%d`.', M, k ) );
	}
	if ( !isPositiveInteger( trials ) ) {
		throw new RangeError( format( 'invalid argument. Fourth argument must be a positive integer. Value: `%d`.', trials ) );
	}
	if ( resolveMetricStr( metric ) === null ) {
		throw new TypeError( format( 'invalid argument. Fifth argument must be a valid supported metric. Value: `%s`.', metric ) );
	}
	if ( k < 1 || M < 1 || N < 1 ) {
		return out;
	}
	generators = prng( arguments.length > 19, options );
	return base( M, N, k, trials, metric, X, sx1, sx2, ox, out, so1, so2, oo, W1, sw1, ow1, W2, sw2, ow2, generators ); // eslint-disable-line max-len
}
 
 
// EXPORTS //
 
module.exports = dkmeansInitPlusPlus;