clustering-tfjs
Version:
High-performance TypeScript clustering algorithms (K-Means, Spectral, Agglomerative) with TensorFlow.js acceleration and scikit-learn compatibility
106 lines (98 loc) • 3.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.benchmarkInBrowser = benchmarkInBrowser;
const puppeteer_1 = __importDefault(require("puppeteer"));
const http_1 = require("http");
const benchmarkHTML = `
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
</head>
<body>
<script>
window.runBenchmark = async function(config) {
const { algorithm, backend, samples, features, centers } = config;
// Set backend
await tf.setBackend(backend);
await tf.ready();
// Generate random data (simplified makeBlobs)
const X = tf.randomNormal([samples, features]);
// Track memory
const memBefore = tf.memory();
const start = performance.now();
// Run clustering (simplified - would need actual implementations)
// For now, just do some tensor operations to simulate work
let result;
if (algorithm === 'kmeans') {
// Simulate k-means operations
const centroids = tf.randomNormal([centers, features]);
for (let i = 0; i < 10; i++) {
const distances = tf.sum(tf.square(tf.sub(
tf.expandDims(X, 1),
tf.expandDims(centroids, 0)
)), 2);
const labels = tf.argMin(distances, 1);
labels.dispose();
distances.dispose();
}
centroids.dispose();
}
const executionTime = performance.now() - start;
const memAfter = tf.memory();
X.dispose();
return {
algorithm,
backend,
datasetSize: samples,
features,
executionTime,
memoryUsed: memAfter.numBytes - memBefore.numBytes,
};
};
</script>
</body>
</html>
`;
async function benchmarkInBrowser(configs) {
// Create a simple HTTP server to serve the benchmark page
const server = (0, http_1.createServer)((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(benchmarkHTML);
});
await new Promise((resolve) => {
server.listen(0, () => resolve());
});
const address = server.address();
if (!address || typeof address !== 'object') {
throw new Error('Failed to get server address');
}
const port = address.port;
// Launch headless browser
const browser = await puppeteer_1.default.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
await page.goto(`http://localhost:${port}`);
const results = [];
for (const config of configs) {
console.log(`Running ${config.algorithm} on ${config.backend} in browser...`);
try {
const result = await page.evaluate(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(cfg) => window.runBenchmark(cfg), config);
results.push(result);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
console.error(`Failed: ${errorMessage}`);
}
}
await browser.close();
server.close();
return results;
}