Files
fumen-measure-analyze/.old/predict-all.ts
2026-04-25 02:32:22 +09:00

71 lines
2.4 KiB
TypeScript

import { readdirSync, writeFileSync, existsSync } from 'fs';
import { join, extname, dirname } from 'path';
import { execSync } from 'child_process';
async function predictAll() {
const args = process.argv.slice(2);
if (args.length < 3) {
console.log("Usage: bun script/predict-all.ts <workingDir> <tjaDir> <outputPath>");
process.exit(1);
}
const workingDir = args[0];
const tjaDir = args[1];
const outputPath = args[2];
const targetDifficulties = ['oni', 'edit'];
if (!existsSync(tjaDir)) {
console.error(`❌ Directory not found: ${tjaDir}`);
process.exit(1);
}
const files = readdirSync(tjaDir).filter(file => extname(file).toLowerCase() === '.tja');
console.log(`📂 Found ${files.length} TJA files. Processing Oni & Edit...`);
const finalResults: any[] = [];
let i = 0;
for (const file of files) {
const fullPath = join(tjaDir, file);
for (const diff of targetDifficulties) {
try {
// 개별 예측 실행
const cmd = `bun script/predict.ts "${workingDir}" "${fullPath}" "${diff}"`;
const output = execSync(cmd, { stdio: ['pipe', 'pipe', 'ignore'] }).toString();
const match = output.match(/(?:Prediction|Predicted Difficulty):\s*(\d+\.\d+)/);
if (match) {
const value = parseFloat(match[1]);
console.log(`✅ [${file}] ${diff.toUpperCase()}: ${value}`);
finalResults.push({
filename: file,
difficulty_type: diff,
predicted_measure: value
});
}
} catch (e) {
// 해당 난이도가 없는 경우 조용히 넘어감
}
}
i++;
console.log(`${i}/${files.length}`)
}
// 결과 저장 (확장자에 따라 분기)
if (outputPath.endsWith('.json')) {
writeFileSync(outputPath, JSON.stringify(finalResults, null, 2));
} else {
// CSV 저장 (기본값)
const csvContent = [
"filename,difficulty,predicted_measure",
...finalResults.map(r => `"${r.filename}",${r.difficulty_type},${r.predicted_measure}`)
].join('\n');
writeFileSync(outputPath, csvContent);
}
console.log(`\n✨ Prediction complete! Results saved to: ${outputPath}`);
}
predictAll();