- M1 数据生成器:采样/老师/距离下界认证/时间律/统计/一致性门禁;确定性老师(碰撞次数计时 + resetSession)、pos 任务冻结 J6、--consensus 邻域共识过滤、Dr 类。 - 全流程代码与运行手册:数据打包/可微运动学与对拍/MeanFlow+WTA 模型/闭环仿真/APG/挖错循环/ONNX 导出;webapp 策略运行时 ik-policy.js、?policy=1 接入、tests/policy_bench.cjs;ik-solver 增 pairList/clusterExport/criticalPairs/pairGap/leverTable。
26 lines
1.4 KiB
JavaScript
26 lines
1.4 KiB
JavaScript
/* 对拍数据:JS 侧 fk / orient / gapMatrix / 特征(ik-policy.js)→ ml/data/parity.json
|
|
* node ml/eval/dump_parity.cjs [N=2000]
|
|
* 然后 python -m ml.eval.check_parity 比对 PyTorch 版。 */
|
|
'use strict';
|
|
const fs = require('fs'), path = require('path');
|
|
const N = +process.argv[2] || 2000;
|
|
const { S } = require('../../tests/route_bench_setup.cjs')();
|
|
const POL = require('../../webapp/js/ik-policy.js');
|
|
const L = S.LIM, O = S.ORDER;
|
|
let st = 99; const rnd = () => { st = (st * 1664525 + 1013904223) >>> 0; return st / 4294967296; };
|
|
const rq = () => O.map(id => L[id].lo + rnd() * (L[id].hi - L[id].lo));
|
|
const recs = [];
|
|
for (let n = 0; n < N; n++) {
|
|
const q = rq(), qp = q.map((v, i) => v - (rnd() - 0.5) * 2);
|
|
const b = rq(); const T = S.fk(b, 0); const pose = rnd() < 0.5; const R = pose ? S.orient(b) : null;
|
|
const r = Math.floor(rnd() * 4); const prefix = []; for (let k = 0; k < r; k++) prefix.push(q.map(() => (rnd() - 0.5) * 2));
|
|
const sub = rnd() < 0.5 ? rq() : null;
|
|
const st0 = { q, qPrev: qp, T, R, prefix, sub };
|
|
const f = POL.features(S, st0);
|
|
recs.push({ q, qPrev: qp, T, R, prefix, sub, fk: S.fk(q, 0), orient: S.orient(q), gm: Array.from(S.gapMatrix(q, 40)), feat: Array.from(f) });
|
|
}
|
|
const out = path.join(__dirname, '../data/parity.json');
|
|
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
fs.writeFileSync(out, JSON.stringify({ fp: S.modelFingerprint(), recs }));
|
|
console.log('wrote', out, recs.length);
|