@jetta/blocks-allocator 0.0.0-stage → 0.1.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 (282) hide show
  1. package/README.md +103 -2
  2. package/package.json +67 -5
  3. package/src/Allocation_Attempt.js +135 -0
  4. package/src/Allocation_Error_Handler.js +69 -0
  5. package/src/Allocation_Flow.js +162 -0
  6. package/src/Allocation_Optimization/Allocation_LP.js +150 -0
  7. package/src/Allocation_Optimization/Block_Allocator.js +129 -0
  8. package/src/Allocation_Optimization/Block_Layer_Order.js +50 -0
  9. package/src/Allocation_Optimization/Block_Potential_Weight.js +54 -0
  10. package/src/Allocation_Optimization/Chosen_Blocks_Stock_Cap.js +82 -0
  11. package/src/Allocation_Optimization/block_builder/Allocation_Item_Creator.js +37 -0
  12. package/src/Allocation_Optimization/block_builder/Block_Item_List_Validator.js +18 -0
  13. package/src/Allocation_Optimization/block_builder/Block_Wall_Builder.js +303 -0
  14. package/src/Allocation_Optimization/block_builder/Blocks_Builder.js +40 -0
  15. package/src/Allocation_Optimization/block_builder/Next_Block_Position.js +33 -0
  16. package/src/Allocation_Optimization/block_builder/Slot_Item_Assigner.js +45 -0
  17. package/src/Allocation_Optimization/block_builder/Stacking_Validation.js +30 -0
  18. package/src/Allocation_Optimization/block_builder/assert_tie_ratio_block_matches_orientation_below.js +44 -0
  19. package/src/Allocation_Optimization/block_builder/block_shape_stock.js +129 -0
  20. package/src/Allocation_Optimization/block_builder/exceptions/Empty_Block_Item_List_Exception.js +21 -0
  21. package/src/Allocation_Optimization/block_builder/exceptions/Invalid_Stacking_Exception.js +14 -0
  22. package/src/Allocation_Optimization/block_builder/exceptions/No_Suitable_Item_Exception.js +16 -0
  23. package/src/Allocation_Optimization/block_builder/exceptions/Restricted_Block_Exception.js +21 -0
  24. package/src/Allocation_Optimization/block_builder/should_omit_block_group_id.js +29 -0
  25. package/src/Allocation_Optimization/block_builder/snap_elevated_block_wall_items.js +34 -0
  26. package/src/Allocation_Optimization/block_builder/stacking_rules_input.js +52 -0
  27. package/src/Allocation_Optimization/cap_chosen_blocks_by_shape_stock.js +110 -0
  28. package/src/Allocation_Optimization/density_groups/Adaptive_Density_Group_Preparer.js +21 -0
  29. package/src/Allocation_Optimization/density_groups/Adaptive_Density_Group_Selector.js +55 -0
  30. package/src/Allocation_Optimization/density_groups/Adaptive_Density_Group_Threshold_Resolver.js +28 -0
  31. package/src/Allocation_Optimization/density_groups/Adaptive_Density_Group_Thresholds.js +23 -0
  32. package/src/Allocation_Optimization/density_groups/Container_Utilization.js +67 -0
  33. package/src/Allocation_Optimization/density_groups/Density_Group_Partitioner.js +74 -0
  34. package/src/Allocation_Optimization/density_groups/Density_Group_Scheduler.js +168 -0
  35. package/src/Allocation_Optimization/density_groups/Density_Group_Stock.js +49 -0
  36. package/src/Allocation_Optimization/density_groups/Density_Groups_Strategy.js +26 -0
  37. package/src/Allocation_Optimization/density_groups/Item_Density_Calculator.js +20 -0
  38. package/src/Allocation_Optimization/density_groups/Lock_Weight_Ahead_Release.js +75 -0
  39. package/src/Allocation_Optimization/exceptions/Invalid_Item_Amount_Exception.js +17 -0
  40. package/src/Allocation_Optimization/exceptions/No_Valid_Allocation_Exception.js +14 -0
  41. package/src/Allocation_Optimization/exceptions/Optimization_Infeasible_Exception.js +14 -0
  42. package/src/Allocation_Optimization/functions/Measure_Reader.js +20 -0
  43. package/src/Allocation_Optimization/functions/Weight_Getter/Measure_Cobination_Mode.js +25 -0
  44. package/src/Allocation_Optimization/functions/Weight_Getter/Measure_Cobination_Strategies.js +8 -0
  45. package/src/Allocation_Optimization/functions/Weight_Getter/Measure_Combination_Mode_Checkers.js +70 -0
  46. package/src/Allocation_Optimization/functions/Weight_Getter/Translation.js +22 -0
  47. package/src/Allocation_Optimization/functions/Weight_Getter/Variable_Weight_Getter.js +85 -0
  48. package/src/Allocation_Optimization/functions/Weight_Getter/constants.js +16 -0
  49. package/src/Allocation_Optimization/functions/measure_to_optimize.js +6 -0
  50. package/src/Allocation_Optimization/item_consumption_heuristic/Capacity_Bias_Item_Order.js +76 -0
  51. package/src/Allocation_Optimization/item_consumption_heuristic/Choose_Item_Heuristic_Context.js +63 -0
  52. package/src/Allocation_Optimization/item_consumption_heuristic/Item_Chooser.js +159 -0
  53. package/src/Allocation_Optimization/item_consumption_heuristic/Item_For_Slot_Chooser.js +49 -0
  54. package/src/Allocation_Optimization/item_consumption_heuristic/Slot_Compatible_Items_Finder.js +88 -0
  55. package/src/Allocation_Optimization/item_consumption_heuristic/Slots_Items_Assigner.js +182 -0
  56. package/src/Allocation_Optimization/item_consumption_heuristic/Stack_Slot_Calculator.js +87 -0
  57. package/src/Allocation_Optimization/item_consumption_heuristic/Weight_Slot_Distribution.js +72 -0
  58. package/src/Allocation_Optimization/item_consumption_heuristic/exceptions/Empty_Slot_Exception.js +17 -0
  59. package/src/Allocation_Optimization/item_consumption_heuristic/exceptions/Item_Taller_Than_Limit_Exception.js +21 -0
  60. package/src/Allocation_Optimization/item_consumption_heuristic/exceptions/No_Available_Items_Exception.js +14 -0
  61. package/src/Allocation_Optimization/item_consumption_heuristic/exceptions/No_Slots_For_Items_Exception.js +14 -0
  62. package/src/Allocation_Optimization/lp_model/Block_Weight_Calculator.js +31 -0
  63. package/src/Allocation_Optimization/lp_model/LP_Data_Processor.js +42 -0
  64. package/src/Allocation_Optimization/lp_model/LP_Item_Slot_Assignment.js +93 -0
  65. package/src/Allocation_Optimization/lp_model/LP_Result_Mapper.js +47 -0
  66. package/src/Allocation_Optimization/lp_model/model_builder/Dimension_Range_Helper.js +49 -0
  67. package/src/Allocation_Optimization/lp_model/model_builder/Item_Assignment_Variables.js +133 -0
  68. package/src/Allocation_Optimization/lp_model/model_builder/LP_Model_Builder.js +132 -0
  69. package/src/Allocation_Optimization/lp_model/model_builder/exceptions/Missing_Item_Stock_Exception.js +18 -0
  70. package/src/Allocation_Optimization/lp_model/model_builder/goal_function/Goal_Function_Creator.js +83 -0
  71. package/src/Allocation_Optimization/lp_model/model_builder/item_dimension_hashes.js +31 -0
  72. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Block_Item_Amount_Restriction.js +53 -0
  73. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Coherence_Restriction.js +65 -0
  74. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Container_Supported_Weight_Restriction.js +42 -0
  75. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Relational_Exact_Pass_Amount_Restriction.js +62 -0
  76. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Relational_Group_Restriction.js +97 -0
  77. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Single_Item_Type_Restriction.js +79 -0
  78. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Space_Restriction.js +47 -0
  79. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Unavailable_Block_Restriction.js +27 -0
  80. package/src/Allocation_Optimization/lp_model/model_builder/restrictions/Uniform_Block_Measure_Restriction.js +92 -0
  81. package/src/Allocation_Optimization/next_group_id_after_preloaded.js +30 -0
  82. package/src/Allocation_Optimization/preferential_blocks/Preferential_Block_Identifier.js +74 -0
  83. package/src/Allocation_Optimization/preferential_blocks/key_item/Key_Item_Mapper.js +49 -0
  84. package/src/Allocation_Optimization/preferential_blocks/key_item/rules/Almost_Unique_Item.js +31 -0
  85. package/src/Allocation_Optimization/preferential_blocks/key_item/rules/Cant_Stack_It_Self.js +68 -0
  86. package/src/Allocation_Optimization/preferential_blocks/key_item/rules/Rule_Interface.js +26 -0
  87. package/src/Allocation_Optimization/tie_ratio/Tie_Ratio_Intercalation_State.js +49 -0
  88. package/src/Allocation_Optimization/tie_ratio/Tie_Ratio_Orientation_Filter.js +33 -0
  89. package/src/Allocation_Optimization/tie_ratio/Tie_Ratio_Vertical_Stack_Filter.js +20 -0
  90. package/src/Allocation_Optimization/tie_ratio/collect_tie_ratio_orientations_below_footprint.js +64 -0
  91. package/src/Allocation_Optimization/tie_ratio/filter_blocks_by_orientation.js +17 -0
  92. package/src/Allocation_Optimization/tie_ratio/find_orientation_below_space.js +77 -0
  93. package/src/Allocation_Optimization/tie_ratio/loose_on_block/allocated_item_penetrates_any.js +31 -0
  94. package/src/Allocation_Optimization/tie_ratio/loose_on_block/apply_loose_placement_to_allocated_item.js +94 -0
  95. package/src/Allocation_Optimization/tie_ratio/loose_on_block/axis_overlap_length.js +16 -0
  96. package/src/Allocation_Optimization/tie_ratio/loose_on_block/block_local_origin.js +18 -0
  97. package/src/Allocation_Optimization/tie_ratio/loose_on_block/box_fits_inside_container.js +39 -0
  98. package/src/Allocation_Optimization/tie_ratio/loose_on_block/build_allocated_item_at_placement.js +18 -0
  99. package/src/Allocation_Optimization/tie_ratio/loose_on_block/build_placement_on_generic_supporter.js +64 -0
  100. package/src/Allocation_Optimization/tie_ratio/loose_on_block/build_slot_grid_from_cluster.js +66 -0
  101. package/src/Allocation_Optimization/tie_ratio/loose_on_block/compare_group_ids.js +20 -0
  102. package/src/Allocation_Optimization/tie_ratio/loose_on_block/container_with_pending_wall_items.js +26 -0
  103. package/src/Allocation_Optimization/tie_ratio/loose_on_block/empty_space_is_on_floor.js +16 -0
  104. package/src/Allocation_Optimization/tie_ratio/loose_on_block/finalize_loose_item_placement.js +58 -0
  105. package/src/Allocation_Optimization/tie_ratio/loose_on_block/find_best_generic_supporter_placement.js +58 -0
  106. package/src/Allocation_Optimization/tie_ratio/loose_on_block/find_next_free_slot_index.js +119 -0
  107. package/src/Allocation_Optimization/tie_ratio/loose_on_block/find_supporter_directly_below.js +51 -0
  108. package/src/Allocation_Optimization/tie_ratio/loose_on_block/find_tie_ratio_supporter_cluster.js +57 -0
  109. package/src/Allocation_Optimization/tie_ratio/loose_on_block/footprint_xz_overlap_area.js +26 -0
  110. package/src/Allocation_Optimization/tie_ratio/loose_on_block/item_fits_supporter_slot.js +22 -0
  111. package/src/Allocation_Optimization/tie_ratio/loose_on_block/loose_footprint_region_from_options.js +24 -0
  112. package/src/Allocation_Optimization/tie_ratio/loose_on_block/loose_item_fits_inside_container.js +21 -0
  113. package/src/Allocation_Optimization/tie_ratio/loose_on_block/loose_item_has_geometric_support.js +21 -0
  114. package/src/Allocation_Optimization/tie_ratio/loose_on_block/loose_on_block_slot_state.js +88 -0
  115. package/src/Allocation_Optimization/tie_ratio/loose_on_block/placement_coords_fit_inside_container.js +34 -0
  116. package/src/Allocation_Optimization/tie_ratio/loose_on_block/read_empilhar_area_igual_from_allocation_item.js +12 -0
  117. package/src/Allocation_Optimization/tie_ratio/loose_on_block/realigned_loose_geometry_gates.js +25 -0
  118. package/src/Allocation_Optimization/tie_ratio/loose_on_block/resolve_loose_on_generic_supporter.js +65 -0
  119. package/src/Allocation_Optimization/tie_ratio/loose_on_block/resolve_loose_placement_position.js +68 -0
  120. package/src/Allocation_Optimization/tie_ratio/loose_on_block/resolve_placement_y_at_slot.js +45 -0
  121. package/src/Allocation_Optimization/tie_ratio/loose_on_block/resolve_without_tie_ratio_cluster.js +79 -0
  122. package/src/Allocation_Optimization/tie_ratio/loose_on_block/select_tie_ratio_slot_placement.js +84 -0
  123. package/src/Allocation_Optimization/tie_ratio/loose_on_block/slot_footprint_collision.js +105 -0
  124. package/src/Allocation_Optimization/tie_ratio/loose_on_block/tie_ratio_cluster_selection.js +119 -0
  125. package/src/Allocation_Optimization/tie_ratio/loose_on_block/tie_ratio_footprint_overlap.js +56 -0
  126. package/src/Allocation_Optimization/tie_ratio/loose_on_block/tie_ratio_placement_plane.js +109 -0
  127. package/src/Allocation_Optimization/tie_ratio/loose_on_block/tie_ratio_supporter_predicate.js +23 -0
  128. package/src/Allocation_Optimization/tie_ratio/loose_on_block/try_tie_ratio_slot_placement.js +62 -0
  129. package/src/Allocation_Optimization/tie_ratio/snap_stacked_items_to_floor_footprints.js +138 -0
  130. package/src/Allocation_Optimization/tie_ratio/supporters_by_top_y_index.js +78 -0
  131. package/src/Allocation_Optimization/tie_ratio/tie_ratio_orientation_below_empty_space.js +89 -0
  132. package/src/Allocation_Optimization/tie_ratio/tie_ratio_orientation_from_group.js +48 -0
  133. package/src/Block_Management.js +34 -0
  134. package/src/Blocks_Preparation/Cube_Map_Function.js +27 -0
  135. package/src/Blocks_Wall_Allocation.js +3 -0
  136. package/src/IO/Answer_Status.js +4 -0
  137. package/src/IO/Output_Builder.js +35 -0
  138. package/src/IO/count_allocated_items.js +31 -0
  139. package/src/IO/create_error_response.js +62 -0
  140. package/src/IO/format_allocation_error_message.js +25 -0
  141. package/src/Item_Continuation_Lock.js +129 -0
  142. package/src/Item_Picking_Continuity.js +41 -0
  143. package/src/allocation_flow/chooser_session_state.js +21 -0
  144. package/src/allocation_flow/compound_probe_fallback.js +17 -0
  145. package/src/allocation_flow/container_remaining_capacity.js +23 -0
  146. package/src/allocation_flow/density_group_item_filter.js +31 -0
  147. package/src/allocation_flow/effective_item_fingerprint.js +14 -0
  148. package/src/allocation_flow/item_continuation_lock_gate.js +38 -0
  149. package/src/allocation_flow/no_space_left_recovery.js +48 -0
  150. package/src/allocation_flow/run_allocation_iteration.js +155 -0
  151. package/src/allocation_flow/space_skip_state.js +91 -0
  152. package/src/allocation_flow/try_no_space_left_recovery.js +50 -0
  153. package/src/exceptions/Invalid_Parameter_Exception.js +17 -0
  154. package/src/exceptions/Relational_Allocation_Incomplete_Exception.js +24 -0
  155. package/src/exceptions/Relational_Colocation_Violation_Exception.js +23 -0
  156. package/src/exceptions/Relational_Config_Mismatch_Exception.js +17 -0
  157. package/src/exceptions/There_Is_No_Block_Options_To_Allocate_Exception.js +14 -0
  158. package/src/index.js +6 -0
  159. package/src/input_preparation/Block_Formatter.js +179 -0
  160. package/src/input_preparation/Input_Creator.js +76 -0
  161. package/src/input_preparation/Input_State_Preparation.js +47 -0
  162. package/src/input_preparation/State_Builder.js +27 -0
  163. package/src/input_preparation/block_formatter/align_flush_axis_config.js +36 -0
  164. package/src/input_preparation/block_formatter/align_flush_axis_single_round.js +112 -0
  165. package/src/input_preparation/block_formatter/align_flush_stacked_slots.js +67 -0
  166. package/src/input_preparation/block_formatter/overlapped_slots.js +24 -0
  167. package/src/input_preparation/block_formatter/parallelepiped_shell.js +38 -0
  168. package/src/input_preparation/block_formatter/rectangle_coverage.js +112 -0
  169. package/src/input_preparation/block_formatter/shell_face_coverage.js +64 -0
  170. package/src/input_preparation/block_formatter/shell_snap_convergence.js +104 -0
  171. package/src/input_preparation/block_preparation/Block_Data_To_Object_Transformer.js +57 -0
  172. package/src/input_preparation/block_preparation/Block_Module_Name.js +17 -0
  173. package/src/input_preparation/block_preparation/Blocks_Creator.js +101 -0
  174. package/src/input_preparation/block_preparation/Blocksmith.js +19 -0
  175. package/src/input_preparation/block_preparation/block_modules/create_block_candidates.js +41 -0
  176. package/src/input_preparation/block_preparation/block_modules/manual_blocks.js +10 -0
  177. package/src/input_preparation/block_preparation/block_modules/module_registry.js +20 -0
  178. package/src/input_preparation/block_preparation/block_modules/run_creator.js +34 -0
  179. package/src/input_preparation/block_preparation/block_modules/single_item_blocks.js +12 -0
  180. package/src/input_preparation/block_preparation/block_modules/spiral_blocks.js +12 -0
  181. package/src/input_preparation/block_preparation/block_modules/tie_ratio_blocks.js +12 -0
  182. package/src/input_preparation/block_preparation/block_modules/tower_blocks.js +12 -0
  183. package/src/input_preparation/block_preparation/exceptions/Failed_To_Create_Block_Exception.js +14 -0
  184. package/src/input_preparation/block_preparation/exceptions/Failed_To_Retrieve_Block_Exception.js +17 -0
  185. package/src/input_preparation/block_preparation/exceptions/Missing_Object_Store_Exception.js +10 -0
  186. package/src/input_preparation/block_preparation/exceptions/No_Blocks_Were_Created_Exception.js +14 -0
  187. package/src/input_preparation/block_preparation/input/Input_Creator.js +96 -0
  188. package/src/input_preparation/block_preparation/manual_blocks/Manual_Blocks.js +95 -0
  189. package/src/input_preparation/build_empty_space_finder_options.js +43 -0
  190. package/src/input_preparation/item_preparation/Items_Reader.js +27 -0
  191. package/src/input_preparation/min_extents_from_items.js +29 -0
  192. package/src/input_preparation/stackability_index/Blocks_Stackability_Index_Calculator.js +58 -0
  193. package/src/input_preparation/stackability_index/Slots_Stackability_index_Calculator.js +28 -0
  194. package/src/input_preparation/stackability_index/Stackability_Input_Creator.js +27 -0
  195. package/src/input_preparation/stackability_index/stackability_index_pop_stack.js +81 -0
  196. package/src/input_preparation/stacking_constraints/Weight_Stacking_Validation.js +15 -0
  197. package/src/lp_optimizer_result_status.js +20 -0
  198. package/src/messages/Allocator_Message.js +42 -0
  199. package/src/messages/resolve_error_message_entry.js +57 -0
  200. package/src/models/Allocated_Item.js +136 -0
  201. package/src/models/Allocation_Item.js +219 -0
  202. package/src/models/Block.js +198 -0
  203. package/src/models/Cargo_Profile.js +418 -0
  204. package/src/models/Preloaded_Allocated_Item.js +132 -0
  205. package/src/models/Slot.js +67 -0
  206. package/src/models/Stacking_Rules.js +58 -0
  207. package/src/models/auxiliaryFunctions/Available_Block_Module_List_Creator.js +9 -0
  208. package/src/models/auxiliaryFunctions/Measure_Translator.js +24 -0
  209. package/src/models/auxiliaryFunctions/item_json_reader.js +44 -0
  210. package/src/models/item_json_reader.js +71 -0
  211. package/src/models/placed_item_record.js +70 -0
  212. package/src/models/preloaded_rotation_helpers.js +38 -0
  213. package/src/models/slots_have_same_measure.js +45 -0
  214. package/src/models/transport/Container.js +162 -0
  215. package/src/models/transport/Transport.js +62 -0
  216. package/src/models/transport/build_stacking_feasibility_checker.js +64 -0
  217. package/src/models/transport/container_stacking_checkpoint.js +42 -0
  218. package/src/models/transport/factory/Container_Factory.js +46 -0
  219. package/src/models/transport/factory/Corner_Casting_Factory.js +62 -0
  220. package/src/models/transport/factory/Previously_Allocated_Item_Factory.js +28 -0
  221. package/src/models/transport/factory/Transport_Factory.js +13 -0
  222. package/src/models/transport/items_for_empty_space_finder.js +91 -0
  223. package/src/models/transport/resolve_container_stacking_inputs.js +23 -0
  224. package/src/models/transport/stacking_input_from_wire.js +58 -0
  225. package/src/optimizer_connection_errors.js +50 -0
  226. package/src/relational/Relational_Error_Codes.js +7 -0
  227. package/src/relational/finalize_relational_allocation.js +20 -0
  228. package/src/relational/has_relational_items.js +11 -0
  229. package/src/relational/is_relational_error_code.js +15 -0
  230. package/src/relational/resolve_relational_container_sequences.js +29 -0
  231. package/src/run_core_allocation.js +118 -0
  232. package/src/space_and_block_chooser/Space_And_Blocks_Chooser.js +115 -0
  233. package/src/space_and_block_chooser/blocks_filters/Block_Filter_Interface.js +19 -0
  234. package/src/space_and_block_chooser/blocks_filters/Filter_Runner.js +46 -0
  235. package/src/space_and_block_chooser/blocks_filters/initial_blocks_filter/Block_With_Overlapped_Slots_Filter.js +14 -0
  236. package/src/space_and_block_chooser/blocks_filters/initial_blocks_filter/Initial_Blocks_Filter_List.js +19 -0
  237. package/src/space_and_block_chooser/blocks_filters/pos_selection_filters/Blocks_Bigger_Than_Space_Filter.js +17 -0
  238. package/src/space_and_block_chooser/blocks_filters/pos_selection_filters/Post_Selection_Filter_List.js +9 -0
  239. package/src/space_and_block_chooser/blocks_filters/pre_selection_filter/Insuficient_Items_Filter.js +81 -0
  240. package/src/space_and_block_chooser/blocks_filters/pre_selection_filter/Pre_Selection_Filter_List.js +8 -0
  241. package/src/space_and_block_chooser/blocks_filters/pre_selection_filter/max_tower_height/Blocks_Lower_Than_Max_Tower_Height.js +23 -0
  242. package/src/space_and_block_chooser/blocks_filters/pre_selection_filter/max_tower_height/Max_Tower_Height.js +82 -0
  243. package/src/space_and_block_chooser/build_allocated_item_snapshots.js +19 -0
  244. package/src/space_and_block_chooser/compound_first_empty_space_branch.js +61 -0
  245. package/src/space_and_block_chooser/compound_first_with_leftover_fill.js +142 -0
  246. package/src/space_and_block_chooser/compound_first_without_leftover_fill.js +56 -0
  247. package/src/space_and_block_chooser/empty_spaces_where_post_selection_keeps_blocks.js +83 -0
  248. package/src/space_and_block_chooser/exceptions/Invalid_Space_To_Allocate_Exception.js +14 -0
  249. package/src/space_and_block_chooser/leftover_space_memory.js +113 -0
  250. package/src/space_and_block_chooser/leftover_unitary_blocks.js +153 -0
  251. package/src/space_and_block_chooser/leftover_unitary_empty_spaces.js +135 -0
  252. package/src/space_and_block_chooser/probe_set_pool.js +35 -0
  253. package/src/space_and_block_chooser/run_space_and_block_selection_attempt.js +88 -0
  254. package/src/tools/Array_Validator.js +6 -0
  255. package/src/tools/Clone.js +27 -0
  256. package/src/tools/Hash.js +8 -0
  257. package/src/tools/Rounder.js +5 -0
  258. package/src/tools/String_To_Boolean.js +12 -0
  259. package/src/tools/cargo_profile/Cargo_Profile_Field_Value_Resolver.js +44 -0
  260. package/src/tools/compact_items_with_stock.js +9 -0
  261. package/src/tools/mm_to_allocation_domain.js +14 -0
  262. package/src/tracing/Allocation_Tracer.js +52 -0
  263. package/src/tracing/Trace_Context.js +18 -0
  264. package/src/tracing/trace_outcome.js +18 -0
  265. package/src/tracing/traced_step.js +57 -0
  266. package/src/validation/Item_Continuation_Lock_Flag.js +52 -0
  267. package/src/validation/Item_Validation.js +29 -0
  268. package/src/validation/Relational_Colocation_Validator.js +60 -0
  269. package/src/validation/Relational_Completeness_Validator.js +146 -0
  270. package/src/validation/Relational_Continuation_Lock_Validation.js +37 -0
  271. package/src/validation/Relational_Proportional_Normalizer.js +194 -0
  272. package/src/validation/Validation.js +9 -0
  273. package/src/validation/Validation_Runner.js +20 -0
  274. package/src/validation/exceptions/Invalid_Block_Module_Config_Exception.js +14 -0
  275. package/src/validation/exceptions/Invalid_Input_Exception.js +14 -0
  276. package/src/validation/exceptions/Invalid_Input_Type_Exception.js +14 -0
  277. package/src/validation/schemas/allocated_item_schema.js +18 -0
  278. package/src/validation/schemas/allocation_request_schema.js +178 -0
  279. package/src/validation/schemas/container_row_schema.js +16 -0
  280. package/src/validation/schemas/item_schema.js +60 -0
  281. package/src/validation/schemas/transport_env_schema.js +19 -0
  282. package/src/validation/validate_block_module_config.js +147 -0
@@ -0,0 +1,178 @@
1
+ const Invalid_Input_Exception = require('../exceptions/Invalid_Input_Exception')
2
+ const { VALID_DENSITY_GROUP_STRATEGIES } = require('../../Allocation_Optimization/density_groups/Density_Groups_Strategy')
3
+ const {
4
+ collect_block_module_config_errors,
5
+ } = require('../validate_block_module_config')
6
+
7
+ /**
8
+ * Zod schemas for the top-level allocation request. `Blocks_Wall_Allocation` calls `parse_allocation_request`
9
+ * before `State_Builder`; transport factories assume validated non-empty `envs` and container lists.
10
+ */
11
+ const { z } = require('zod')
12
+ const { transport_env_schema } = require('./transport_env_schema')
13
+ const { item_schema } = require('./item_schema')
14
+
15
+ const DENSITY_GROUPS_ENABLE_KEY = 'allocation.items.density_groups.enable'
16
+ const DENSITY_GROUPS_COUNT_KEY = 'allocation.items.density_groups.count'
17
+ const DENSITY_GROUPS_STRATEGY_KEY = 'allocation.items.density_groups.strategy'
18
+ const DENSITY_GROUPS_WEIGHT_AHEAD_THRESHOLD_PP_KEY = 'allocation.items.density_groups.weight_ahead_threshold_pp'
19
+ const DENSITY_GROUPS_SPACE_AHEAD_THRESHOLD_PP_KEY = 'allocation.items.density_groups.space_ahead_threshold_pp'
20
+
21
+ function is_density_groups_enabled(algoritmo)
22
+ {
23
+ const raw = algoritmo[DENSITY_GROUPS_ENABLE_KEY]
24
+ return raw === true || raw === 'true'
25
+ }
26
+
27
+ const algoritmo_empty_space_merge_schema = z.looseObject({
28
+ empty_space_merge_gap_percent_width: z.coerce.number().min(0).max(100).optional(),
29
+ empty_space_merge_gap_percent_length: z.coerce.number().min(0).max(100).optional(),
30
+ empty_space_merge_max_vertical_offset_mm: z.coerce.number().nonnegative().optional()
31
+ })
32
+
33
+ const algoritmo_density_groups_schema = z.looseObject({
34
+ [DENSITY_GROUPS_ENABLE_KEY]: z.union([z.boolean(), z.string()]).optional(),
35
+ [DENSITY_GROUPS_COUNT_KEY]: z.coerce.number().int().optional(),
36
+ [DENSITY_GROUPS_STRATEGY_KEY]: z.string().optional(),
37
+ [DENSITY_GROUPS_WEIGHT_AHEAD_THRESHOLD_PP_KEY]: z.coerce.number().optional(),
38
+ [DENSITY_GROUPS_SPACE_AHEAD_THRESHOLD_PP_KEY]: z.coerce.number().optional()
39
+ }).superRefine((algoritmo, ctx) =>
40
+ {
41
+ if (!is_density_groups_enabled(algoritmo))
42
+ {
43
+ return
44
+ }
45
+ const count = algoritmo[DENSITY_GROUPS_COUNT_KEY]
46
+ if (count !== undefined && (count < 2 || count > 10))
47
+ {
48
+ ctx.addIssue({
49
+ code: 'custom',
50
+ message: 'allocation.items.density_groups.count must be between 2 and 10 when density groups are enabled',
51
+ path: [DENSITY_GROUPS_COUNT_KEY]
52
+ })
53
+ }
54
+ const strategy = algoritmo[DENSITY_GROUPS_STRATEGY_KEY]
55
+ if (strategy !== undefined && !VALID_DENSITY_GROUP_STRATEGIES.includes(strategy))
56
+ {
57
+ ctx.addIssue({
58
+ code: 'custom',
59
+ message: 'allocation.items.density_groups.strategy must be round_robin or adaptive when density groups are enabled',
60
+ path: [DENSITY_GROUPS_STRATEGY_KEY]
61
+ })
62
+ }
63
+ validate_density_group_threshold_pp(
64
+ algoritmo,
65
+ ctx,
66
+ DENSITY_GROUPS_WEIGHT_AHEAD_THRESHOLD_PP_KEY,
67
+ 'weight_ahead_threshold_pp'
68
+ )
69
+ validate_density_group_threshold_pp(
70
+ algoritmo,
71
+ ctx,
72
+ DENSITY_GROUPS_SPACE_AHEAD_THRESHOLD_PP_KEY,
73
+ 'space_ahead_threshold_pp'
74
+ )
75
+ })
76
+
77
+ /**
78
+ * Validates an adaptive density-group threshold expressed in percentage points.
79
+ * @param {object} algoritmo - Parsed algoritmo object.
80
+ * @param {import('zod').RefinementCtx} ctx - Zod refinement context.
81
+ * @param {string} key - Flat config key.
82
+ * @param {string} label - Human-readable field label for error messages.
83
+ * @returns {void}
84
+ */
85
+ function validate_density_group_threshold_pp(algoritmo, ctx, key, label)
86
+ {
87
+ const value = algoritmo[key]
88
+ if (value === undefined)
89
+ {
90
+ return
91
+ }
92
+ if (value < 0 || value > 100)
93
+ {
94
+ ctx.addIssue({
95
+ code: 'custom',
96
+ message: `allocation.items.density_groups.${label} must be between 0 and 100 when density groups are enabled`,
97
+ path: [key]
98
+ })
99
+ }
100
+ }
101
+
102
+ const cargo_config_schema = z.looseObject({
103
+ algoritmo: z.record(z.string(), z.unknown())
104
+ .and(algoritmo_empty_space_merge_schema)
105
+ .and(algoritmo_density_groups_schema)
106
+ })
107
+
108
+ const BLOCK_MODULE_LIST_KEY = 'allocation.blocks.block_module_list'
109
+
110
+ const allocation_request_schema = z.looseObject({
111
+ config: cargo_config_schema,
112
+ envs: z.array(transport_env_schema).min(1),
113
+ items: z.array(item_schema).min(1),
114
+ available_blocks: z.array(z.string()).optional()
115
+ }).superRefine((request, ctx) =>
116
+ {
117
+ const algoritmo = request.config?.algoritmo
118
+ if (!algoritmo)
119
+ {
120
+ return
121
+ }
122
+
123
+ const errors = collect_block_module_config_errors(algoritmo, request.available_blocks)
124
+ errors.forEach((message) =>
125
+ {
126
+ ctx.addIssue({
127
+ code: 'custom',
128
+ message,
129
+ path: ['config', 'algoritmo', BLOCK_MODULE_LIST_KEY]
130
+ })
131
+ })
132
+ })
133
+
134
+ function format_zod_error(zod_error)
135
+ {
136
+ return zod_error.issues.map(issue =>
137
+ {
138
+ const path = issue.path.length > 0 ? issue.path.join('.') : '(root)'
139
+ return `${path}: ${issue.message}`
140
+ }).join('; ')
141
+ }
142
+
143
+ /**
144
+ * Parses allocation request JSON without throwing.
145
+ * @param {unknown} input_data - Raw request body.
146
+ * @returns {{ success: true, data: object } | { success: false, error: object }}
147
+ */
148
+ function safe_parse_allocation_request(input_data)
149
+ {
150
+ return allocation_request_schema.safeParse(input_data)
151
+ }
152
+
153
+ /**
154
+ * Parses and returns typed data, or throws {Invalid_Input_Exception} with a flattened Zod message.
155
+ * @param {unknown} input_data - Raw request body.
156
+ * @returns {object} Parsed payload (unknown keys preserved where `.passthrough()` applies).
157
+ * @throws {Invalid_Input_Exception} When validation fails; the error message contains flattened Zod issues.
158
+ */
159
+ function parse_allocation_request(input_data)
160
+ {
161
+ const result = safe_parse_allocation_request(input_data)
162
+ if (!result.success)
163
+ {
164
+ const { Logger } = require('@jetta/logger')
165
+ const logger = new Logger('allocation_request_schema')
166
+ logger.error(`Invalid allocation input: ${format_zod_error(result.error)}`)
167
+ throw new Invalid_Input_Exception()
168
+ }
169
+ return result.data
170
+ }
171
+
172
+ module.exports = {
173
+ allocation_request_schema,
174
+ cargo_config_schema,
175
+ parse_allocation_request,
176
+ safe_parse_allocation_request,
177
+ format_zod_error
178
+ }
@@ -0,0 +1,16 @@
1
+ const { z } = require('zod')
2
+ const allocated_item_schema = require('./allocated_item_schema')
3
+
4
+ /**
5
+ * One container row under `envs[*].containers` (Portuguese field names from the API).
6
+ */
7
+ const container_row_schema = z.looseObject({
8
+ sequencia: z.coerce.number(),
9
+ largura: z.coerce.number().positive(),
10
+ altura: z.coerce.number().positive(),
11
+ comprimento: z.coerce.number().positive(),
12
+ pesoDeCarga: z.coerce.number().positive(),
13
+ items: z.array(allocated_item_schema).optional()
14
+ })
15
+
16
+ module.exports = { container_row_schema }
@@ -0,0 +1,60 @@
1
+ const { z } = require('zod')
2
+
3
+ function item_has_weight(data)
4
+ {
5
+ const w = data.peso ?? data.weight ?? data.wg
6
+ return typeof w === 'number' && !Number.isNaN(w)
7
+ }
8
+
9
+ function item_width_ok(data)
10
+ {
11
+ const v = data.largura ?? data.width ?? data.w
12
+ return typeof v === 'number' && !Number.isNaN(v) && v > 0
13
+ }
14
+
15
+ function item_height_ok(data)
16
+ {
17
+ const v = data.altura ?? data.height ?? data.h
18
+ return typeof v === 'number' && !Number.isNaN(v) && v > 0
19
+ }
20
+
21
+ function item_length_ok(data)
22
+ {
23
+ const v = data.comprimento ?? data.length ?? data.d
24
+ return typeof v === 'number' && !Number.isNaN(v) && v > 0
25
+ }
26
+
27
+ function validate_allocation_item_phys(data, ctx)
28
+ {
29
+ if (!item_has_weight(data))
30
+ {
31
+ ctx.addIssue('Item must include peso, weight, or wg')
32
+ }
33
+ if (!item_width_ok(data))
34
+ {
35
+ ctx.addIssue('Item must include positive largura, width, or w')
36
+ }
37
+ if (!item_height_ok(data))
38
+ {
39
+ ctx.addIssue('Item must include positive altura, height, or h')
40
+ }
41
+ if (!item_length_ok(data))
42
+ {
43
+ ctx.addIssue('Item must include positive comprimento, length, or d')
44
+ }
45
+ }
46
+
47
+ /**
48
+ * One SKU in `input_data.items` (to allocate). Extra API fields are kept via `.passthrough()`.
49
+ */
50
+ const item_schema = z.looseObject({
51
+ _id: z.string().min(1),
52
+ qtd: z.coerce.number().nonnegative(),
53
+ stacking: z.record(z.string(), z.unknown()),
54
+ pesoMaxSuportado: z.coerce.number().nonnegative(),
55
+ empilhamentoMaximo: z.coerce.number().nonnegative(),
56
+ restricoes: z.record(z.string(), z.unknown()).optional().default({}),
57
+ rotacao: z.record(z.string(), z.boolean())
58
+ }).superRefine(validate_allocation_item_phys)
59
+
60
+ module.exports = { item_schema }
@@ -0,0 +1,19 @@
1
+ const { z } = require('zod')
2
+ const { container_row_schema } = require('./container_row_schema')
3
+
4
+ const corner_props_schema = z.object({
5
+ espacoSuperiorFrente: z.coerce.number().nonnegative(),
6
+ espacoSuperiorPorta: z.coerce.number().nonnegative()
7
+ })
8
+
9
+ /**
10
+ * One transport environment from `input_data.envs` (first entry is used for blocks + transport factory).
11
+ */
12
+ const transport_env_schema = z.looseObject({
13
+ _id: z.string(),
14
+ tipo: z.string().min(1),
15
+ containers: z.array(container_row_schema).min(1),
16
+ props: corner_props_schema.optional()
17
+ })
18
+
19
+ module.exports = { transport_env_schema }
@@ -0,0 +1,147 @@
1
+ const { VALID_BLOCK_MODULE_NAMES } = require('../input_preparation/block_preparation/Block_Module_Name')
2
+ const str_to_bool = require('../tools/String_To_Boolean')
3
+
4
+ const Invalid_Block_Module_Config_Exception = require('./exceptions/Invalid_Block_Module_Config_Exception')
5
+
6
+ const BLOCK_MODULE_LIST_KEY = 'allocation.blocks.block_module_list'
7
+ const USE_UNITARY_ITEMS_KEY = 'allocation.blocks.use_unitary_items_as_block'
8
+ const ENABLE_MANUAL_BLOCKS_KEY = 'allocation.blocks.enable_manual_blocks'
9
+ const MANUAL_BLOCKS_MODULE = 'manual_blocks'
10
+
11
+ /**
12
+ * @param {object} algoritmo - Cargo profile algoritmo object.
13
+ * @returns {boolean} Whether manual blocks are enabled (default true).
14
+ */
15
+ function is_manual_blocks_enabled(algoritmo)
16
+ {
17
+ return str_to_bool(algoritmo[ENABLE_MANUAL_BLOCKS_KEY], true)
18
+ }
19
+
20
+ /**
21
+ * @param {string} module_name - Candidate module name.
22
+ * @returns {boolean} True when the module is not manual_blocks.
23
+ */
24
+ function is_not_manual_blocks(module_name)
25
+ {
26
+ return module_name !== MANUAL_BLOCKS_MODULE
27
+ }
28
+
29
+ /**
30
+ * Builds the effective block module list without mutating the input config.
31
+ * @param {object} algoritmo - Cargo profile algoritmo object.
32
+ * @param {string[]|undefined} available_blocks - Optional manual block paths.
33
+ * @returns {string[]}
34
+ */
35
+ function build_effective_block_module_list(algoritmo, available_blocks)
36
+ {
37
+ const enable_manual_blocks = is_manual_blocks_enabled(algoritmo)
38
+ let block_module_list = [...(algoritmo[BLOCK_MODULE_LIST_KEY] || [])]
39
+
40
+ if (enable_manual_blocks && available_blocks !== undefined && available_blocks.length > 0)
41
+ {
42
+ block_module_list.push(MANUAL_BLOCKS_MODULE)
43
+ }
44
+ if (!enable_manual_blocks)
45
+ {
46
+ block_module_list = block_module_list.filter(is_not_manual_blocks)
47
+ }
48
+
49
+ const use_unitary_items_as_block = algoritmo[USE_UNITARY_ITEMS_KEY] === false ? false : true
50
+ const create_unitary_blocks = str_to_bool(use_unitary_items_as_block)
51
+ if (create_unitary_blocks || block_module_list.length === 0)
52
+ {
53
+ block_module_list.push('single_item_blocks')
54
+ }
55
+
56
+ return [...new Set(block_module_list)]
57
+ }
58
+
59
+ /**
60
+ * @param {string} module_name - Module name to validate.
61
+ * @returns {string|null} Error message when invalid; null when valid.
62
+ */
63
+ function unknown_module_message(module_name)
64
+ {
65
+ if (VALID_BLOCK_MODULE_NAMES.includes(module_name))
66
+ {
67
+ return null
68
+ }
69
+
70
+ return `Unknown module: "${module_name}". Valid modules: ${VALID_BLOCK_MODULE_NAMES.join(', ')}`
71
+ }
72
+
73
+ /**
74
+ * Validates explicit and effective block module configuration.
75
+ * @param {object} algoritmo - Cargo profile algoritmo object.
76
+ * @param {string[]|undefined} available_blocks - Optional manual block paths.
77
+ * @returns {string[]} Validation error messages.
78
+ */
79
+ function collect_block_module_config_errors(algoritmo, available_blocks)
80
+ {
81
+ const errors = []
82
+
83
+ if (Object.prototype.hasOwnProperty.call(algoritmo, BLOCK_MODULE_LIST_KEY))
84
+ {
85
+ const explicit_list = algoritmo[BLOCK_MODULE_LIST_KEY]
86
+ if (!Array.isArray(explicit_list))
87
+ {
88
+ errors.push(`${BLOCK_MODULE_LIST_KEY} must be an array`)
89
+ }
90
+ else
91
+ {
92
+ explicit_list.forEach((module_name, index) =>
93
+ {
94
+ const message = unknown_module_message(module_name)
95
+ if (message)
96
+ {
97
+ errors.push(`${BLOCK_MODULE_LIST_KEY}[${index}]: ${message}`)
98
+ }
99
+ })
100
+ }
101
+ }
102
+
103
+ const effective_list = build_effective_block_module_list(algoritmo, available_blocks)
104
+ if (effective_list.length === 0)
105
+ {
106
+ errors.push(`${BLOCK_MODULE_LIST_KEY}: must resolve to a non-empty module list`)
107
+ return errors
108
+ }
109
+
110
+ effective_list.forEach((module_name) =>
111
+ {
112
+ const message = unknown_module_message(module_name)
113
+ if (message)
114
+ {
115
+ errors.push(message)
116
+ }
117
+ })
118
+
119
+ return [...new Set(errors)]
120
+ }
121
+
122
+ /**
123
+ * Validates block module configuration or throws.
124
+ * @param {object} algoritmo - Cargo profile algoritmo object.
125
+ * @param {string[]|undefined} available_blocks - Optional manual block paths.
126
+ * @throws {Invalid_Block_Module_Config_Exception} When configuration is invalid.
127
+ * @returns {void}
128
+ */
129
+ function validate_block_module_config(algoritmo, available_blocks)
130
+ {
131
+ const errors = collect_block_module_config_errors(algoritmo, available_blocks)
132
+ if (errors.length > 0)
133
+ {
134
+ const { Logger } = require('@jetta/logger')
135
+ const logger = new Logger('validate_block_module_config')
136
+ logger.error(errors.join('; '))
137
+ throw new Invalid_Block_Module_Config_Exception()
138
+ }
139
+ }
140
+
141
+ module.exports = {
142
+ BLOCK_MODULE_LIST_KEY,
143
+ ENABLE_MANUAL_BLOCKS_KEY,
144
+ build_effective_block_module_list,
145
+ collect_block_module_config_errors,
146
+ validate_block_module_config,
147
+ }