@rotifer/playground 0.5.0-alpha.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +159 -15
- package/LICENSE +1 -1
- package/README.md +51 -23
- package/README.zh.md +54 -25
- package/dist/cloud/auth.d.ts +7 -1
- package/dist/cloud/auth.d.ts.map +1 -1
- package/dist/cloud/auth.js +65 -1
- package/dist/cloud/auth.js.map +1 -1
- package/dist/cloud/client.d.ts +4 -1
- package/dist/cloud/client.d.ts.map +1 -1
- package/dist/cloud/client.js +9 -2
- package/dist/cloud/client.js.map +1 -1
- package/dist/cloud/types.d.ts +3 -1
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/cloud/types.js.map +1 -1
- package/dist/commands/agent-create.d.ts.map +1 -1
- package/dist/commands/agent-create.js +66 -3
- package/dist/commands/agent-create.js.map +1 -1
- package/dist/commands/agent-run.d.ts.map +1 -1
- package/dist/commands/agent-run.js +296 -32
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/arena-submit.d.ts.map +1 -1
- package/dist/commands/arena-submit.js +45 -17
- package/dist/commands/arena-submit.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +9 -3
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +13 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +23 -16
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/network.js +4 -4
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +162 -44
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +209 -23
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +17 -1
- package/dist/commands/wrap.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/runtime/network-gateway.d.ts +53 -0
- package/dist/runtime/network-gateway.d.ts.map +1 -0
- package/dist/runtime/network-gateway.js +147 -0
- package/dist/runtime/network-gateway.js.map +1 -0
- package/dist/utils/binding.d.ts +25 -0
- package/dist/utils/binding.d.ts.map +1 -1
- package/dist/utils/binding.js.map +1 -1
- package/dist/utils/open-browser.d.ts +10 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +23 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/genes/academic-writer/.cloud-manifest.json +6 -0
- package/genes/academic-writer/.gene-manifest.json +8 -0
- package/genes/academic-writer/SKILL.md +274 -0
- package/genes/academic-writer/phenotype.json +28 -0
- package/genes/ai-components/.cloud-manifest.json +6 -0
- package/genes/ai-components/.gene-manifest.json +8 -0
- package/genes/ai-components/SKILL.md +381 -0
- package/genes/ai-components/phenotype.json +28 -0
- package/genes/algorithmic-art/.cloud-manifest.json +6 -0
- package/genes/algorithmic-art/.gene-manifest.json +8 -0
- package/genes/algorithmic-art/SKILL.md +405 -0
- package/genes/algorithmic-art/phenotype.json +28 -0
- package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
- package/genes/answer-synthesizer/index.ts +194 -0
- package/genes/answer-synthesizer/phenotype.json +61 -0
- package/genes/api-designer/.cloud-manifest.json +6 -0
- package/genes/api-designer/.gene-manifest.json +8 -0
- package/genes/api-designer/SKILL.md +456 -0
- package/genes/api-designer/phenotype.json +28 -0
- package/genes/auto-coder/.cloud-manifest.json +6 -0
- package/genes/auto-coder/.gene-manifest.json +8 -0
- package/genes/auto-coder/SKILL.md +400 -0
- package/genes/auto-coder/phenotype.json +28 -0
- package/genes/auto-writer/.cloud-manifest.json +6 -0
- package/genes/auto-writer/.gene-manifest.json +8 -0
- package/genes/auto-writer/SKILL.md +361 -0
- package/genes/auto-writer/phenotype.json +28 -0
- package/genes/brand-personality/.cloud-manifest.json +6 -0
- package/genes/brand-personality/.gene-manifest.json +8 -0
- package/genes/brand-personality/SKILL.md +549 -0
- package/genes/brand-personality/phenotype.json +28 -0
- package/genes/business-writer/.cloud-manifest.json +6 -0
- package/genes/business-writer/.gene-manifest.json +8 -0
- package/genes/business-writer/SKILL.md +448 -0
- package/genes/business-writer/phenotype.json +28 -0
- package/genes/citation-manager/.cloud-manifest.json +6 -0
- package/genes/citation-manager/.gene-manifest.json +8 -0
- package/genes/citation-manager/SKILL.md +279 -0
- package/genes/citation-manager/index.ts +162 -0
- package/genes/citation-manager/package.json +1 -0
- package/genes/citation-manager/phenotype.json +50 -0
- package/genes/code-complexity/.cloud-manifest.json +6 -0
- package/genes/code-complexity/README.md +35 -0
- package/genes/code-complexity/index.ts +101 -0
- package/genes/code-complexity/phenotype.json +34 -0
- package/genes/copywriter/.cloud-manifest.json +6 -0
- package/genes/copywriter/.gene-manifest.json +8 -0
- package/genes/copywriter/SKILL.md +329 -0
- package/genes/copywriter/phenotype.json +28 -0
- package/genes/creative-writer/.cloud-manifest.json +6 -0
- package/genes/creative-writer/.gene-manifest.json +8 -0
- package/genes/creative-writer/SKILL.md +356 -0
- package/genes/creative-writer/phenotype.json +28 -0
- package/genes/data-modeler/.cloud-manifest.json +6 -0
- package/genes/data-modeler/.gene-manifest.json +8 -0
- package/genes/data-modeler/SKILL.md +486 -0
- package/genes/data-modeler/phenotype.json +28 -0
- package/genes/debugger/.cloud-manifest.json +6 -0
- package/genes/debugger/.gene-manifest.json +8 -0
- package/genes/debugger/SKILL.md +416 -0
- package/genes/debugger/phenotype.json +28 -0
- package/genes/design-tokens/.cloud-manifest.json +6 -0
- package/genes/design-tokens/.gene-manifest.json +8 -0
- package/genes/design-tokens/SKILL.md +222 -0
- package/genes/design-tokens/index.ts +128 -0
- package/genes/design-tokens/package.json +1 -0
- package/genes/design-tokens/phenotype.json +1 -0
- package/genes/devops-automator/.cloud-manifest.json +6 -0
- package/genes/devops-automator/.gene-manifest.json +8 -0
- package/genes/devops-automator/SKILL.md +490 -0
- package/genes/devops-automator/phenotype.json +28 -0
- package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
- package/genes/doc-coauthoring/.gene-manifest.json +8 -0
- package/genes/doc-coauthoring/SKILL.md +375 -0
- package/genes/doc-coauthoring/phenotype.json +28 -0
- package/genes/doc-retrieval/.cloud-manifest.json +6 -0
- package/genes/doc-retrieval/index.ts +134 -0
- package/genes/doc-retrieval/phenotype.json +54 -0
- package/genes/docs-writer/.cloud-manifest.json +6 -0
- package/genes/docs-writer/.gene-manifest.json +8 -0
- package/genes/docs-writer/SKILL.md +492 -0
- package/genes/docs-writer/phenotype.json +28 -0
- package/genes/evolve-life/.cloud-manifest.json +6 -0
- package/genes/evolve-life/.compile-result.json +12 -0
- package/genes/evolve-life/README.md +52 -0
- package/genes/evolve-life/gene.ir.wasm +0 -0
- package/genes/evolve-life/gene.wasm +0 -0
- package/genes/evolve-life/index.ts +255 -0
- package/genes/evolve-life/phenotype.json +129 -0
- package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
- package/genes/evolve-life-bitwise/.compile-result.json +12 -0
- package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
- package/genes/evolve-life-bitwise/gene.wasm +0 -0
- package/genes/evolve-life-bitwise/index.ts +273 -0
- package/genes/evolve-life-bitwise/phenotype.json +129 -0
- package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
- package/genes/evolve-life-sparse/.compile-result.json +12 -0
- package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
- package/genes/evolve-life-sparse/gene.wasm +0 -0
- package/genes/evolve-life-sparse/index.ts +236 -0
- package/genes/evolve-life-sparse/phenotype.json +129 -0
- package/genes/fact-checker/.cloud-manifest.json +6 -0
- package/genes/fact-checker/.gene-manifest.json +8 -0
- package/genes/fact-checker/SKILL.md +373 -0
- package/genes/fact-checker/phenotype.json +28 -0
- package/genes/genesis-code-format/.cloud-manifest.json +6 -0
- package/genes/genesis-code-format/package.json +1 -0
- package/genes/genesis-code-format/phenotype.json +1 -0
- package/genes/genesis-file-read/.cloud-manifest.json +6 -0
- package/genes/genesis-file-read/index.ts +11 -1
- package/genes/genesis-file-read/package.json +1 -0
- package/genes/genesis-file-read/phenotype.json +1 -0
- package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
- package/genes/genesis-l0-constraint/package.json +1 -0
- package/genes/genesis-l0-constraint/phenotype.json +1 -0
- package/genes/genesis-web-search/.cloud-manifest.json +2 -2
- package/genes/genesis-web-search/package.json +1 -0
- package/genes/genesis-web-search/phenotype.json +1 -0
- package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
- package/genes/genesis-web-search-lite/package.json +1 -0
- package/genes/genesis-web-search-lite/phenotype.json +1 -0
- package/genes/git-workflow/.cloud-manifest.json +6 -0
- package/genes/git-workflow/.gene-manifest.json +8 -0
- package/genes/git-workflow/SKILL.md +407 -0
- package/genes/git-workflow/phenotype.json +28 -0
- package/genes/grammar-checker/.cloud-manifest.json +6 -0
- package/genes/grammar-checker/.gene-manifest.json +8 -0
- package/genes/grammar-checker/SKILL.md +194 -0
- package/genes/grammar-checker/index.ts +168 -0
- package/genes/grammar-checker/package.json +1 -0
- package/genes/grammar-checker/phenotype.json +52 -0
- package/genes/json-validator/.cloud-manifest.json +6 -0
- package/genes/json-validator/README.md +42 -0
- package/genes/json-validator/index.ts +112 -0
- package/genes/json-validator/phenotype.json +42 -0
- package/genes/license-advisor/.cloud-manifest.json +6 -0
- package/genes/license-advisor/.gene-manifest.json +8 -0
- package/genes/license-advisor/SKILL.md +117 -0
- package/genes/license-advisor/phenotype.json +28 -0
- package/genes/logic-architect/.cloud-manifest.json +6 -0
- package/genes/logic-architect/.gene-manifest.json +8 -0
- package/genes/logic-architect/SKILL.md +451 -0
- package/genes/logic-architect/phenotype.json +28 -0
- package/genes/markdown-formatter/.cloud-manifest.json +6 -0
- package/genes/markdown-formatter/README.md +34 -0
- package/genes/markdown-formatter/index.ts +86 -0
- package/genes/markdown-formatter/phenotype.json +32 -0
- package/genes/orch/.cloud-manifest.json +6 -0
- package/genes/orch/.gene-manifest.json +8 -0
- package/genes/orch/SKILL.md +504 -0
- package/genes/orch/phenotype.json +28 -0
- package/genes/particle-barneshut/.cloud-manifest.json +6 -0
- package/genes/particle-barneshut/.compile-result.json +12 -0
- package/genes/particle-barneshut/README.md +55 -0
- package/genes/particle-barneshut/gene.ir.wasm +0 -0
- package/genes/particle-barneshut/gene.wasm +0 -0
- package/genes/particle-barneshut/index.ts +486 -0
- package/genes/particle-barneshut/phenotype.json +137 -0
- package/genes/particle-brute/.cloud-manifest.json +6 -0
- package/genes/particle-brute/.compile-result.json +12 -0
- package/genes/particle-brute/README.md +55 -0
- package/genes/particle-brute/gene.ir.wasm +0 -0
- package/genes/particle-brute/gene.wasm +0 -0
- package/genes/particle-brute/index.ts +277 -0
- package/genes/particle-brute/phenotype.json +137 -0
- package/genes/particle-spatial/.cloud-manifest.json +6 -0
- package/genes/particle-spatial/.compile-result.json +12 -0
- package/genes/particle-spatial/README.md +53 -0
- package/genes/particle-spatial/gene.ir.wasm +0 -0
- package/genes/particle-spatial/gene.wasm +0 -0
- package/genes/particle-spatial/index.ts +352 -0
- package/genes/particle-spatial/phenotype.json +137 -0
- package/genes/performance-optimizer/.cloud-manifest.json +6 -0
- package/genes/performance-optimizer/.gene-manifest.json +8 -0
- package/genes/performance-optimizer/SKILL.md +480 -0
- package/genes/performance-optimizer/phenotype.json +28 -0
- package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
- package/genes/plagiarism-checker/.gene-manifest.json +8 -0
- package/genes/plagiarism-checker/SKILL.md +342 -0
- package/genes/plagiarism-checker/phenotype.json +28 -0
- package/genes/product-manager/.cloud-manifest.json +6 -0
- package/genes/product-manager/.gene-manifest.json +8 -0
- package/genes/product-manager/SKILL.md +249 -0
- package/genes/product-manager/phenotype.json +28 -0
- package/genes/project-reviewer/.cloud-manifest.json +6 -0
- package/genes/project-reviewer/.gene-manifest.json +8 -0
- package/genes/project-reviewer/SKILL.md +312 -0
- package/genes/project-reviewer/phenotype.json +28 -0
- package/genes/prompt-engineer/.cloud-manifest.json +6 -0
- package/genes/prompt-engineer/.gene-manifest.json +8 -0
- package/genes/prompt-engineer/SKILL.md +411 -0
- package/genes/prompt-engineer/phenotype.json +28 -0
- package/genes/readability-analyzer/.cloud-manifest.json +6 -0
- package/genes/readability-analyzer/.gene-manifest.json +8 -0
- package/genes/readability-analyzer/SKILL.md +357 -0
- package/genes/readability-analyzer/index.ts +123 -0
- package/genes/readability-analyzer/package.json +1 -0
- package/genes/readability-analyzer/phenotype.json +35 -0
- package/genes/rotifer-protocol/SKILL.md +121 -0
- package/genes/security-auditor/.cloud-manifest.json +6 -0
- package/genes/security-auditor/.gene-manifest.json +8 -0
- package/genes/security-auditor/SKILL.md +494 -0
- package/genes/security-auditor/phenotype.json +28 -0
- package/genes/seo-optimizer/.cloud-manifest.json +6 -0
- package/genes/seo-optimizer/.gene-manifest.json +8 -0
- package/genes/seo-optimizer/SKILL.md +327 -0
- package/genes/seo-optimizer/index.ts +206 -0
- package/genes/seo-optimizer/package.json +1 -0
- package/genes/seo-optimizer/phenotype.json +1 -0
- package/genes/source-linker/.cloud-manifest.json +6 -0
- package/genes/source-linker/index.ts +88 -0
- package/genes/source-linker/phenotype.json +45 -0
- package/genes/style-optimizer/.cloud-manifest.json +6 -0
- package/genes/style-optimizer/.gene-manifest.json +8 -0
- package/genes/style-optimizer/SKILL.md +285 -0
- package/genes/style-optimizer/phenotype.json +28 -0
- package/genes/tech-lead/.cloud-manifest.json +6 -0
- package/genes/tech-lead/.gene-manifest.json +8 -0
- package/genes/tech-lead/SKILL.md +451 -0
- package/genes/tech-lead/phenotype.json +28 -0
- package/genes/test-wrap/.cloud-manifest.json +6 -0
- package/genes/test-wrap/.gene-manifest.json +8 -0
- package/genes/test-wrap/phenotype.json +28 -0
- package/genes/testing-strategist/.cloud-manifest.json +6 -0
- package/genes/testing-strategist/.gene-manifest.json +8 -0
- package/genes/testing-strategist/SKILL.md +500 -0
- package/genes/testing-strategist/phenotype.json +28 -0
- package/genes/text-summarizer/.cloud-manifest.json +6 -0
- package/genes/text-summarizer/README.md +34 -0
- package/genes/text-summarizer/index.ts +122 -0
- package/genes/text-summarizer/phenotype.json +32 -0
- package/genes/tone-analyzer/.cloud-manifest.json +6 -0
- package/genes/tone-analyzer/.gene-manifest.json +8 -0
- package/genes/tone-analyzer/SKILL.md +410 -0
- package/genes/tone-analyzer/phenotype.json +28 -0
- package/genes/translator/.cloud-manifest.json +6 -0
- package/genes/translator/.gene-manifest.json +8 -0
- package/genes/translator/SKILL.md +355 -0
- package/genes/translator/phenotype.json +28 -0
- package/genes/ui-components/.cloud-manifest.json +6 -0
- package/genes/ui-components/.gene-manifest.json +8 -0
- package/genes/ui-components/SKILL.md +467 -0
- package/genes/ui-components/phenotype.json +28 -0
- package/genes/uiux-designer/.cloud-manifest.json +6 -0
- package/genes/uiux-designer/.gene-manifest.json +8 -0
- package/genes/uiux-designer/SKILL.md +353 -0
- package/genes/uiux-designer/phenotype.json +28 -0
- package/genes/url-extractor/.cloud-manifest.json +6 -0
- package/genes/url-extractor/README.md +37 -0
- package/genes/url-extractor/index.ts +86 -0
- package/genes/url-extractor/phenotype.json +48 -0
- package/genes/ux-patterns/.cloud-manifest.json +6 -0
- package/genes/ux-patterns/.gene-manifest.json +8 -0
- package/genes/ux-patterns/SKILL.md +872 -0
- package/genes/ux-patterns/phenotype.json +28 -0
- package/genes/web3-components/.cloud-manifest.json +6 -0
- package/genes/web3-components/.gene-manifest.json +8 -0
- package/genes/web3-components/SKILL.md +390 -0
- package/genes/web3-components/phenotype.json +28 -0
- package/package.json +6 -5
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
interface Particle {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
vx: number;
|
|
5
|
+
vy: number;
|
|
6
|
+
mass: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface ParticleInput {
|
|
10
|
+
particles?: Particle[];
|
|
11
|
+
preset?: "solar" | "binary" | "cluster" | "collision";
|
|
12
|
+
count?: number;
|
|
13
|
+
steps?: number;
|
|
14
|
+
dt?: number;
|
|
15
|
+
G?: number;
|
|
16
|
+
softening?: number;
|
|
17
|
+
seed?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface ParticleOutput {
|
|
21
|
+
particles: Particle[];
|
|
22
|
+
steps_computed: number;
|
|
23
|
+
total_energy: number;
|
|
24
|
+
interactions_computed: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function mulberry32(seed: number): () => number {
|
|
28
|
+
let s = seed | 0;
|
|
29
|
+
return () => {
|
|
30
|
+
s = (s + 0x6d2b79f5) | 0;
|
|
31
|
+
let t = Math.imul(s ^ (s >>> 15), 1 | s);
|
|
32
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
33
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function generatePreset(
|
|
38
|
+
preset: "solar" | "binary" | "cluster" | "collision",
|
|
39
|
+
count: number,
|
|
40
|
+
seed: number
|
|
41
|
+
): Particle[] {
|
|
42
|
+
const rng = mulberry32(seed);
|
|
43
|
+
const G = 1.0;
|
|
44
|
+
|
|
45
|
+
switch (preset) {
|
|
46
|
+
case "solar": {
|
|
47
|
+
const particles: Particle[] = [];
|
|
48
|
+
const M_central = 100;
|
|
49
|
+
particles.push({ x: 0, y: 0, vx: 0, vy: 0, mass: M_central });
|
|
50
|
+
|
|
51
|
+
const nOrbiters = Math.min(count - 1, 63);
|
|
52
|
+
for (let i = 0; i < nOrbiters; i++) {
|
|
53
|
+
const r = 2 + rng() * 8;
|
|
54
|
+
const theta = rng() * 2 * Math.PI;
|
|
55
|
+
const x = r * Math.cos(theta);
|
|
56
|
+
const y = r * Math.sin(theta);
|
|
57
|
+
const v = Math.sqrt((G * M_central) / r);
|
|
58
|
+
const vx = -v * Math.sin(theta);
|
|
59
|
+
const vy = v * Math.cos(theta);
|
|
60
|
+
const mass = 0.1 + rng() * 0.9;
|
|
61
|
+
particles.push({ x, y, vx, vy, mass });
|
|
62
|
+
}
|
|
63
|
+
return particles;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
case "binary": {
|
|
67
|
+
const particles: Particle[] = [];
|
|
68
|
+
const m1 = 50;
|
|
69
|
+
const m2 = 50;
|
|
70
|
+
const d = 4;
|
|
71
|
+
const r1 = (d * m2) / (m1 + m2);
|
|
72
|
+
const r2 = (d * m1) / (m1 + m2);
|
|
73
|
+
const omega = Math.sqrt((G * (m1 + m2)) / (d * d * d));
|
|
74
|
+
const v1 = omega * r1;
|
|
75
|
+
const v2 = omega * r2;
|
|
76
|
+
|
|
77
|
+
particles.push({ x: -r1, y: 0, vx: 0, vy: -v1, mass: m1 });
|
|
78
|
+
particles.push({ x: r2, y: 0, vx: 0, vy: v2, mass: m2 });
|
|
79
|
+
|
|
80
|
+
const nDebris = Math.min(count - 2, 62);
|
|
81
|
+
for (let i = 0; i < nDebris; i++) {
|
|
82
|
+
const r = 6 + rng() * 4;
|
|
83
|
+
const theta = rng() * 2 * Math.PI;
|
|
84
|
+
const x = r * Math.cos(theta);
|
|
85
|
+
const y = r * Math.sin(theta);
|
|
86
|
+
const v = Math.sqrt((G * (m1 + m2)) / r) * (0.8 + rng() * 0.4);
|
|
87
|
+
const vx = -v * Math.sin(theta);
|
|
88
|
+
const vy = v * Math.cos(theta);
|
|
89
|
+
const mass = 0.1 + rng() * 0.5;
|
|
90
|
+
particles.push({ x, y, vx, vy, mass });
|
|
91
|
+
}
|
|
92
|
+
return particles;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
case "cluster": {
|
|
96
|
+
const particles: Particle[] = [];
|
|
97
|
+
const radius = 5;
|
|
98
|
+
for (let i = 0; i < count; i++) {
|
|
99
|
+
const r = radius * Math.sqrt(rng());
|
|
100
|
+
const theta = rng() * 2 * Math.PI;
|
|
101
|
+
const x = r * Math.cos(theta);
|
|
102
|
+
const y = r * Math.sin(theta);
|
|
103
|
+
const vMax = 0.3;
|
|
104
|
+
const vx = (rng() - 0.5) * 2 * vMax;
|
|
105
|
+
const vy = (rng() - 0.5) * 2 * vMax;
|
|
106
|
+
const mass = 0.5 + rng() * 1.5;
|
|
107
|
+
particles.push({ x, y, vx, vy, mass });
|
|
108
|
+
}
|
|
109
|
+
return particles;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
case "collision": {
|
|
113
|
+
const particles: Particle[] = [];
|
|
114
|
+
const half = Math.floor(count / 2);
|
|
115
|
+
const sep = 10;
|
|
116
|
+
const vApproach = 1.5;
|
|
117
|
+
|
|
118
|
+
for (let i = 0; i < half; i++) {
|
|
119
|
+
const x = -sep + (rng() - 0.5) * 4;
|
|
120
|
+
const y = (rng() - 0.5) * 4;
|
|
121
|
+
const vx = vApproach + (rng() - 0.5) * 0.4;
|
|
122
|
+
const vy = (rng() - 0.5) * 0.4;
|
|
123
|
+
const mass = 0.5 + rng() * 1.5;
|
|
124
|
+
particles.push({ x, y, vx, vy, mass });
|
|
125
|
+
}
|
|
126
|
+
for (let i = 0; i < count - half; i++) {
|
|
127
|
+
const x = sep + (rng() - 0.5) * 4;
|
|
128
|
+
const y = (rng() - 0.5) * 4;
|
|
129
|
+
const vx = -vApproach + (rng() - 0.5) * 0.4;
|
|
130
|
+
const vy = (rng() - 0.5) * 0.4;
|
|
131
|
+
const mass = 0.5 + rng() * 1.5;
|
|
132
|
+
particles.push({ x, y, vx, vy, mass });
|
|
133
|
+
}
|
|
134
|
+
return particles;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
default:
|
|
138
|
+
return generatePreset("cluster", count, seed);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function computeTotalEnergy(
|
|
143
|
+
particles: Particle[],
|
|
144
|
+
G: number,
|
|
145
|
+
softening: number
|
|
146
|
+
): number {
|
|
147
|
+
let kinetic = 0;
|
|
148
|
+
let potential = 0;
|
|
149
|
+
const n = particles.length;
|
|
150
|
+
|
|
151
|
+
for (let i = 0; i < n; i++) {
|
|
152
|
+
const p = particles[i];
|
|
153
|
+
kinetic += 0.5 * p.mass * (p.vx * p.vx + p.vy * p.vy);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
for (let i = 0; i < n; i++) {
|
|
157
|
+
for (let j = i + 1; j < n; j++) {
|
|
158
|
+
const pi = particles[i];
|
|
159
|
+
const pj = particles[j];
|
|
160
|
+
const dx = pj.x - pi.x;
|
|
161
|
+
const dy = pj.y - pi.y;
|
|
162
|
+
const rSq = dx * dx + dy * dy + softening * softening;
|
|
163
|
+
const r = Math.sqrt(rSq);
|
|
164
|
+
potential -= (G * pi.mass * pj.mass) / r;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return kinetic + potential;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export async function express(input: ParticleInput): Promise<ParticleOutput> {
|
|
172
|
+
const count = Math.max(2, Math.min(2048, input.count ?? 64));
|
|
173
|
+
const steps = Math.max(1, Math.min(10000, input.steps ?? 100));
|
|
174
|
+
const dt = input.dt ?? 0.01;
|
|
175
|
+
const G = input.G ?? 1.0;
|
|
176
|
+
const softening = input.softening ?? 0.01;
|
|
177
|
+
const seed = input.seed ?? 42;
|
|
178
|
+
|
|
179
|
+
let particles: Particle[];
|
|
180
|
+
|
|
181
|
+
if (input.particles && input.particles.length > 0) {
|
|
182
|
+
particles = input.particles.map((p) => ({
|
|
183
|
+
x: p.x,
|
|
184
|
+
y: p.y,
|
|
185
|
+
vx: p.vx,
|
|
186
|
+
vy: p.vy,
|
|
187
|
+
mass: p.mass,
|
|
188
|
+
}));
|
|
189
|
+
} else {
|
|
190
|
+
const preset = input.preset ?? "cluster";
|
|
191
|
+
particles = generatePreset(preset, count, seed);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const n = particles.length;
|
|
195
|
+
const pairsPerStep = (n * (n - 1)) / 2;
|
|
196
|
+
let interactionsComputed = 0;
|
|
197
|
+
|
|
198
|
+
const ax = new Float64Array(n);
|
|
199
|
+
const ay = new Float64Array(n);
|
|
200
|
+
|
|
201
|
+
for (let stepIdx = 0; stepIdx < steps; stepIdx++) {
|
|
202
|
+
ax.fill(0);
|
|
203
|
+
ay.fill(0);
|
|
204
|
+
|
|
205
|
+
for (let i = 0; i < n; i++) {
|
|
206
|
+
for (let j = i + 1; j < n; j++) {
|
|
207
|
+
const pi = particles[i];
|
|
208
|
+
const pj = particles[j];
|
|
209
|
+
const dx = pj.x - pi.x;
|
|
210
|
+
const dy = pj.y - pi.y;
|
|
211
|
+
const rSq = dx * dx + dy * dy + softening * softening;
|
|
212
|
+
const rSoft = Math.pow(rSq, 1.5);
|
|
213
|
+
const factor = G / rSoft;
|
|
214
|
+
|
|
215
|
+
const axij = factor * pj.mass * dx;
|
|
216
|
+
const ayij = factor * pj.mass * dy;
|
|
217
|
+
|
|
218
|
+
ax[i] += axij;
|
|
219
|
+
ay[i] += ayij;
|
|
220
|
+
ax[j] -= factor * pi.mass * dx;
|
|
221
|
+
ay[j] -= factor * pi.mass * dy;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
interactionsComputed += pairsPerStep;
|
|
225
|
+
|
|
226
|
+
for (let i = 0; i < n; i++) {
|
|
227
|
+
const p = particles[i];
|
|
228
|
+
p.vx += 0.5 * dt * ax[i];
|
|
229
|
+
p.vy += 0.5 * dt * ay[i];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
for (let i = 0; i < n; i++) {
|
|
233
|
+
const p = particles[i];
|
|
234
|
+
p.x += dt * p.vx;
|
|
235
|
+
p.y += dt * p.vy;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
ax.fill(0);
|
|
239
|
+
ay.fill(0);
|
|
240
|
+
|
|
241
|
+
for (let i = 0; i < n; i++) {
|
|
242
|
+
for (let j = i + 1; j < n; j++) {
|
|
243
|
+
const pi = particles[i];
|
|
244
|
+
const pj = particles[j];
|
|
245
|
+
const dx = pj.x - pi.x;
|
|
246
|
+
const dy = pj.y - pi.y;
|
|
247
|
+
const rSq = dx * dx + dy * dy + softening * softening;
|
|
248
|
+
const rSoft = Math.pow(rSq, 1.5);
|
|
249
|
+
const factor = G / rSoft;
|
|
250
|
+
|
|
251
|
+
const axij = factor * pj.mass * dx;
|
|
252
|
+
const ayij = factor * pj.mass * dy;
|
|
253
|
+
|
|
254
|
+
ax[i] += axij;
|
|
255
|
+
ay[i] += ayij;
|
|
256
|
+
ax[j] -= factor * pi.mass * dx;
|
|
257
|
+
ay[j] -= factor * pi.mass * dy;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
interactionsComputed += pairsPerStep;
|
|
261
|
+
|
|
262
|
+
for (let i = 0; i < n; i++) {
|
|
263
|
+
const p = particles[i];
|
|
264
|
+
p.vx += 0.5 * dt * ax[i];
|
|
265
|
+
p.vy += 0.5 * dt * ay[i];
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const totalEnergy = computeTotalEnergy(particles, G, softening);
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
particles,
|
|
273
|
+
steps_computed: steps,
|
|
274
|
+
total_energy: totalEnergy,
|
|
275
|
+
interactions_computed: interactionsComputed,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "sim.particle",
|
|
3
|
+
"description": "N-body gravitational simulation using brute-force all-pairs direct summation. Computes exact O(n^2) pairwise interactions per step — maximum accuracy baseline. Supports preset configurations (solar system, binary star, galaxy cluster, collision).",
|
|
4
|
+
"inputSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"particles": {
|
|
8
|
+
"type": "array",
|
|
9
|
+
"description": "Initial particle states. Ignored if preset is provided.",
|
|
10
|
+
"items": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"x": {
|
|
14
|
+
"type": "number"
|
|
15
|
+
},
|
|
16
|
+
"y": {
|
|
17
|
+
"type": "number"
|
|
18
|
+
},
|
|
19
|
+
"vx": {
|
|
20
|
+
"type": "number"
|
|
21
|
+
},
|
|
22
|
+
"vy": {
|
|
23
|
+
"type": "number"
|
|
24
|
+
},
|
|
25
|
+
"mass": {
|
|
26
|
+
"type": "number"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": [
|
|
30
|
+
"x",
|
|
31
|
+
"y",
|
|
32
|
+
"vx",
|
|
33
|
+
"vy",
|
|
34
|
+
"mass"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"preset": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "Preset particle configuration",
|
|
41
|
+
"enum": [
|
|
42
|
+
"solar",
|
|
43
|
+
"binary",
|
|
44
|
+
"cluster",
|
|
45
|
+
"collision"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"count": {
|
|
49
|
+
"type": "number",
|
|
50
|
+
"description": "Number of particles for preset generation",
|
|
51
|
+
"default": 64,
|
|
52
|
+
"minimum": 2,
|
|
53
|
+
"maximum": 2048
|
|
54
|
+
},
|
|
55
|
+
"steps": {
|
|
56
|
+
"type": "number",
|
|
57
|
+
"description": "Number of simulation steps",
|
|
58
|
+
"default": 100,
|
|
59
|
+
"minimum": 1,
|
|
60
|
+
"maximum": 10000
|
|
61
|
+
},
|
|
62
|
+
"dt": {
|
|
63
|
+
"type": "number",
|
|
64
|
+
"description": "Time step size",
|
|
65
|
+
"default": 0.01
|
|
66
|
+
},
|
|
67
|
+
"G": {
|
|
68
|
+
"type": "number",
|
|
69
|
+
"description": "Gravitational constant",
|
|
70
|
+
"default": 1
|
|
71
|
+
},
|
|
72
|
+
"softening": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"description": "Softening parameter to prevent singularity at close range",
|
|
75
|
+
"default": 0.01
|
|
76
|
+
},
|
|
77
|
+
"seed": {
|
|
78
|
+
"type": "number",
|
|
79
|
+
"description": "Random seed for preset generation (deterministic output)"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"required": []
|
|
83
|
+
},
|
|
84
|
+
"outputSchema": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"properties": {
|
|
87
|
+
"particles": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"description": "Final particle states after simulation",
|
|
90
|
+
"items": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"properties": {
|
|
93
|
+
"x": {
|
|
94
|
+
"type": "number"
|
|
95
|
+
},
|
|
96
|
+
"y": {
|
|
97
|
+
"type": "number"
|
|
98
|
+
},
|
|
99
|
+
"vx": {
|
|
100
|
+
"type": "number"
|
|
101
|
+
},
|
|
102
|
+
"vy": {
|
|
103
|
+
"type": "number"
|
|
104
|
+
},
|
|
105
|
+
"mass": {
|
|
106
|
+
"type": "number"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"steps_computed": {
|
|
112
|
+
"type": "number",
|
|
113
|
+
"description": "Actual number of simulation steps computed"
|
|
114
|
+
},
|
|
115
|
+
"total_energy": {
|
|
116
|
+
"type": "number",
|
|
117
|
+
"description": "Total system energy (kinetic + potential) at final state"
|
|
118
|
+
},
|
|
119
|
+
"interactions_computed": {
|
|
120
|
+
"type": "number",
|
|
121
|
+
"description": "Total pairwise force evaluations across all steps"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"required": [
|
|
125
|
+
"particles",
|
|
126
|
+
"steps_computed",
|
|
127
|
+
"total_energy",
|
|
128
|
+
"interactions_computed"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
"dependencies": [],
|
|
132
|
+
"version": "0.1.0",
|
|
133
|
+
"author": "rotifer-team",
|
|
134
|
+
"fidelity": "Native",
|
|
135
|
+
"transparency": "Open",
|
|
136
|
+
"ir_hash": "391614d239e64ad94d257ec59c079a1a060d0143b28f6edd8ec255858f961d1c"
|
|
137
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"geneId": "91f0c58c3342d9853eef2747aa91cf59e23f80a5426be2ce9200a1e44a0de113",
|
|
3
|
+
"name": "particle-spatial",
|
|
4
|
+
"domain": "sim.particle",
|
|
5
|
+
"compiledAt": "2026-03-14T09:13:54.298Z",
|
|
6
|
+
"fidelity": "Native",
|
|
7
|
+
"wasmAvailable": true,
|
|
8
|
+
"irHash": "391614d239e64ad94d257ec59c079a1a060d0143b28f6edd8ec255858f961d1c",
|
|
9
|
+
"totalSize": 1322156,
|
|
10
|
+
"codeSectionSize": 956115,
|
|
11
|
+
"durationMs": 5868
|
|
12
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# particle-spatial
|
|
2
|
+
|
|
3
|
+
Spatial hash grid N-body simulation — a pure-computation Native Gene for the Rotifer Protocol.
|
|
4
|
+
|
|
5
|
+
## Algorithm
|
|
6
|
+
|
|
7
|
+
Partitions space into a uniform grid of fixed-size cells. For each particle, only computes gravitational forces from particles in the same cell and 8 neighboring cells (3×3 neighborhood). Long-range forces beyond the cell neighborhood are ignored.
|
|
8
|
+
|
|
9
|
+
Cell size is adaptive: `cellSize = max(2ε, 2 × √(area / n))`, scaling with the average inter-particle spacing and bounded by the softening parameter.
|
|
10
|
+
|
|
11
|
+
Integration uses the symplectic leapfrog (kick-drift-kick) scheme.
|
|
12
|
+
|
|
13
|
+
This approach trades long-range gravitational accuracy for raw speed — achieving near-O(n) performance when particles are roughly uniformly distributed. It's better suited for short-range-dominated systems (collisions, dense clusters) than for orbital mechanics where long-range gravity dominates.
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Cluster preset (good fit for spatial hashing)
|
|
19
|
+
rotifer run particle-spatial --input '{"preset": "cluster", "count": 256}'
|
|
20
|
+
|
|
21
|
+
# Collision (where short-range forces dominate)
|
|
22
|
+
rotifer run particle-spatial --input '{"preset": "collision", "count": 512, "steps": 300}'
|
|
23
|
+
|
|
24
|
+
# Solar system (less accurate due to missing long-range forces)
|
|
25
|
+
rotifer run particle-spatial --input '{"preset": "solar"}'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Presets
|
|
29
|
+
|
|
30
|
+
| Preset | Description |
|
|
31
|
+
|--------|-------------|
|
|
32
|
+
| `solar` | Central massive body + orbiting lighter bodies with circular velocities |
|
|
33
|
+
| `binary` | Two equal-mass stars in mutual orbit + debris ring |
|
|
34
|
+
| `cluster` | Random particles in a disk with small random velocities |
|
|
35
|
+
| `collision` | Two groups of particles approaching head-on |
|
|
36
|
+
|
|
37
|
+
## Output
|
|
38
|
+
|
|
39
|
+
- `particles` — final positions and velocities of all particles
|
|
40
|
+
- `steps_computed` — number of simulation steps executed
|
|
41
|
+
- `total_energy` — total system energy (kinetic + potential) for conservation validation
|
|
42
|
+
- `interactions_computed` — total neighbor-cell force evaluations
|
|
43
|
+
|
|
44
|
+
## Fitness Characteristics
|
|
45
|
+
|
|
46
|
+
| Metric | Expected |
|
|
47
|
+
|--------|----------|
|
|
48
|
+
| Success Rate | 1.0 (deterministic, no failure mode) |
|
|
49
|
+
| Accuracy | Low-medium (only short-range interactions, misses distant forces) |
|
|
50
|
+
| Complexity | ~O(n × steps) for uniform distributions |
|
|
51
|
+
| Interactions | Depends on particle clustering — much fewer than n² |
|
|
52
|
+
| Best For | Large N with short-range dominated interactions (collisions, dense clusters) |
|
|
53
|
+
| Weakness | Poor for orbital/long-range gravity (solar, binary) |
|
|
Binary file
|
|
Binary file
|