@woosh/meep-engine 2.138.19 → 2.139.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/package.json +2 -1
- package/src/core/collection/PairUint32Map.d.ts +100 -0
- package/src/core/collection/PairUint32Map.d.ts.map +1 -0
- package/src/core/collection/PairUint32Map.js +321 -0
- package/src/core/collection/Uint32Map.d.ts +119 -0
- package/src/core/collection/Uint32Map.d.ts.map +1 -0
- package/src/core/collection/Uint32Map.js +345 -0
- package/src/core/collection/array/array_shuffle.d.ts +10 -3
- package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
- package/src/core/collection/array/array_shuffle.js +27 -22
- package/src/core/collection/heap/FibonacciHeap.d.ts +195 -0
- package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -0
- package/src/core/collection/heap/FibonacciHeap.js +586 -0
- package/src/core/collection/heap/Uint32Heap.js +1 -1
- package/src/core/collection/heap/Uint32Heap4.d.ts +169 -0
- package/src/core/collection/heap/Uint32Heap4.d.ts.map +1 -0
- package/src/core/collection/heap/Uint32Heap4.js +490 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +27 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +1 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +88 -0
- package/src/core/geom/3d/shape/BoxShape3D.d.ts +61 -0
- package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/BoxShape3D.js +158 -0
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +11 -0
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.js +12 -0
- package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts +37 -9
- package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -98
- package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts +10 -0
- package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnitSphereShape3D.js +11 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +61 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +148 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts +39 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +147 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +15 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +22 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts +2 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.js +673 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts +26 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +222 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts +34 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts +36 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts +33 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts +68 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +365 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +31 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +112 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +22 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +55 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +32 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +49 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts +134 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +276 -3
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +17 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +135 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts +14 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +177 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +20 -4
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +5 -3
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +9 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -45
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.js +7 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts +8 -6
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +8 -6
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +73 -0
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +51 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts +10 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts +28 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +227 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts +13 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +11 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +20 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +20 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +38 -0
- package/src/core/graph/csr/CSRGraph.d.ts +168 -0
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -0
- package/src/core/graph/csr/CSRGraph.js +319 -0
- package/src/core/graph/metis/cluster_mesh_metis.d.ts +12 -0
- package/src/core/graph/metis/cluster_mesh_metis.d.ts.map +1 -1
- package/src/core/graph/metis/cluster_mesh_metis.js +12 -0
- package/src/core/graph/metis/metis.d.ts +19 -0
- package/src/core/graph/metis/metis.d.ts.map +1 -1
- package/src/core/graph/metis/metis.js +20 -0
- package/src/core/graph/metis/metis_cluster_bs.d.ts +11 -0
- package/src/core/graph/metis/metis_cluster_bs.d.ts.map +1 -1
- package/src/core/graph/metis/metis_cluster_bs.js +11 -0
- package/src/core/graph/metis/metis_options.d.ts +17 -2
- package/src/core/graph/metis/metis_options.d.ts.map +1 -1
- package/src/core/graph/metis/metis_options.js +17 -2
- package/src/core/graph/metis/native/MetisGraph.d.ts +144 -0
- package/src/core/graph/metis/native/MetisGraph.d.ts.map +1 -0
- package/src/core/graph/metis/native/MetisGraph.js +212 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts +72 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.js +101 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.d.ts +37 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts +15 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.js +84 -0
- package/src/core/graph/metis/native/bisection/fm_2way.d.ts +30 -0
- package/src/core/graph/metis/native/bisection/fm_2way.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/fm_2way.js +290 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.d.ts +23 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts +28 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts +20 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts +24 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -0
- package/src/core/graph/metis/native/coarsen/match_shem.d.ts +41 -0
- package/src/core/graph/metis/native/coarsen/match_shem.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/match_shem.js +175 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts +24 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts.map +1 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts +29 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts.map +1 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -0
- package/src/core/graph/metis/native/metis_partition_kway.d.ts +41 -0
- package/src/core/graph/metis/native/metis_partition_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/metis_partition_kway.js +126 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts +62 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js +261 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.d.ts +45 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.d.ts +18 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.js +138 -0
- package/src/core/graph/metis/native/refine/fm_kway.d.ts +63 -0
- package/src/core/graph/metis/native/refine/fm_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/fm_kway.js +462 -0
- package/src/core/graph/metis/native/refine/project_kway.d.ts +22 -0
- package/src/core/graph/metis/native/refine/project_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/project_kway.js +43 -0
- package/src/core/graph/metis/native/refine/refine_kway.d.ts +34 -0
- package/src/core/graph/metis/native/refine/refine_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/refine_kway.js +43 -0
- package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts +2 -2
- package/src/core/math/linalg/eigen/matrix_householder_in_place.js +2 -2
- package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +6 -4
- package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -1
- package/src/core/math/linalg/eigen/matrix_qr_in_place.js +69 -23
- package/src/engine/EngineHarness.d.ts +3 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +6 -4
- package/src/engine/control/first-person/DESIGN.md +30 -6
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +102 -9
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerController.js +38 -3
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +533 -4
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +315 -6
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +220 -22
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +858 -241
- package/src/engine/control/first-person/TODO.md +127 -0
- package/src/engine/control/first-person/abilities/Ability.d.ts +101 -0
- package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Ability.js +119 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts +86 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/AbilitySet.js +185 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +62 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.js +199 -0
- package/src/engine/control/first-person/abilities/Mantle.d.ts +45 -0
- package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Mantle.js +188 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts +33 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Slide.js +158 -0
- package/src/engine/control/first-person/abilities/WallJump.d.ts +45 -0
- package/src/engine/control/first-person/abilities/WallJump.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/WallJump.js +131 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts +44 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/WallRun.js +180 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts +49 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts.map +1 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.js +60 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts +100 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.js +133 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.d.ts +10 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts +61 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.js +109 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts +40 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.js +45 -0
- package/src/engine/control/first-person/mastery/MasteryScore.d.ts +68 -0
- package/src/engine/control/first-person/mastery/MasteryScore.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasteryScore.js +100 -0
- package/src/engine/control/first-person/mastery/MasterySet.d.ts +60 -0
- package/src/engine/control/first-person/mastery/MasterySet.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasterySet.js +86 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +58 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +83 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +69 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +109 -0
- package/src/engine/control/first-person/math/Spring.d.ts +56 -0
- package/src/engine/control/first-person/math/Spring.d.ts.map +1 -0
- package/src/engine/control/first-person/math/Spring.js +71 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts +26 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts.map +1 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -0
- package/src/engine/control/first-person/math/computeMassRatios.d.ts +35 -0
- package/src/engine/control/first-person/math/computeMassRatios.d.ts.map +1 -0
- package/src/engine/control/first-person/math/computeMassRatios.js +44 -0
- package/src/engine/control/first-person/pose/FirstPersonPose.d.ts +31 -1
- package/src/engine/control/first-person/pose/FirstPersonPose.d.ts.map +1 -1
- package/src/engine/control/first-person/pose/FirstPersonPose.js +49 -3
- package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts +7 -0
- package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts.map +1 -0
- package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -0
- package/src/engine/control/first-person/prototype_first_person_controller.js +550 -119
- package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts +58 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts.map +1 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensors.js +77 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +80 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +196 -0
- package/src/engine/control/first-person/test/buildTestPlayer.d.ts +20 -0
- package/src/engine/control/first-person/test/buildTestPlayer.d.ts.map +1 -0
- package/src/engine/control/first-person/test/buildTestPlayer.js +28 -0
- package/src/engine/ecs/EntityManager.d.ts +2 -2
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +13 -8
- package/src/engine/ecs/System.d.ts.map +1 -1
- package/src/engine/ecs/System.js +2 -2
- package/src/engine/graphics/camera/testClippingPlaneComputation.js +0 -2
- package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/Light.js +27 -0
- package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
- package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
- package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
- package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
- package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
- package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
- package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
- package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
- package/src/engine/physics/PLAN.md +236 -0
- package/src/engine/physics/body/BodyStorage.d.ts +187 -0
- package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
- package/src/engine/physics/body/BodyStorage.js +427 -0
- package/src/engine/physics/broadphase/PairList.d.ts +62 -0
- package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
- package/src/engine/physics/broadphase/PairList.js +97 -0
- package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts +30 -0
- package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts.map +1 -0
- package/src/engine/physics/broadphase/aabb_transform_oriented.js +93 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
- package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
- package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
- package/src/engine/physics/broadphase/generate_pairs.js +101 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts +226 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
- package/src/engine/physics/contact/ManifoldStore.js +499 -0
- package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
- package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
- package/src/engine/physics/ecs/BodyKind.js +24 -0
- package/src/engine/physics/ecs/Collider.d.ts +98 -0
- package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
- package/src/engine/physics/ecs/Collider.js +136 -0
- package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
- package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderFlags.js +15 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
- package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
- package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
- package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +520 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/PhysicsSystem.js +1159 -0
- package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
- package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBody.js +240 -0
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
- package/src/engine/physics/ecs/SleepState.d.ts +11 -0
- package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
- package/src/engine/physics/ecs/SleepState.js +12 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
- package/src/engine/physics/events/ContactEventBuffer.js +83 -0
- package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
- package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
- package/src/engine/physics/events/diff_manifolds.js +50 -0
- package/src/engine/physics/fluid/FluidField.d.ts +294 -16
- package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidField.js +510 -66
- package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
- package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidSimulator.js +455 -95
- package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
- package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
- package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
- package/src/engine/physics/fluid/prototype.js +102 -91
- package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
- package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts +20 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.js +83 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +26 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +70 -0
- package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
- package/src/engine/physics/gjk/expanding_polytope_algorithm.js +8 -10
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts +29 -0
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
- package/src/engine/physics/inertia/world_inverse_inertia.js +79 -0
- package/src/engine/physics/integration/integrate_position.d.ts +16 -0
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_position.js +48 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts +25 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_velocity.js +79 -0
- package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
- package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
- package/src/engine/physics/integration/quat_integrate.js +62 -0
- package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
- package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
- package/src/engine/physics/island/IslandBuilder.js +411 -0
- package/src/engine/physics/island/union_find.d.ts +51 -0
- package/src/engine/physics/island/union_find.d.ts.map +1 -0
- package/src/engine/physics/island/union_find.js +76 -0
- package/src/engine/physics/narrowphase/PosedShape.d.ts +59 -0
- package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/PosedShape.js +110 -0
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/box_box_manifold.js +543 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/capsule_contacts.js +508 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts +11 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/narrowphase_step.js +382 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.js +130 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
- package/src/engine/physics/queries/raycast.d.ts +20 -0
- package/src/engine/physics/queries/raycast.d.ts.map +1 -0
- package/src/engine/physics/queries/raycast.js +249 -0
- package/src/engine/physics/solver/friction_cone.d.ts +16 -0
- package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
- package/src/engine/physics/solver/friction_cone.js +37 -0
- package/src/engine/physics/solver/solve_contacts.d.ts +36 -0
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
- package/src/engine/physics/solver/solve_contacts.js +598 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
- package/src/engine/ecs/components/Motion.d.ts +0 -21
- package/src/engine/ecs/components/Motion.d.ts.map +0 -1
- package/src/engine/ecs/components/Motion.js +0 -27
- package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
- package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
- package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
- package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
- package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
- package/src/engine/ecs/systems/MotionSystem.js +0 -29
- package/src/engine/physics/fluid/Fluid.d.ts +0 -26
- package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
- package/src/engine/physics/fluid/Fluid.js +0 -221
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.js +0 -8
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initial k-way partitioning via multilevel recursive bisection (MLRB) — the
|
|
3
|
+
* approach described in Karypis & Kumar 1998, §2.2.
|
|
4
|
+
*
|
|
5
|
+
* Quality-wise this is the algorithm the paper actually advocates for the
|
|
6
|
+
* initial-partition phase. We split the graph in two with weights proportional
|
|
7
|
+
* to the k-way target, recurse on each half, then project the resulting
|
|
8
|
+
* sub-partitions back as a 0..k-1 assignment on the parent.
|
|
9
|
+
*
|
|
10
|
+
* Compared to `initial_kway_bfs`, MLRB produces meaningfully better initial
|
|
11
|
+
* cuts at the cost of more work at this phase. Since refinement dominates total
|
|
12
|
+
* runtime, the overall slowdown is small while the cut improvement is large.
|
|
13
|
+
*
|
|
14
|
+
* Mirrors `MlevelRecursiveBisection` from libmetis/pmetis.c, sans the inner
|
|
15
|
+
* coarsening loop — at this point our caller has already coarsened the graph
|
|
16
|
+
* and we operate on the coarsest level only.
|
|
17
|
+
*
|
|
18
|
+
* Writes to `graph.vertex_partition[]` (sized for `partition_count` partitions,
|
|
19
|
+
* values in [0, partition_count)). On entry `graph.vertex_partition` may be
|
|
20
|
+
* unallocated; we install fresh state.
|
|
21
|
+
*
|
|
22
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph the coarsest graph from
|
|
23
|
+
* the outer multilevel pipeline
|
|
24
|
+
* @param {number} partition_count k
|
|
25
|
+
* @param {number} ub_factor load-imbalance factor (typically 1.03)
|
|
26
|
+
* @param {function():number} random
|
|
27
|
+
*/
|
|
28
|
+
export function initial_kway_recursive_bisection(graph: import('../MetisGraph.js').MetisGraph, partition_count: number, ub_factor: number, random: () => number): void;
|
|
29
|
+
//# sourceMappingURL=initial_kway_recursive_bisection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initial_kway_recursive_bisection.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wDANW,OAAO,kBAAkB,EAAE,UAAU,mBAErC,MAAM,aACN,MAAM,gBACK,MAAM,QAgB3B"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { BisectionScratch } from "../bisection/BisectionScratch.js";
|
|
2
|
+
import { bisect_graph } from "../bisection/bisect_graph.js";
|
|
3
|
+
import { split_graph_two_way } from "../bisection/split_graph_two_way.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* How many independent bisection trials to run per recursive level.
|
|
7
|
+
* METIS uses 4-5; we settle on 4 as a reasonable speed/quality tradeoff.
|
|
8
|
+
*/
|
|
9
|
+
const BISECTION_TRIALS_PER_LEVEL = 4;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* FM passes per bisection trial. METIS uses 10.
|
|
13
|
+
*/
|
|
14
|
+
const FM_PASSES_PER_TRIAL = 10;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Initial k-way partitioning via multilevel recursive bisection (MLRB) — the
|
|
18
|
+
* approach described in Karypis & Kumar 1998, §2.2.
|
|
19
|
+
*
|
|
20
|
+
* Quality-wise this is the algorithm the paper actually advocates for the
|
|
21
|
+
* initial-partition phase. We split the graph in two with weights proportional
|
|
22
|
+
* to the k-way target, recurse on each half, then project the resulting
|
|
23
|
+
* sub-partitions back as a 0..k-1 assignment on the parent.
|
|
24
|
+
*
|
|
25
|
+
* Compared to `initial_kway_bfs`, MLRB produces meaningfully better initial
|
|
26
|
+
* cuts at the cost of more work at this phase. Since refinement dominates total
|
|
27
|
+
* runtime, the overall slowdown is small while the cut improvement is large.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors `MlevelRecursiveBisection` from libmetis/pmetis.c, sans the inner
|
|
30
|
+
* coarsening loop — at this point our caller has already coarsened the graph
|
|
31
|
+
* and we operate on the coarsest level only.
|
|
32
|
+
*
|
|
33
|
+
* Writes to `graph.vertex_partition[]` (sized for `partition_count` partitions,
|
|
34
|
+
* values in [0, partition_count)). On entry `graph.vertex_partition` may be
|
|
35
|
+
* unallocated; we install fresh state.
|
|
36
|
+
*
|
|
37
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph the coarsest graph from
|
|
38
|
+
* the outer multilevel pipeline
|
|
39
|
+
* @param {number} partition_count k
|
|
40
|
+
* @param {number} ub_factor load-imbalance factor (typically 1.03)
|
|
41
|
+
* @param {function():number} random
|
|
42
|
+
*/
|
|
43
|
+
export function initial_kway_recursive_bisection(graph, partition_count, ub_factor, random) {
|
|
44
|
+
if (partition_count === 1) {
|
|
45
|
+
if (graph.vertex_partition === null) {
|
|
46
|
+
graph.vertex_partition = new Uint32Array(graph.vertex_count);
|
|
47
|
+
}
|
|
48
|
+
graph.vertex_partition.fill(0);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Single scratch allocation reused by every recursive bisect_graph call.
|
|
53
|
+
// Sized to the coarsest graph; subgraphs only ever touch [0, sub_vertex_count).
|
|
54
|
+
const scratch = new BisectionScratch(graph.vertex_count);
|
|
55
|
+
|
|
56
|
+
recursive_bisect_into_range(graph, 0, partition_count, ub_factor, random, scratch);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Recursively bisect `graph` so that on return `graph.vertex_partition[v]`
|
|
61
|
+
* holds an integer in `[first_partition_id, first_partition_id + partition_count)`.
|
|
62
|
+
*
|
|
63
|
+
* Each call takes one vertex_partition slot from the scratch pool, uses it as
|
|
64
|
+
* the graph's partition assignment, and releases it on return. Pool depth is
|
|
65
|
+
* bounded by recursion depth (= log2(k)), so at most ~log2(k) slots are ever
|
|
66
|
+
* live simultaneously — one per stack frame.
|
|
67
|
+
*
|
|
68
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
69
|
+
* @param {number} first_partition_id offset into the parent's partition id space
|
|
70
|
+
* @param {number} partition_count how many partitions to split this graph into
|
|
71
|
+
* @param {number} ub_factor
|
|
72
|
+
* @param {function():number} random
|
|
73
|
+
* @param {import('../bisection/BisectionScratch.js').BisectionScratch} scratch
|
|
74
|
+
*/
|
|
75
|
+
function recursive_bisect_into_range(graph, first_partition_id, partition_count, ub_factor, random, scratch) {
|
|
76
|
+
if (partition_count === 1) {
|
|
77
|
+
// Leaf: assign every vertex of this subgraph to `first_partition_id`.
|
|
78
|
+
// Borrow a slot from the pool — same as non-leaf calls so the projection
|
|
79
|
+
// step in the parent can read it back uniformly.
|
|
80
|
+
const vertex_partition = scratch.take_vertex_partition_slot(graph.vertex_count);
|
|
81
|
+
if (first_partition_id !== 0) {
|
|
82
|
+
vertex_partition.fill(first_partition_id, 0, graph.vertex_count);
|
|
83
|
+
}
|
|
84
|
+
graph.vertex_partition = vertex_partition;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Split k into left_count + right_count such that left_count weights the
|
|
89
|
+
// bisection target proportionally. For an odd k we put the extra partition
|
|
90
|
+
// on the right; this is arbitrary but matches METIS's convention.
|
|
91
|
+
const left_partition_count = Math.floor(partition_count / 2);
|
|
92
|
+
const right_partition_count = partition_count - left_partition_count;
|
|
93
|
+
|
|
94
|
+
// Bisection target: partition 0 gets `left_partition_count / partition_count`
|
|
95
|
+
// of the total vertex weight, so that subsequent recursion produces evenly
|
|
96
|
+
// weighted leaves overall.
|
|
97
|
+
const target_weight_for_partition_0 = Math.round(
|
|
98
|
+
graph.total_vertex_weight * left_partition_count / partition_count
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const vertex_partition = scratch.take_vertex_partition_slot(graph.vertex_count);
|
|
102
|
+
|
|
103
|
+
bisect_graph(
|
|
104
|
+
graph,
|
|
105
|
+
vertex_partition,
|
|
106
|
+
target_weight_for_partition_0,
|
|
107
|
+
BISECTION_TRIALS_PER_LEVEL,
|
|
108
|
+
FM_PASSES_PER_TRIAL,
|
|
109
|
+
ub_factor,
|
|
110
|
+
random,
|
|
111
|
+
scratch
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (partition_count === 2) {
|
|
115
|
+
// Base case: the bisection result IS the final k=2 assignment,
|
|
116
|
+
// just shifted into the right id range.
|
|
117
|
+
if (first_partition_id !== 0) {
|
|
118
|
+
const n = graph.vertex_count;
|
|
119
|
+
for (let v = 0; v < n; v++) {
|
|
120
|
+
vertex_partition[v] += first_partition_id;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Don't release the slot here — the caller's projection step needs to
|
|
124
|
+
// read graph.vertex_partition. The parent's recursive_bisect_into_range
|
|
125
|
+
// releases it after projecting.
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// General case: split the graph into two subgraphs, recurse on each, then
|
|
130
|
+
// project the sub-partitions back into `graph.vertex_partition`.
|
|
131
|
+
const {
|
|
132
|
+
side_0_subgraph,
|
|
133
|
+
side_1_subgraph,
|
|
134
|
+
side_0_subgraph_to_parent,
|
|
135
|
+
side_1_subgraph_to_parent
|
|
136
|
+
} = split_graph_two_way(graph);
|
|
137
|
+
|
|
138
|
+
recursive_bisect_into_range(
|
|
139
|
+
side_0_subgraph,
|
|
140
|
+
first_partition_id,
|
|
141
|
+
left_partition_count,
|
|
142
|
+
ub_factor,
|
|
143
|
+
random,
|
|
144
|
+
scratch
|
|
145
|
+
);
|
|
146
|
+
recursive_bisect_into_range(
|
|
147
|
+
side_1_subgraph,
|
|
148
|
+
first_partition_id + left_partition_count,
|
|
149
|
+
right_partition_count,
|
|
150
|
+
ub_factor,
|
|
151
|
+
random,
|
|
152
|
+
scratch
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
// Project assignments back into our own slot.
|
|
156
|
+
const side_0_partition = side_0_subgraph.vertex_partition;
|
|
157
|
+
const side_1_partition = side_1_subgraph.vertex_partition;
|
|
158
|
+
|
|
159
|
+
for (let sub_v = 0; sub_v < side_0_subgraph.vertex_count; sub_v++) {
|
|
160
|
+
vertex_partition[side_0_subgraph_to_parent[sub_v]] = side_0_partition[sub_v];
|
|
161
|
+
}
|
|
162
|
+
for (let sub_v = 0; sub_v < side_1_subgraph.vertex_count; sub_v++) {
|
|
163
|
+
vertex_partition[side_1_subgraph_to_parent[sub_v]] = side_1_partition[sub_v];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Children's vertex_partition slots are now free — release them in LIFO
|
|
167
|
+
// order (side_1 was taken last, so it pops first).
|
|
168
|
+
scratch.release_vertex_partition_slot(); // side_1
|
|
169
|
+
scratch.release_vertex_partition_slot(); // side_0
|
|
170
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure-JS k-way graph partitioning, drop-in compatible with the existing
|
|
3
|
+
* `micron_partition(...)` WASM-backed entry point.
|
|
4
|
+
*
|
|
5
|
+
* Implements the multilevel pipeline: coarsen → initial partition → uncoarsen
|
|
6
|
+
* with refinement at every level. Scope matches the subset that meep's
|
|
7
|
+
* `metis_cluster_bs` actually uses:
|
|
8
|
+
* - cut-objective only
|
|
9
|
+
* - single balance constraint, all vertex weights = 1
|
|
10
|
+
* - uniform target partition weights
|
|
11
|
+
* - no minconn / contig / volume / multi-constraint paths
|
|
12
|
+
*
|
|
13
|
+
* @param {number} vertex_count
|
|
14
|
+
* @param {number} partition_count
|
|
15
|
+
* @param {Uint32Array} edge_addresses CSR row pointers, length vertex_count + 1
|
|
16
|
+
* @param {Uint32Array} adjacency CSR column indices, length edge_addresses[vertex_count]
|
|
17
|
+
* @param {Uint32Array} edge_weights parallel to adjacency
|
|
18
|
+
* @param {{
|
|
19
|
+
* seed?: number,
|
|
20
|
+
* niter?: number,
|
|
21
|
+
* ufactor?: number,
|
|
22
|
+
* initial_partition_strategy?: 'recursive_bisection' | 'bfs',
|
|
23
|
+
* }} [options]
|
|
24
|
+
* Only a small slice of `metis_options` is wired; everything else uses METIS
|
|
25
|
+
* defaults.
|
|
26
|
+
* - `ufactor`: load imbalance factor in METIS units (per-mille over 1.0;
|
|
27
|
+
* ufactor = 30 → ub_factor = 1.03). Default 30.
|
|
28
|
+
* - `niter`: number of FM passes per level. Default 10.
|
|
29
|
+
* - `seed`: RNG seed; same seed + same input ⇒ same partition. Default 0.
|
|
30
|
+
* - `initial_partition_strategy`: 'recursive_bisection' (Karypis-Kumar §2.2,
|
|
31
|
+
* higher quality) or 'bfs' (simpler, faster initial phase, weaker cut).
|
|
32
|
+
* Default 'recursive_bisection'.
|
|
33
|
+
* @returns {Uint32Array} partition assignment per vertex, values in [0, partition_count)
|
|
34
|
+
*/
|
|
35
|
+
export function metis_partition_kway(vertex_count: number, partition_count: number, edge_addresses: Uint32Array, adjacency: Uint32Array, edge_weights: Uint32Array, options?: {
|
|
36
|
+
seed?: number;
|
|
37
|
+
niter?: number;
|
|
38
|
+
ufactor?: number;
|
|
39
|
+
initial_partition_strategy?: 'recursive_bisection' | 'bfs';
|
|
40
|
+
}): Uint32Array;
|
|
41
|
+
//# sourceMappingURL=metis_partition_kway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metis_partition_kway.d.ts","sourceRoot":"","sources":["../../../../../../src/core/graph/metis/native/metis_partition_kway.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,mDAtBW,MAAM,mBACN,MAAM,kBACN,WAAW,aACX,WAAW,gBACX,WAAW;WAEV,MAAM;YACL,MAAM;cACJ,MAAM;iCACa,qBAAqB,GAAG,KAAK;IAWlD,WAAW,CAoFvB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { seededRandom_Mulberry32 } from "../../../math/random/seededRandom_Mulberry32.js";
|
|
2
|
+
import { coarsen_graph } from "./coarsen/coarsen_graph.js";
|
|
3
|
+
import { initial_kway_bfs } from "./initial/initial_kway_bfs.js";
|
|
4
|
+
import { initial_kway_recursive_bisection } from "./initial/initial_kway_recursive_bisection.js";
|
|
5
|
+
import { MetisGraph } from "./MetisGraph.js";
|
|
6
|
+
import { compute_kway_params } from "./refine/compute_kway_params.js";
|
|
7
|
+
import { refine_kway } from "./refine/refine_kway.js";
|
|
8
|
+
import { RefinementScratch } from "./refine/RefinementScratch.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Pure-JS k-way graph partitioning, drop-in compatible with the existing
|
|
12
|
+
* `micron_partition(...)` WASM-backed entry point.
|
|
13
|
+
*
|
|
14
|
+
* Implements the multilevel pipeline: coarsen → initial partition → uncoarsen
|
|
15
|
+
* with refinement at every level. Scope matches the subset that meep's
|
|
16
|
+
* `metis_cluster_bs` actually uses:
|
|
17
|
+
* - cut-objective only
|
|
18
|
+
* - single balance constraint, all vertex weights = 1
|
|
19
|
+
* - uniform target partition weights
|
|
20
|
+
* - no minconn / contig / volume / multi-constraint paths
|
|
21
|
+
*
|
|
22
|
+
* @param {number} vertex_count
|
|
23
|
+
* @param {number} partition_count
|
|
24
|
+
* @param {Uint32Array} edge_addresses CSR row pointers, length vertex_count + 1
|
|
25
|
+
* @param {Uint32Array} adjacency CSR column indices, length edge_addresses[vertex_count]
|
|
26
|
+
* @param {Uint32Array} edge_weights parallel to adjacency
|
|
27
|
+
* @param {{
|
|
28
|
+
* seed?: number,
|
|
29
|
+
* niter?: number,
|
|
30
|
+
* ufactor?: number,
|
|
31
|
+
* initial_partition_strategy?: 'recursive_bisection' | 'bfs',
|
|
32
|
+
* }} [options]
|
|
33
|
+
* Only a small slice of `metis_options` is wired; everything else uses METIS
|
|
34
|
+
* defaults.
|
|
35
|
+
* - `ufactor`: load imbalance factor in METIS units (per-mille over 1.0;
|
|
36
|
+
* ufactor = 30 → ub_factor = 1.03). Default 30.
|
|
37
|
+
* - `niter`: number of FM passes per level. Default 10.
|
|
38
|
+
* - `seed`: RNG seed; same seed + same input ⇒ same partition. Default 0.
|
|
39
|
+
* - `initial_partition_strategy`: 'recursive_bisection' (Karypis-Kumar §2.2,
|
|
40
|
+
* higher quality) or 'bfs' (simpler, faster initial phase, weaker cut).
|
|
41
|
+
* Default 'recursive_bisection'.
|
|
42
|
+
* @returns {Uint32Array} partition assignment per vertex, values in [0, partition_count)
|
|
43
|
+
*/
|
|
44
|
+
export function metis_partition_kway(
|
|
45
|
+
vertex_count,
|
|
46
|
+
partition_count,
|
|
47
|
+
edge_addresses,
|
|
48
|
+
adjacency,
|
|
49
|
+
edge_weights,
|
|
50
|
+
options
|
|
51
|
+
) {
|
|
52
|
+
const raw_seed = options?.seed;
|
|
53
|
+
const seed = (raw_seed === undefined || raw_seed === -1) ? 0 : raw_seed;
|
|
54
|
+
|
|
55
|
+
const raw_pass_count = options?.niter;
|
|
56
|
+
const pass_count = (raw_pass_count === undefined || raw_pass_count === -1) ? 10 : raw_pass_count;
|
|
57
|
+
|
|
58
|
+
const raw_ufactor = options?.ufactor;
|
|
59
|
+
const ufactor = (raw_ufactor === undefined || raw_ufactor === -1) ? 30 : raw_ufactor;
|
|
60
|
+
const ub_factor = 1 + ufactor / 1000;
|
|
61
|
+
|
|
62
|
+
const initial_partition_strategy = options?.initial_partition_strategy ?? 'recursive_bisection';
|
|
63
|
+
|
|
64
|
+
const random = seededRandom_Mulberry32(seed);
|
|
65
|
+
|
|
66
|
+
if (vertex_count === 0 || partition_count <= 1) {
|
|
67
|
+
return new Uint32Array(vertex_count);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Copy the input CSR into a MetisGraph with a single shared buffer. We
|
|
71
|
+
// can't alias the caller's arrays directly because CSRGraph owns one
|
|
72
|
+
// contiguous buffer and aliasing would split the four arrays across
|
|
73
|
+
// independent buffers, breaking copy/equals/hash. The copy cost is small
|
|
74
|
+
// relative to the partitioning work that follows.
|
|
75
|
+
const original_graph = new MetisGraph(vertex_count, edge_addresses[vertex_count]);
|
|
76
|
+
original_graph.edge_addresses.set(edge_addresses);
|
|
77
|
+
original_graph.adjacency.set(adjacency);
|
|
78
|
+
original_graph.edge_weights.set(edge_weights);
|
|
79
|
+
// vertex_weights stays at the all-1s default; total_vertex_weight = vertex_count.
|
|
80
|
+
|
|
81
|
+
// METIS heuristic for the coarsening floor: stop once we're down to about
|
|
82
|
+
// 30·k vertices (or vertex_count / (20·log2(k)), whichever is greater).
|
|
83
|
+
const coarsen_until_vertex_count = Math.max(
|
|
84
|
+
Math.ceil(vertex_count / (20 * Math.log2(Math.max(2, partition_count)))),
|
|
85
|
+
30 * partition_count
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
let coarsest_graph;
|
|
89
|
+
if (vertex_count <= coarsen_until_vertex_count) {
|
|
90
|
+
// Graph is already small enough; skip multilevel. Refinement still runs
|
|
91
|
+
// on this single level via the refine_kway driver.
|
|
92
|
+
coarsest_graph = original_graph;
|
|
93
|
+
} else {
|
|
94
|
+
coarsest_graph = coarsen_graph(original_graph, { random, coarsen_until_vertex_count });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (initial_partition_strategy === 'recursive_bisection') {
|
|
98
|
+
// Recursive bisection leaves `coarsest_graph.vertex_partition` pointing
|
|
99
|
+
// at a buffer that's now owned by the graph (the BisectionScratch goes
|
|
100
|
+
// out of scope but the partition buffer survives because the graph
|
|
101
|
+
// still references it). `allocate_partition_state` preserves the
|
|
102
|
+
// existing vertex_partition, so we just install the rest of the k-way
|
|
103
|
+
// state on top.
|
|
104
|
+
initial_kway_recursive_bisection(coarsest_graph, partition_count, ub_factor, random);
|
|
105
|
+
coarsest_graph.allocate_partition_state(partition_count);
|
|
106
|
+
} else {
|
|
107
|
+
coarsest_graph.allocate_partition_state(partition_count);
|
|
108
|
+
initial_kway_bfs(coarsest_graph, partition_count, random);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
compute_kway_params(coarsest_graph, partition_count);
|
|
112
|
+
|
|
113
|
+
// Shared scratch for fm_kway across every uncoarsening level. Sized to the
|
|
114
|
+
// original (finest) graph since that's the largest level we'll process.
|
|
115
|
+
const refinement_scratch = new RefinementScratch(original_graph.vertex_count, partition_count);
|
|
116
|
+
|
|
117
|
+
refine_kway(
|
|
118
|
+
original_graph,
|
|
119
|
+
coarsest_graph,
|
|
120
|
+
partition_count,
|
|
121
|
+
{ random, pass_count, ub_factor },
|
|
122
|
+
refinement_scratch
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
return original_graph.vertex_partition;
|
|
126
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class IndexedFloatMaxHeap {
|
|
2
|
+
/**
|
|
3
|
+
* @param {number} id_capacity ids must be in [0, id_capacity)
|
|
4
|
+
* @param {number} [initial_slot_capacity] initial heap slot count (grows on demand)
|
|
5
|
+
*/
|
|
6
|
+
constructor(id_capacity: number, initial_slot_capacity?: number);
|
|
7
|
+
__slot_capacity: number;
|
|
8
|
+
__size: number;
|
|
9
|
+
__data_buffer: ArrayBuffer;
|
|
10
|
+
__data_uint32: Uint32Array;
|
|
11
|
+
__data_float32: Float32Array;
|
|
12
|
+
/**
|
|
13
|
+
* Maps id → slot index in [0, size), or SLOT_NOT_PRESENT.
|
|
14
|
+
* @type {Uint32Array}
|
|
15
|
+
*/
|
|
16
|
+
__slot_of_id: Uint32Array;
|
|
17
|
+
get size(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Empty the heap. Only resets the index entries that are actually populated,
|
|
20
|
+
* so this is O(size), not O(id_capacity).
|
|
21
|
+
*/
|
|
22
|
+
clear(): void;
|
|
23
|
+
contains(id: any): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Swap the entries at two slot indices, keeping the id→slot index in sync.
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
private __swap_slots;
|
|
29
|
+
/**
|
|
30
|
+
* Restore heap order downward starting at `start_slot`. Used when an entry's
|
|
31
|
+
* score has just decreased.
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
private __sift_down;
|
|
35
|
+
/**
|
|
36
|
+
* Restore heap order upward starting at `start_slot`. Used when an entry's
|
|
37
|
+
* score has just increased.
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
private __sift_up;
|
|
41
|
+
__grow_capacity(): void;
|
|
42
|
+
/**
|
|
43
|
+
* @param {number} id
|
|
44
|
+
* @param {number} score
|
|
45
|
+
*/
|
|
46
|
+
insert(id: number, score: number): void;
|
|
47
|
+
/**
|
|
48
|
+
* @returns {number} id of the entry with the largest score, or -1 if empty
|
|
49
|
+
*/
|
|
50
|
+
pop_max(): number;
|
|
51
|
+
/**
|
|
52
|
+
* @param {number} id
|
|
53
|
+
* @param {number} new_score
|
|
54
|
+
*/
|
|
55
|
+
update(id: number, new_score: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* @param {number} id
|
|
58
|
+
* @returns {boolean} true if the id was present and removed
|
|
59
|
+
*/
|
|
60
|
+
remove(id: number): boolean;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=IndexedFloatMaxHeap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedFloatMaxHeap.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js"],"names":[],"mappings":"AA6BA;IACI;;;OAGG;IACH,yBAHW,MAAM,0BACN,MAAM,EAsBhB;IAbG,wBAA4C;IAC5C,eAAe;IAEf,2BAA4E;IAC5E,2BAAwD;IACxD,6BAA0D;IAE1D;;;OAGG;IACH,cAFU,WAAW,CAE2B;IAIpD,mBAEC;IAED;;;OAGG;IACH,cAQC;IAED,2BAEC;IAED;;;OAGG;IACH,qBAkBC;IAED;;;;OAIG;IACH,oBAsBC;IAED;;;;OAIG;IACH,kBAYC;IAED,wBAUC;IAED;;;OAGG;IACH,WAHW,MAAM,SACN,MAAM,QAehB;IAED;;OAEG;IACH,WAFa,MAAM,CAuBlB;IAED;;;OAGG;IACH,WAHW,MAAM,aACN,MAAM,QAehB;IAED;;;OAGG;IACH,WAHW,MAAM,GACJ,OAAO,CA+BnB;CACJ"}
|