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 "); 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();