All files init_clusters.js

50% Statements 47/94
100% Branches 1/1
0% Functions 0/1
50% Lines 47/94

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 951x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                                                                               1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2018 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 closestCentroid = require( './find_closest_centroid.js' );
var updateCentroid = require( './update_centroid.js' );
 
 
// MAIN //
 
/**
* Initializes clusters and associated statistics given a set of centroids.
*
* ## Notes
*
* -   We follow the same approach when calculating cluster statistics as if the centroids had been provided by a user (i.e., not computed internally), as this ensures consistency with how statistics are computed when subsequent data vectors are provided to the accumulator.
*
* @private
* @param {ndarray} data - matrix containing data points
* @param {ndarray} centroids - matrix containing centroids
* @param {ndarray} stats - matrix containing cluster statistics
* @param {Function} acc - cluster statistics accumulator
* @param {Function} dist - distance function
*/
function clusters( data, centroids, stats, acc, dist ) {
	var ndims;
	var cbuf;
	var dbuf;
	var npts;
	var sc;
	var sd;
	var oc;
	var od;
	var N;
	var k;
	var c;
	var d;
	var i;

	k = centroids.shape[ 0 ];
	ndims = centroids.shape[ 1 ];
	npts = data.shape[ 0 ];

	cbuf = centroids.data;
	sc = centroids.strides[ 0 ];

	dbuf = data.data;
	sd = data.strides[ 0 ];
	od = 0;

	for ( i = 0; i < npts; i++ ) {
		// Find the closest centroid by computing the distance from the provided data point to each centroid:
		c = closestCentroid( dist, k, ndims, cbuf, sc, 0, dbuf, 1, od ); // Magic numbers arise from knowing that matrices are row-major single-segment contiguous

		// Compute the centroids buffer index offset to point to the closest centroid:
		oc = sc * c;

		// Update the closest centroid:
		N = stats.get( c, 0 ) + 1;
		updateCentroid( ndims, N, cbuf, 1, oc, dbuf, 1, od ); // Magic number `1` as we know that these matrices are row-major single-segment contiguous

		// Recompute the distance based on the updated centroid position:
		d = dist( ndims, cbuf, 1, oc, dbuf, 1, od ); // Magic number `1` as we know that these matrices are row-major single-segment contiguous

		// Update cluster statistics:
		acc( c, d );

		// Increment the data buffer index offset to point to the next data point:
		od += sd;
	}
}
 
 
// EXPORTS //
 
module.exports = clusters;