@woosh/meep-engine 2.134.4 → 2.135.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.
Files changed (156) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/tools/v2/TransformControlsGizmo.js +1 -1
  4. package/editor/view/node-graph/NodeGraphEditorView.js +2 -2
  5. package/package.json +1 -1
  6. package/src/core/assert.d.ts +0 -2
  7. package/src/core/assert.d.ts.map +1 -1
  8. package/src/core/assert.js +0 -6
  9. package/src/core/color/Color.d.ts +0 -5
  10. package/src/core/color/Color.d.ts.map +1 -1
  11. package/src/core/color/Color.js +1 -7
  12. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +386 -386
  13. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +1 -1
  14. package/src/core/geom/2d/quad-tree-binary/QuadTree.js +714 -714
  15. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +160 -160
  16. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +96 -96
  17. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +1 -1
  18. package/src/core/geom/packing/max-rect/findBestContainer.js +4 -4
  19. package/src/core/geom/packing/max-rect/packOneBox.js +2 -2
  20. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +23 -0
  21. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -0
  22. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +96 -0
  23. package/src/core/graph/layout/box/BoxLayouter.js +7 -7
  24. package/src/core/graph/layout/box/position_box_next_to_box.js +6 -6
  25. package/src/core/math/computeWholeDivisorLow.js +33 -33
  26. package/src/core/math/linalg/eigen/eigen_values_find_spectral_gap.d.ts.map +1 -0
  27. package/src/core/math/linalg/eigen/matrix_eigenvalues_in_place.d.ts +10 -0
  28. package/src/core/math/linalg/eigen/matrix_eigenvalues_in_place.d.ts.map +1 -0
  29. package/src/core/{graph → math/linalg}/eigen/matrix_eigenvalues_in_place.js +8 -7
  30. package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts.map +1 -0
  31. package/src/core/{graph → math/linalg}/eigen/matrix_householder_in_place.js +11 -5
  32. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +15 -0
  33. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -0
  34. package/src/core/{graph → math/linalg}/eigen/matrix_qr_in_place.js +8 -2
  35. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +17 -0
  36. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -0
  37. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +107 -0
  38. package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.d.ts +19 -0
  39. package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.d.ts.map +1 -0
  40. package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.js +161 -0
  41. package/src/core/math/linalg/polynomial_real_roots_in_interval.d.ts +15 -0
  42. package/src/core/math/linalg/polynomial_real_roots_in_interval.d.ts.map +1 -0
  43. package/src/core/math/linalg/polynomial_real_roots_in_interval.js +200 -0
  44. package/src/core/math/solveCubic.d.ts +15 -0
  45. package/src/core/math/solveCubic.d.ts.map +1 -0
  46. package/src/core/math/solveCubic.js +82 -0
  47. package/src/core/math/spline/spline3_hermite_bounds_t.d.ts +23 -0
  48. package/src/core/math/spline/spline3_hermite_bounds_t.d.ts.map +1 -0
  49. package/src/core/math/spline/spline3_hermite_bounds_t.js +109 -0
  50. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite.d.ts +25 -0
  51. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite.d.ts.map +1 -0
  52. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite.js +44 -0
  53. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.d.ts +16 -0
  54. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.d.ts.map +1 -0
  55. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.js +120 -0
  56. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_2d.d.ts +11 -0
  57. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_2d.d.ts.map +1 -0
  58. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_2d.js +451 -0
  59. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts +12 -0
  60. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -0
  61. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +339 -0
  62. package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.d.ts +15 -0
  63. package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.d.ts.map +1 -0
  64. package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.js +21 -0
  65. package/src/core/math/spline/spline3_hermite_to_monomial.d.ts +24 -0
  66. package/src/core/math/spline/spline3_hermite_to_monomial.d.ts.map +1 -0
  67. package/src/core/math/spline/spline3_hermite_to_monomial.js +37 -0
  68. package/src/core/math/spline/v3_computeCatmullRomSplineUniformDistance.js +1 -1
  69. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +1 -1
  70. package/src/core/model/reactive/model/util/createRandomReactiveExpression.js +185 -185
  71. package/src/core/process/delay.js +16 -16
  72. package/src/engine/animation/async/TimeSeries.js +300 -300
  73. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -2
  74. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  75. package/src/engine/animation/curve/AnimationCurve.js +3 -2
  76. package/src/engine/animation/curve/draw/position_canvas_to_curve.js +2 -2
  77. package/src/engine/animation/curve/draw/position_curve_to_canvas.js +2 -2
  78. package/src/engine/ecs/fow/shader/FogOfWarRenderer.js +145 -145
  79. package/src/engine/ecs/gui/position/ViewportPositionSystem.js +2 -2
  80. package/src/engine/ecs/parent/entity_node_compute_bounding_box.js +1 -1
  81. package/src/engine/ecs/transform/Transform.d.ts +0 -10
  82. package/src/engine/ecs/transform/Transform.d.ts.map +1 -1
  83. package/src/engine/ecs/transform/Transform.js +0 -12
  84. package/src/engine/graphics/composit/CompositLayer.js +254 -254
  85. package/src/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.js +1 -1
  86. package/src/engine/graphics/ecs/path/tube/build/build_geometry_linear.js +2 -2
  87. package/src/engine/graphics/material/optimization/MaterialOptimizationContext.js +3 -3
  88. package/src/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +201 -201
  89. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  90. package/src/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +2 -2
  91. package/src/engine/graphics/render/forward_plus/LightManager.js +1226 -1226
  92. package/src/engine/graphics/render/forward_plus/model/PointLight.js +1 -1
  93. package/src/engine/graphics/sh3/lpv/lpv_obtain_storage_cached_volume.js +1 -1
  94. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +2 -2
  95. package/src/engine/graphics/texture/atlas/TextureAtlasDebugger.js +1 -1
  96. package/src/engine/graphics/texture/sampler/HarmonicDiffusionGrid.js +145 -145
  97. package/src/engine/graphics/texture/sampler/serialization/TextureBinaryBufferSerializer.js +2 -2
  98. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.d.ts +2 -6
  99. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.d.ts.map +1 -1
  100. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.js +0 -10
  101. package/src/engine/intelligence/mcts/MonteCarlo.js +275 -275
  102. package/src/engine/navigation/ecs/path_following/PathFollower.js +222 -222
  103. package/src/generation/grid/GridData.js +220 -220
  104. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +385 -385
  105. package/src/view/elements/image/SvgImageView.js +1 -1
  106. package/src/view/elements/windrose/WindRoseDiagram.js +369 -369
  107. package/src/view/minimap/gl/MinimapFogOfWar.js +3 -3
  108. package/src/view/util/DomSizeObserver.js +1 -1
  109. package/src/core/binary/clz32.d.ts +0 -6
  110. package/src/core/binary/clz32.d.ts.map +0 -1
  111. package/src/core/binary/clz32.js +0 -5
  112. package/src/core/binary/type/dataTypeFromTypedArray.d.ts +0 -8
  113. package/src/core/binary/type/dataTypeFromTypedArray.d.ts.map +0 -1
  114. package/src/core/binary/type/dataTypeFromTypedArray.js +0 -11
  115. package/src/core/collection/array/computeHashIntegerArray.d.ts +0 -1
  116. package/src/core/collection/array/computeHashIntegerArray.d.ts.map +0 -1
  117. package/src/core/collection/array/computeHashIntegerArray.js +0 -7
  118. package/src/core/collection/array/typed/typedArrayToDataType.d.ts +0 -6
  119. package/src/core/collection/array/typed/typedArrayToDataType.d.ts.map +0 -1
  120. package/src/core/collection/array/typed/typedArrayToDataType.js +0 -6
  121. package/src/core/geom/3d/mat4/MATRIX_4_IDENTITY.d.ts +0 -6
  122. package/src/core/geom/3d/mat4/MATRIX_4_IDENTITY.d.ts.map +0 -1
  123. package/src/core/geom/3d/mat4/MATRIX_4_IDENTITY.js +0 -7
  124. package/src/core/graph/eigen/eigen_values_find_spectral_gap.d.ts.map +0 -1
  125. package/src/core/graph/eigen/matrix_eigenvalues_in_place.d.ts +0 -8
  126. package/src/core/graph/eigen/matrix_eigenvalues_in_place.d.ts.map +0 -1
  127. package/src/core/graph/eigen/matrix_householder_in_place.d.ts.map +0 -1
  128. package/src/core/graph/eigen/matrix_qr_in_place.d.ts +0 -9
  129. package/src/core/graph/eigen/matrix_qr_in_place.d.ts.map +0 -1
  130. package/src/core/math/spline/cubicCurve.d.ts +0 -6
  131. package/src/core/math/spline/cubicCurve.d.ts.map +0 -1
  132. package/src/core/math/spline/cubicCurve.js +0 -6
  133. package/src/core/math/spline/spline_bezier2.d.ts +0 -6
  134. package/src/core/math/spline/spline_bezier2.d.ts.map +0 -1
  135. package/src/core/math/spline/spline_bezier2.js +0 -6
  136. package/src/core/math/spline/spline_bezier3.d.ts +0 -6
  137. package/src/core/math/spline/spline_bezier3.d.ts.map +0 -1
  138. package/src/core/math/spline/spline_bezier3.js +0 -6
  139. package/src/core/math/spline/spline_bezier3_bounds.d.ts +0 -6
  140. package/src/core/math/spline/spline_bezier3_bounds.d.ts.map +0 -1
  141. package/src/core/math/spline/spline_bezier3_bounds.js +0 -6
  142. package/src/core/math/spline/spline_hermite3.d.ts +0 -6
  143. package/src/core/math/spline/spline_hermite3.d.ts.map +0 -1
  144. package/src/core/math/spline/spline_hermite3.js +0 -6
  145. package/src/core/math/spline/spline_hermite3_bounds.d.ts +0 -6
  146. package/src/core/math/spline/spline_hermite3_bounds.d.ts.map +0 -1
  147. package/src/core/math/spline/spline_hermite3_bounds.js +0 -6
  148. package/src/core/math/spline/spline_hermite3_to_bezier.d.ts +0 -2
  149. package/src/core/math/spline/spline_hermite3_to_bezier.d.ts.map +0 -1
  150. package/src/core/math/spline/spline_hermite3_to_bezier.js +0 -6
  151. package/src/engine/intelligence/behavior/decorator/RepeatUntilFailureBehavior.d.ts +0 -37
  152. package/src/engine/intelligence/behavior/decorator/RepeatUntilFailureBehavior.d.ts.map +0 -1
  153. package/src/engine/intelligence/behavior/decorator/RepeatUntilFailureBehavior.js +0 -70
  154. /package/src/core/{graph → math/linalg}/eigen/eigen_values_find_spectral_gap.d.ts +0 -0
  155. /package/src/core/{graph → math/linalg}/eigen/eigen_values_find_spectral_gap.js +0 -0
  156. /package/src/core/{graph → math/linalg}/eigen/matrix_householder_in_place.d.ts +0 -0
@@ -1,185 +1,185 @@
1
- import { assert } from "../../../../assert.js";
2
- import { randomFromArray } from "../../../../math/random/randomFromArray.js";
3
- import DataType from "../../../../parser/simple/DataType.js";
4
- import { ReactiveAdd } from "../arithmetic/ReactiveAdd.js";
5
- import { ReactiveDivide } from "../arithmetic/ReactiveDivide.js";
6
- import { ReactiveMultiply } from "../arithmetic/ReactiveMultiply.js";
7
- import { ReactiveSubtract } from "../arithmetic/ReactiveSubtract.js";
8
- import { ReactiveEquals } from "../comparative/ReactiveEquals.js";
9
- import { ReactiveGreaterThan } from "../comparative/ReactiveGreaterThan.js";
10
- import { ReactiveGreaterThanOrEqual } from "../comparative/ReactiveGreaterThanOrEqual.js";
11
- import { ReactiveLessThan } from "../comparative/ReactiveLessThan.js";
12
- import { ReactiveLessThanOrEqual } from "../comparative/ReactiveLessThanOrEqual.js";
13
- import { ReactiveNotEquals } from "../comparative/ReactiveNotEquals.js";
14
- import { ReactiveAnd } from "../logic/ReactiveAnd.js";
15
- import { ReactiveOr } from "../logic/ReactiveOr.js";
16
- import { ReactiveLiteralNumber } from "../terminal/ReactiveLiteralNumber.js";
17
- import { ReactiveLiteralString } from "../terminal/ReactiveLiteralString.js";
18
-
19
- /**
20
- *
21
- * @param {ReactiveExpression} exp
22
- * @returns {ReactiveExpression}
23
- */
24
- function convert_to_boolean(exp) {
25
- const dataType = exp.dataType;
26
-
27
- if (dataType === DataType.Boolean) {
28
- return exp;
29
- } else if (dataType === DataType.Number) {
30
- return ReactiveGreaterThan.from(exp, ReactiveLiteralNumber.from(0));
31
- } else if (dataType === DataType.String) {
32
- return ReactiveNotEquals.from(exp, ReactiveLiteralString.from(""))
33
- } else {
34
- throw new Error(`Unsupported data type '${dataType}'`);
35
- }
36
-
37
- }
38
-
39
- /**
40
- *
41
- * @param {function} random
42
- * @param {ReactiveExpression} a
43
- * @param {ReactiveExpression} b
44
- * @returns {ReactiveExpression}
45
- */
46
- function join(random, a, b) {
47
- const dataType = a.dataType;
48
-
49
- if (dataType !== b.dataType) {
50
- // inconsistent data types
51
- return join(random, convert_to_boolean(a), convert_to_boolean(b));
52
- }
53
-
54
- let NodeSet;
55
-
56
- if (dataType === DataType.Number) {
57
- NodeSet = [
58
- ReactiveGreaterThan,
59
- ReactiveGreaterThanOrEqual,
60
- ReactiveLessThan,
61
- ReactiveLessThanOrEqual,
62
- ReactiveEquals,
63
- ReactiveNotEquals,
64
- ReactiveAdd,
65
- ReactiveSubtract,
66
- ReactiveMultiply,
67
- ReactiveDivide
68
- ];
69
- } else if (dataType === DataType.String) {
70
- NodeSet = [
71
- ReactiveEquals,
72
- ReactiveNotEquals
73
- ];
74
- } else if (dataType === DataType.Boolean) {
75
- NodeSet = [
76
- ReactiveEquals,
77
- ReactiveNotEquals,
78
- ReactiveAnd,
79
- ReactiveOr
80
- ];
81
- } else {
82
- NodeSet = [ReactiveEquals];
83
- }
84
-
85
- const NodeClass = randomFromArray(random, NodeSet);
86
-
87
- return NodeClass.from(a, b);
88
- }
89
-
90
- /**
91
- *
92
- * @param {ReactiveExpression} exp
93
- * @param {Object<ReactiveExpression[]>} map
94
- */
95
- function add_to_type_map(exp, map) {
96
-
97
- const dataType = exp.dataType;
98
-
99
- let set = map[dataType];
100
-
101
- if (set === undefined) {
102
- set = [];
103
-
104
- map[dataType] = set;
105
- }
106
-
107
- set.push(exp);
108
-
109
- }
110
-
111
- /**
112
- *
113
- * @param {function} random
114
- * @param {ReactiveExpression[]} terminals
115
- * @param {number} [tuples] How many sub-expression to generate from terminals before aggregating them all
116
- * @returns {ReactiveExpression}
117
- */
118
- export function createRandomReactiveExpression(
119
- random,
120
- terminals,
121
- tuples = Math.max(0, terminals.length - 1)
122
- ) {
123
- assert.isFunction(random, 'random');
124
- assert.isFiniteNumber(tuples, 'tuples');
125
- assert.isNonNegativeInteger(tuples, 'tuples');
126
- assert.isArray(terminals, 'terminals');
127
- assert.greaterThan(terminals.length, 0, 'must supply at least one terminal');
128
-
129
- const type_map = {};
130
-
131
- const n = terminals.length;
132
-
133
- for (let i = 0; i < n; i++) {
134
- add_to_type_map(terminals[i], type_map);
135
- }
136
-
137
- /**
138
- *
139
- * @type {Set<ReactiveExpression>}
140
- */
141
- const visited_terminals = new Set();
142
-
143
- /**
144
- *
145
- * @type {ReactiveExpression[]}
146
- */
147
- const open = [];
148
-
149
- for (let i = 0; i < tuples; i++) {
150
- const a = randomFromArray(random, terminals);
151
-
152
- const dataType = a.dataType;
153
-
154
- const b = randomFromArray(random, type_map[dataType]);
155
-
156
- const t = join(random, a, b);
157
-
158
- open.push(t);
159
-
160
- // remember
161
- visited_terminals.add(a);
162
- visited_terminals.add(b);
163
- }
164
-
165
- // include terminals that were not used in any tuples
166
- for (let i = 0; i < terminals.length; i++) {
167
- const terminal = terminals[i];
168
-
169
- if (visited_terminals.has(terminal)) {
170
- continue;
171
- }
172
-
173
- // tuple was not included into the tree, let's add it
174
- open.push(terminal);
175
- }
176
-
177
- while (open.length > 1) {
178
- const a = open.pop();
179
- const b = open.pop();
180
-
181
- open.unshift(join(random, a, b));
182
- }
183
-
184
- return open[0];
185
- }
1
+ import { assert } from "../../../../assert.js";
2
+ import { randomFromArray } from "../../../../math/random/randomFromArray.js";
3
+ import DataType from "../../../../parser/simple/DataType.js";
4
+ import { ReactiveAdd } from "../arithmetic/ReactiveAdd.js";
5
+ import { ReactiveDivide } from "../arithmetic/ReactiveDivide.js";
6
+ import { ReactiveMultiply } from "../arithmetic/ReactiveMultiply.js";
7
+ import { ReactiveSubtract } from "../arithmetic/ReactiveSubtract.js";
8
+ import { ReactiveEquals } from "../comparative/ReactiveEquals.js";
9
+ import { ReactiveGreaterThan } from "../comparative/ReactiveGreaterThan.js";
10
+ import { ReactiveGreaterThanOrEqual } from "../comparative/ReactiveGreaterThanOrEqual.js";
11
+ import { ReactiveLessThan } from "../comparative/ReactiveLessThan.js";
12
+ import { ReactiveLessThanOrEqual } from "../comparative/ReactiveLessThanOrEqual.js";
13
+ import { ReactiveNotEquals } from "../comparative/ReactiveNotEquals.js";
14
+ import { ReactiveAnd } from "../logic/ReactiveAnd.js";
15
+ import { ReactiveOr } from "../logic/ReactiveOr.js";
16
+ import { ReactiveLiteralNumber } from "../terminal/ReactiveLiteralNumber.js";
17
+ import { ReactiveLiteralString } from "../terminal/ReactiveLiteralString.js";
18
+
19
+ /**
20
+ *
21
+ * @param {ReactiveExpression} exp
22
+ * @returns {ReactiveExpression}
23
+ */
24
+ function convert_to_boolean(exp) {
25
+ const dataType = exp.dataType;
26
+
27
+ if (dataType === DataType.Boolean) {
28
+ return exp;
29
+ } else if (dataType === DataType.Number) {
30
+ return ReactiveGreaterThan.from(exp, ReactiveLiteralNumber.from(0));
31
+ } else if (dataType === DataType.String) {
32
+ return ReactiveNotEquals.from(exp, ReactiveLiteralString.from(""))
33
+ } else {
34
+ throw new Error(`Unsupported data type '${dataType}'`);
35
+ }
36
+
37
+ }
38
+
39
+ /**
40
+ *
41
+ * @param {function} random
42
+ * @param {ReactiveExpression} a
43
+ * @param {ReactiveExpression} b
44
+ * @returns {ReactiveExpression}
45
+ */
46
+ function join(random, a, b) {
47
+ const dataType = a.dataType;
48
+
49
+ if (dataType !== b.dataType) {
50
+ // inconsistent data types
51
+ return join(random, convert_to_boolean(a), convert_to_boolean(b));
52
+ }
53
+
54
+ let NodeSet;
55
+
56
+ if (dataType === DataType.Number) {
57
+ NodeSet = [
58
+ ReactiveGreaterThan,
59
+ ReactiveGreaterThanOrEqual,
60
+ ReactiveLessThan,
61
+ ReactiveLessThanOrEqual,
62
+ ReactiveEquals,
63
+ ReactiveNotEquals,
64
+ ReactiveAdd,
65
+ ReactiveSubtract,
66
+ ReactiveMultiply,
67
+ ReactiveDivide
68
+ ];
69
+ } else if (dataType === DataType.String) {
70
+ NodeSet = [
71
+ ReactiveEquals,
72
+ ReactiveNotEquals
73
+ ];
74
+ } else if (dataType === DataType.Boolean) {
75
+ NodeSet = [
76
+ ReactiveEquals,
77
+ ReactiveNotEquals,
78
+ ReactiveAnd,
79
+ ReactiveOr
80
+ ];
81
+ } else {
82
+ NodeSet = [ReactiveEquals];
83
+ }
84
+
85
+ const NodeClass = randomFromArray(random, NodeSet);
86
+
87
+ return NodeClass.from(a, b);
88
+ }
89
+
90
+ /**
91
+ *
92
+ * @param {ReactiveExpression} exp
93
+ * @param {Object<ReactiveExpression[]>} map
94
+ */
95
+ function add_to_type_map(exp, map) {
96
+
97
+ const dataType = exp.dataType;
98
+
99
+ let set = map[dataType];
100
+
101
+ if (set === undefined) {
102
+ set = [];
103
+
104
+ map[dataType] = set;
105
+ }
106
+
107
+ set.push(exp);
108
+
109
+ }
110
+
111
+ /**
112
+ *
113
+ * @param {function} random
114
+ * @param {ReactiveExpression[]} terminals
115
+ * @param {number} [tuples] How many sub-expression to generate from terminals before aggregating them all
116
+ * @returns {ReactiveExpression}
117
+ */
118
+ export function createRandomReactiveExpression(
119
+ random,
120
+ terminals,
121
+ tuples = Math.max(0, terminals.length - 1)
122
+ ) {
123
+ assert.isFunction(random, 'random');
124
+ assert.isFinite(tuples, 'tuples');
125
+ assert.isNonNegativeInteger(tuples, 'tuples');
126
+ assert.isArray(terminals, 'terminals');
127
+ assert.greaterThan(terminals.length, 0, 'must supply at least one terminal');
128
+
129
+ const type_map = {};
130
+
131
+ const n = terminals.length;
132
+
133
+ for (let i = 0; i < n; i++) {
134
+ add_to_type_map(terminals[i], type_map);
135
+ }
136
+
137
+ /**
138
+ *
139
+ * @type {Set<ReactiveExpression>}
140
+ */
141
+ const visited_terminals = new Set();
142
+
143
+ /**
144
+ *
145
+ * @type {ReactiveExpression[]}
146
+ */
147
+ const open = [];
148
+
149
+ for (let i = 0; i < tuples; i++) {
150
+ const a = randomFromArray(random, terminals);
151
+
152
+ const dataType = a.dataType;
153
+
154
+ const b = randomFromArray(random, type_map[dataType]);
155
+
156
+ const t = join(random, a, b);
157
+
158
+ open.push(t);
159
+
160
+ // remember
161
+ visited_terminals.add(a);
162
+ visited_terminals.add(b);
163
+ }
164
+
165
+ // include terminals that were not used in any tuples
166
+ for (let i = 0; i < terminals.length; i++) {
167
+ const terminal = terminals[i];
168
+
169
+ if (visited_terminals.has(terminal)) {
170
+ continue;
171
+ }
172
+
173
+ // tuple was not included into the tree, let's add it
174
+ open.push(terminal);
175
+ }
176
+
177
+ while (open.length > 1) {
178
+ const a = open.pop();
179
+ const b = open.pop();
180
+
181
+ open.unshift(join(random, a, b));
182
+ }
183
+
184
+ return open[0];
185
+ }
@@ -1,16 +1,16 @@
1
- import { assert } from "../assert.js";
2
-
3
- /**
4
- *
5
- * @param {number} timeout_ms in milliseconds
6
- * @return {Promise<unknown>}
7
- */
8
- export function delay(timeout_ms) {
9
- assert.isNumber(timeout_ms,'timeout_ms');
10
- assert.greaterThanOrEqual(timeout_ms,0);
11
- assert.isFiniteNumber(timeout_ms,'timeout_ms');
12
-
13
- return new Promise((resolve, reject) => {
14
- setTimeout(resolve, timeout_ms);
15
- });
16
- }
1
+ import { assert } from "../assert.js";
2
+
3
+ /**
4
+ *
5
+ * @param {number} timeout_ms in milliseconds
6
+ * @return {Promise<unknown>}
7
+ */
8
+ export function delay(timeout_ms) {
9
+ assert.isNumber(timeout_ms,'timeout_ms');
10
+ assert.greaterThanOrEqual(timeout_ms,0);
11
+ assert.isFinite(timeout_ms,'timeout_ms');
12
+
13
+ return new Promise((resolve, reject) => {
14
+ setTimeout(resolve, timeout_ms);
15
+ });
16
+ }