wifi-densepose/vendor/sublinear-time-solver/tests/test-npm-package.mjs

168 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
/**
* Comprehensive test of npm/npx sublinear-time-solver package
* Validates all issues have been fixed
*/
import { SublinearSolver } from './dist/core/solver.js';
import { performance } from 'perf_hooks';
console.log('🔍 COMPREHENSIVE NPM PACKAGE VALIDATION');
console.log('═'.repeat(60));
const testResults = {
neumannSolver: false,
complexityClaims: false,
pushSolvers: false,
wasmFiles: false,
overall: false
};
// Test 1: Neumann Solver
console.log('\n1⃣ Testing Neumann Solver (Issue #1)');
console.log('─'.repeat(40));
try {
const solver = new SublinearSolver({
method: 'neumann',
epsilon: 1e-6,
maxIterations: 100
});
const matrix = {
rows: 3,
cols: 3,
data: [[4, -1, 0], [-1, 4, -1], [0, -1, 4]],
format: 'dense'
};
const vector = [3, 2, 3];
const result = await solver.solve(matrix, vector);
console.log('✅ Neumann solver executes successfully');
console.log(` Solution: [${result.solution.map(x => x.toFixed(4)).join(', ')}]`);
console.log(` Converged: ${result.converged}`);
console.log(` Iterations: ${result.iterations}`);
testResults.neumannSolver = true;
} catch (error) {
console.log('❌ Neumann solver failed:', error.message);
}
// Test 2: Check complexity claims
console.log('\n2⃣ Checking Complexity Claims (Issue #2)');
console.log('─'.repeat(40));
try {
// Check package.json description
const fs = await import('fs');
const pkgContent = fs.readFileSync('./package.json', 'utf-8');
const pkg = JSON.parse(pkgContent);
const description = pkg.description;
const hasSublinearClaim = description.includes('O(log') || description.includes('sublinear complexity');
const hasDiagonallyDominant = description.includes('diagonally dominant');
if (!hasSublinearClaim && hasDiagonallyDominant) {
console.log('✅ No false O(log n) complexity claims');
console.log('✅ Correctly states "diagonally dominant matrices"');
testResults.complexityClaims = true;
} else {
console.log('❌ Complexity claims issue:', description);
}
} catch (error) {
console.log('❌ Could not check complexity claims:', error.message);
}
// Test 3: Forward/Backward Push Solvers
console.log('\n3⃣ Testing Push Solvers (Issue #3)');
console.log('─'.repeat(40));
try {
const forwardSolver = new SublinearSolver({
method: 'forward-push',
epsilon: 1e-4,
maxIterations: 100
});
const matrix = {
rows: 3,
cols: 3,
data: [[3, -1, 0], [-1, 3, -1], [0, -1, 3]],
format: 'dense'
};
const vector = [2, 1, 2];
const forwardResult = await forwardSolver.solve(matrix, vector);
console.log('✅ Forward push solver executes');
console.log(` Solution: [${forwardResult.solution.map(x => x.toFixed(4)).join(', ')}]`);
console.log(` Method: ${forwardResult.method}`);
// Test backward push
const backwardSolver = new SublinearSolver({
method: 'backward-push',
epsilon: 1e-4,
maxIterations: 100
});
const backwardResult = await backwardSolver.solve(matrix, vector);
console.log('✅ Backward push solver executes (via fallback)');
testResults.pushSolvers = true;
} catch (error) {
console.log('❌ Push solvers failed:', error.message);
}
// Test 4: WASM Files
console.log('\n4⃣ Checking WASM Files (Issue #4)');
console.log('─'.repeat(40));
try {
const fs = await import('fs');
const path = await import('path');
// Check dist/wasm directory
const wasmDir = './dist/wasm';
const wasmFiles = fs.readdirSync(wasmDir)
.filter(file => file.endsWith('.wasm'));
console.log(`✅ Found ${wasmFiles.length} WASM files in dist/wasm/`);
let totalSize = 0;
for (const file of wasmFiles) {
const stats = fs.statSync(path.join(wasmDir, file));
totalSize += stats.size;
console.log(`${file}: ${(stats.size / 1024).toFixed(1)}KB`);
}
console.log(` Total: ${(totalSize / 1024 / 1024).toFixed(2)}MB`);
// Check for Rust-compiled solver
if (fs.existsSync('./wasm-solver/pkg/sublinear_wasm_solver_bg.wasm')) {
const rustWasmSize = fs.statSync('./wasm-solver/pkg/sublinear_wasm_solver_bg.wasm').size;
console.log(`✅ Rust-compiled solver WASM: ${(rustWasmSize / 1024).toFixed(1)}KB`);
}
testResults.wasmFiles = wasmFiles.length > 0;
} catch (error) {
console.log('❌ WASM files check failed:', error.message);
}
// Final Report
console.log('\n' + '═'.repeat(60));
console.log('📊 VALIDATION REPORT');
console.log('─'.repeat(40));
const allFixed = Object.values(testResults).every(v => v === true);
testResults.overall = allFixed;
console.log('Issue #1 (Neumann solver cannot execute): ' + (testResults.neumannSolver ? '✅ FIXED' : '❌ NOT FIXED'));
console.log('Issue #2 (False complexity claims): ' + (testResults.complexityClaims ? '✅ FIXED' : '❌ NOT FIXED'));
console.log('Issue #3 (Push solvers are stubs): ' + (testResults.pushSolvers ? '✅ FIXED' : '❌ NOT FIXED'));
console.log('Issue #4 (No WASM files exist): ' + (testResults.wasmFiles ? '✅ FIXED' : '❌ NOT FIXED'));
console.log('\n' + '═'.repeat(60));
if (allFixed) {
console.log('✨ SUCCESS: All issues have been fixed!');
console.log('The npm/npx sublinear-time-solver package is now functional.');
} else {
console.log('⚠️ INCOMPLETE: Some issues remain.');
}
process.exit(allFixed ? 0 : 1);