dsh-math-calculator 2.0.0 → 2.1.1

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +52 -10
  3. package/dsh.plugin.json +15 -8
  4. package/lib/awareness.js +16 -13
  5. package/lib/body-catalog.js +488 -0
  6. package/lib/body-scaling.js +288 -0
  7. package/lib/body-taxonomy.js +719 -0
  8. package/lib/detector.js +361 -16
  9. package/lib/empirical-decomposition.js +321 -0
  10. package/lib/format.js +113 -5
  11. package/lib/formula-library-generic.js +226 -0
  12. package/lib/formulas.js +71 -13
  13. package/lib/index.js +623 -77
  14. package/lib/ops/bodies-op.js +368 -0
  15. package/lib/ops/shared.js +64 -4
  16. package/lib/ops/workspace-op.js +19 -1
  17. package/lib/ops/world-op.js +22 -0
  18. package/lib/playbook.js +6 -1
  19. package/lib/precision-report.js +80 -0
  20. package/lib/result-cache.js +144 -0
  21. package/lib/types/awareness.d.ts +10 -4
  22. package/lib/types/body-catalog.d.ts +156 -0
  23. package/lib/types/body-scaling.d.ts +123 -0
  24. package/lib/types/body-taxonomy.d.ts +95 -0
  25. package/lib/types/detector.d.ts +18 -0
  26. package/lib/types/empirical-decomposition.d.ts +107 -0
  27. package/lib/types/format.d.ts +33 -4
  28. package/lib/types/formula-library-generic.d.ts +37 -0
  29. package/lib/types/formulas.d.ts +35 -7
  30. package/lib/types/index.d.ts +16 -0
  31. package/lib/types/ops/bodies-op.d.ts +35 -0
  32. package/lib/types/ops/shared.d.ts +94 -3
  33. package/lib/types/precision-report.d.ts +59 -0
  34. package/lib/types/result-cache.d.ts +78 -0
  35. package/lib/types/workspace.d.ts +24 -0
  36. package/lib/types/world.d.ts +8 -0
  37. package/lib/workspace.js +22 -0
  38. package/lib/world.js +38 -3
  39. package/package.json +1 -1
  40. package/src/awareness.ts +16 -13
  41. package/src/body-catalog.ts +619 -0
  42. package/src/body-scaling.ts +357 -0
  43. package/src/body-taxonomy.ts +806 -0
  44. package/src/detector.ts +403 -15
  45. package/src/empirical-decomposition.ts +411 -0
  46. package/src/format.ts +123 -5
  47. package/src/formula-library-generic.ts +242 -0
  48. package/src/formulas.ts +79 -13
  49. package/src/index.ts +652 -64
  50. package/src/ops/bodies-op.ts +415 -0
  51. package/src/ops/shared.ts +141 -4
  52. package/src/ops/workspace-op.ts +21 -1
  53. package/src/ops/world-op.ts +22 -0
  54. package/src/playbook.ts +6 -1
  55. package/src/precision-report.ts +87 -0
  56. package/src/result-cache.ts +157 -0
  57. package/src/workspace.ts +34 -0
  58. package/src/world.ts +51 -4
@@ -0,0 +1,288 @@
1
+ /**
2
+ * 天体量的常数传导:改了基础物理常数之后,天体数据里**哪些必须重算、哪些绝不能动**。
3
+ *
4
+ * ## 这是本模块存在的唯一理由
5
+ *
6
+ * 「把宇宙所有星体的数据都补上」听起来是填表,但一旦作者改了 α、G 或 c,
7
+ * 这张表立刻分裂成两类:
8
+ *
9
+ * | 类别 | 例 | 改 α 之后 |
10
+ * |---|---|---|
11
+ * | **不变** | 行星质量、半径、轨道半长轴 | 完全不动。它们由引力与初始条件决定,与电磁力几乎无关 |
12
+ * | **必变** | 恒星光度、寿命、有效温度、平衡温度 | 跟着 α 走,公式自己会算 |
13
+ * | **不可推导** | 大气成分、云量、反照率、磁场、板块 | 没有公式,是历史偶然。只能提示作者「这条要你自己定」 |
14
+ *
15
+ * 最容易犯的错有两个,都是**静默**的:
16
+ * 1. 改了 α 之后把行星质量也跟着改 —— 那是篡改设定(本模块明确拒绝)
17
+ * 2. 改了 α 之后忘了恒星光度要变 —— 于是气候结论还是旧的
18
+ *
19
+ * ## 传导链(α 为例)
20
+ *
21
+ * ```
22
+ * α ↑
23
+ * ├→ 库仑势垒 ↑ → 核聚变点火温度 ↑ → 同质量恒星光度 ↓、寿命 ↑
24
+ * ├→ 电子散射不透明度 ↑ → 辐射压 ↑ → 恒星光度 ↓
25
+ * ├→ 化学键能 ∝ α² → 材料强度、生物体型上限 ↑
26
+ * └→ 玻尔半径 ∝ 1/α → 原子尺度 ↓ → 物质密度 ↑
27
+ *
28
+ * 行星质量、半径、轨道:**不动**(它们的定义式里没有 α)
29
+ * 平衡温度:随恒星光度变(因为辐照变了)
30
+ * 反照率:不动,但它的数值本身只是地球标定
31
+ * ```
32
+ *
33
+ * @module dsh-math-calculator/body-scaling
34
+ */
35
+ /**
36
+ * 常数 → 天体量的传导规则表。
37
+ *
38
+ * `exponent` 是这个表的核心:它回答「α 变 1%,这个量变百分之几」。
39
+ * 0 表示无关 —— 此时让它变才是错的。
40
+ */
41
+ export const SCALING_RULES = [
42
+ // ── α(精细结构常数)──
43
+ {
44
+ quantity: '化学键能',
45
+ constant: 'alpha_fs',
46
+ exponent: 2,
47
+ confidence: 'exact',
48
+ mechanism: '里德伯能量 E ∝ α²(库仑势 ∝ α),化学键能同量级',
49
+ domain: 'α 偏离现实 < 50%',
50
+ },
51
+ {
52
+ quantity: '原子尺度(玻尔半径)',
53
+ constant: 'alpha_fs',
54
+ exponent: -1,
55
+ confidence: 'exact',
56
+ mechanism: 'a₀ = ħ/(mₑcα),严格 ∝ 1/α',
57
+ domain: '任意 α(但 α > 1 时该式失效)',
58
+ },
59
+ {
60
+ quantity: '材料抗压强度',
61
+ constant: 'alpha_fs',
62
+ exponent: 5,
63
+ confidence: 'order-of-magnitude',
64
+ mechanism: '强度 ∝ 键能/原子体积² ∝ α²/α⁻² ≈ α⁵(体积由 a₀³ 缩放)',
65
+ domain: 'α 偏离现实 < 30%;超出后晶体结构本身会变',
66
+ },
67
+ {
68
+ quantity: '恒星核聚变点火温度',
69
+ constant: 'alpha_fs',
70
+ exponent: 2,
71
+ confidence: 'order-of-magnitude',
72
+ mechanism: '库仑势垒 ∝ α²,隧道穿透率对势垒指数敏感',
73
+ domain: '量级估计,实际还依赖强相互作用强度',
74
+ },
75
+ {
76
+ quantity: '恒星寿命',
77
+ constant: 'alpha_fs',
78
+ exponent: 0.5,
79
+ confidence: 'order-of-magnitude',
80
+ mechanism: 'α↑ → 不透明度↑ → 辐射压↑ → 光度↓ → 燃烧更慢。低质量星 τ∝α²,' +
81
+ '大质量星 τ∝α⁰(不透明度已是电子散射主导,与 α 弱相关)',
82
+ domain: '低质量星取指数 2,大质量星取 0',
83
+ },
84
+ // ── 行星(受恒星间接影响)──
85
+ {
86
+ quantity: '行星平衡温度',
87
+ constant: 'alpha_fs',
88
+ exponent: 0,
89
+ confidence: 'direction-only',
90
+ mechanism: 'T_eq = 278.6/√a · (1−A)^0.25 · (L/L☉)^0.25。α 不直接出现在式子里,' +
91
+ '但它改变 L:α↑ → 不透明度↑ → L↓ → T_eq↓。这是间接依赖,不是幂律,' +
92
+ '所以不能标「不变」——要按新 L 重算。',
93
+ domain: '只看方向;具体数值请改 α 后用 world 重算',
94
+ },
95
+ {
96
+ quantity: '行星质量、半径、轨道半长轴',
97
+ constant: 'alpha_fs',
98
+ exponent: 0,
99
+ confidence: 'direction-only',
100
+ mechanism: '这些由引力与初始角动量决定,定义式里没有 α —— ' +
101
+ '同一天体在 α 更大的宇宙里质量不变,只是化学与材料性质变了',
102
+ domain: '严格为零:改 α 绝不该改动这些数',
103
+ },
104
+ {
105
+ quantity: '行星反照率',
106
+ constant: 'alpha_fs',
107
+ exponent: 0,
108
+ confidence: 'direction-only',
109
+ mechanism: '反照率取决于云、冰、海、植被的分布——那是历史与气候的结果,不是 α 的函数。' +
110
+ '但注意:α 变了会改变云滴尺度与散射效率,所以「数值不变」指的是「没有公式可依」,' +
111
+ '不等于「物理上真的不变」。要精确就得重新做气候模拟,本模型不做。',
112
+ domain: '无公式可依;只能由作者重新设定',
113
+ },
114
+ // ── G(引力常数)──
115
+ {
116
+ quantity: '行星质量、半径、轨道半长轴',
117
+ constant: 'G',
118
+ exponent: 0,
119
+ confidence: 'direction-only',
120
+ mechanism: '这些量由引力与初始角动量决定,但它们**不是** G 的函数 —— ' +
121
+ '同一天体在 G 更大的宇宙里质量不变,只是「同样的质量产生了更大的重力」',
122
+ domain: '严格为零:改 G 绝不该改动这些数',
123
+ },
124
+ {
125
+ quantity: '表面重力',
126
+ constant: 'G',
127
+ exponent: 1,
128
+ confidence: 'exact',
129
+ mechanism: 'g = GM/R²,严格 ∝ G',
130
+ domain: '任意',
131
+ },
132
+ {
133
+ quantity: '逃逸速度',
134
+ constant: 'G',
135
+ exponent: 0.5,
136
+ confidence: 'exact',
137
+ mechanism: 'v = √(2GM/R),∝ √G',
138
+ domain: '任意',
139
+ },
140
+ {
141
+ quantity: '轨道周期',
142
+ constant: 'G',
143
+ exponent: -0.5,
144
+ confidence: 'exact',
145
+ mechanism: '开普勒第三定律 P = 2π√(a³/GM),∝ G^(-1/2)',
146
+ domain: '任意',
147
+ },
148
+ {
149
+ quantity: '恒星最小点火质量',
150
+ constant: 'G',
151
+ exponent: -1.5,
152
+ confidence: 'order-of-magnitude',
153
+ mechanism: 'G↑ → 引力压缩更强 → 更小的质量也能点燃核心',
154
+ domain: '量级估计',
155
+ },
156
+ // ── c(光速)──
157
+ {
158
+ quantity: 'α(精细结构常数)',
159
+ constant: 'c',
160
+ exponent: -1,
161
+ confidence: 'exact',
162
+ mechanism: 'α = e²/(4πε₀ħc),严格 ∝ 1/c',
163
+ domain: '任意',
164
+ },
165
+ {
166
+ quantity: '原子尺度(玻尔半径)',
167
+ constant: 'c',
168
+ exponent: 1,
169
+ confidence: 'exact',
170
+ mechanism: '由 α ∝ 1/c 且 a₀ ∝ 1/α 得 a₀ ∝ c',
171
+ domain: '任意',
172
+ },
173
+ {
174
+ quantity: '化学键能',
175
+ constant: 'c',
176
+ exponent: -2,
177
+ confidence: 'exact',
178
+ mechanism: '由 E ∝ α² 且 α ∝ 1/c 得 E ∝ c⁻²',
179
+ domain: '任意',
180
+ },
181
+ // ── 不可推导类(exponent 无意义,单独列出提醒)──
182
+ {
183
+ quantity: '大气成分、云量、反照率、磁场、板块构造',
184
+ constant: '(任意)',
185
+ exponent: 0,
186
+ confidence: 'direction-only',
187
+ mechanism: '这些是**历史偶然**的结果,不是物理定律的推论:' +
188
+ '地球有大气的样子取决于挥发物如何被吸积、何时被撞击、生命何时出现',
189
+ domain: '永远不可推导:只能由作者设定,或引用同类天体的观测值',
190
+ },
191
+ ];
192
+ /**
193
+ * 查某个天体量依赖哪个常数、怎么变。
194
+ *
195
+ * @param quantity - 量名(中文,如「恒星寿命」)
196
+ * @returns 匹配的规则(可能多条);没找到返回空数组
197
+ */
198
+ export function rulesFor(quantity) {
199
+ return SCALING_RULES.filter(function (rule) { return rule.quantity.includes(quantity); });
200
+ }
201
+ /**
202
+ * 计算某个常数变化后,各天体量的变化倍数。
203
+ *
204
+ * @param constant - 常数名(如 'alpha_fs'、'G'、'c')
205
+ * @param factor - 该常数变成原来的几倍
206
+ * @returns 传导结果
207
+ */
208
+ export function propagateConstantChange(constant, factor) {
209
+ const rules = SCALING_RULES.filter(function (rule) { return rule.constant === constant; });
210
+ const effects = [];
211
+ const indirect = [];
212
+ const unchanged = [];
213
+ for (const rule of rules) {
214
+ if (rule.exponent !== 0) {
215
+ const multiplier = factor ** rule.exponent;
216
+ const direction = multiplier > 1.0001 ? '升高' : multiplier < 0.9999 ? '降低' : '不变';
217
+ effects.push({
218
+ quantity: rule.quantity,
219
+ multiplier: multiplier,
220
+ text: rule.quantity + ' ' + direction + '到原来的 ' + multiplier.toPrecision(4) + ' 倍' +
221
+ '(' + rule.mechanism + ')',
222
+ confidence: rule.confidence,
223
+ });
224
+ continue;
225
+ }
226
+ /**
227
+ * exponent = 0 的两种可能,必须区分:
228
+ * · mechanism 里明确说「无关 / 不该变」→ 真的不动
229
+ * · mechanism 里提到「间接依赖 / 按新值重算」→ 要重算,但没有幂次
230
+ */
231
+ const isIndirect = /间接|重算|不能标|通过|新值/.test(rule.mechanism);
232
+ if (isIndirect) {
233
+ indirect.push({ quantity: rule.quantity, reason: rule.mechanism });
234
+ }
235
+ else {
236
+ unchanged.push(rule.quantity);
237
+ }
238
+ }
239
+ return { constant: constant, factor: factor, effects: effects, indirect: indirect, unchanged: unchanged };
240
+ }
241
+ /**
242
+ * 检查一条天体数据在改常数后是否应重算。
243
+ *
244
+ * @param value - 一条带依赖标记的数值
245
+ * @param constant - 改动的常数名
246
+ * @returns 是否应重算;以及原因
247
+ */
248
+ export function howToTreatValue(value, constant) {
249
+ switch (value.dependence) {
250
+ case 'scaled':
251
+ return { rescale: true, reason: '由公式决定,改常数后必须重算' };
252
+ case 'first-principles':
253
+ return {
254
+ rescale: false,
255
+ reason: '由引力/初始条件决定,与 ' + constant + ' 无关——改了就是篡改设定',
256
+ };
257
+ case 'calibrated':
258
+ return {
259
+ rescale: false,
260
+ reason: '只是地球标定值(' + (value.domain || '未注明适用域') + '),' +
261
+ '改常数后它不会「自动跟着变」,而是整个失去可信度',
262
+ };
263
+ case 'contingent':
264
+ return { rescale: false, reason: '历史偶然的结果,没有公式可依——只能由作者重新设定' };
265
+ default:
266
+ return { rescale: false, reason: '未标注依赖类别' };
267
+ }
268
+ }
269
+ /**
270
+ * 依赖类别的人话说明(给输出用)。
271
+ *
272
+ * @param dependence - 依赖类别
273
+ * @returns 说明
274
+ */
275
+ export function describeDependence(dependence) {
276
+ switch (dependence) {
277
+ case 'first-principles':
278
+ return '物理必然(改常数不该动)';
279
+ case 'scaled':
280
+ return '随常数变(公式决定)';
281
+ case 'calibrated':
282
+ return '地球标定(超域失真)';
283
+ case 'contingent':
284
+ return '历史偶然(不可推导)';
285
+ default:
286
+ return '未标注';
287
+ }
288
+ }