@jetta/axle-load-calculator 0.1.3

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 (392) hide show
  1. package/.cursor/ai_changelog/INDEX.md +13 -0
  2. package/.cursor/ai_changelog/_TEMPLATE.md +55 -0
  3. package/.cursor/rules/code-standards.mdc +103 -0
  4. package/.cursor/rules/knowledge-base.mdc +14 -0
  5. package/.cursor/rules/planning-standards.mdc +55 -0
  6. package/.cursor/skills/document-feature-knowledge/SKILL.md +51 -0
  7. package/README.md +49 -0
  8. package/bitbucket-pipelines.yml +81 -0
  9. package/build/core/contracts/chassi_reference.d.ts +7 -0
  10. package/build/core/contracts/chassi_reference.d.ts.map +1 -0
  11. package/build/core/contracts/chassi_reference.js +5 -0
  12. package/build/core/contracts/ms_faixas_contract.d.ts +13 -0
  13. package/build/core/contracts/ms_faixas_contract.d.ts.map +1 -0
  14. package/build/core/contracts/ms_faixas_contract.js +89 -0
  15. package/build/core/contracts/rotation_enum.d.ts +11 -0
  16. package/build/core/contracts/rotation_enum.d.ts.map +1 -0
  17. package/build/core/contracts/rotation_enum.js +9 -0
  18. package/build/core/contracts/suspension_type.d.ts +5 -0
  19. package/build/core/contracts/suspension_type.d.ts.map +1 -0
  20. package/build/core/contracts/suspension_type.js +4 -0
  21. package/build/core/contracts/transport_record.d.ts +5 -0
  22. package/build/core/contracts/transport_record.d.ts.map +1 -0
  23. package/build/core/contracts/transport_record.js +1 -0
  24. package/build/core/contracts/vehicle_type.d.ts +12 -0
  25. package/build/core/contracts/vehicle_type.d.ts.map +1 -0
  26. package/build/core/contracts/vehicle_type.js +10 -0
  27. package/build/core/contracts/vehicle_version.d.ts +8 -0
  28. package/build/core/contracts/vehicle_version.d.ts.map +1 -0
  29. package/build/core/contracts/vehicle_version.js +7 -0
  30. package/build/core/contracts/wire_flags.d.ts +27 -0
  31. package/build/core/contracts/wire_flags.d.ts.map +1 -0
  32. package/build/core/contracts/wire_flags.js +26 -0
  33. package/build/core/math/float_tools.d.ts +7 -0
  34. package/build/core/math/float_tools.d.ts.map +1 -0
  35. package/build/core/math/float_tools.js +14 -0
  36. package/build/core/math/gaussian_elimination.d.ts +8 -0
  37. package/build/core/math/gaussian_elimination.d.ts.map +1 -0
  38. package/build/core/math/gaussian_elimination.js +85 -0
  39. package/build/core/orchestration/axle_weight_physics.d.ts +7 -0
  40. package/build/core/orchestration/axle_weight_physics.d.ts.map +1 -0
  41. package/build/core/orchestration/axle_weight_physics.js +27 -0
  42. package/build/core/orchestration/collision_checker.d.ts +6 -0
  43. package/build/core/orchestration/collision_checker.d.ts.map +1 -0
  44. package/build/core/orchestration/collision_checker.js +67 -0
  45. package/build/core/orchestration/connector_payload_builder.d.ts +11 -0
  46. package/build/core/orchestration/connector_payload_builder.d.ts.map +1 -0
  47. package/build/core/orchestration/connector_payload_builder.js +67 -0
  48. package/build/core/orchestration/java_mass_center.d.ts +9 -0
  49. package/build/core/orchestration/java_mass_center.d.ts.map +1 -0
  50. package/build/core/orchestration/java_mass_center.js +79 -0
  51. package/build/core/orchestration/output_builder.d.ts +11 -0
  52. package/build/core/orchestration/output_builder.d.ts.map +1 -0
  53. package/build/core/orchestration/output_builder.js +15 -0
  54. package/build/core/orchestration/request_schema.d.ts +65 -0
  55. package/build/core/orchestration/request_schema.d.ts.map +1 -0
  56. package/build/core/orchestration/request_schema.js +20 -0
  57. package/build/core/orchestration/weight_by_axis_task.d.ts +7 -0
  58. package/build/core/orchestration/weight_by_axis_task.d.ts.map +1 -0
  59. package/build/core/orchestration/weight_by_axis_task.js +105 -0
  60. package/build/core/physics/items/allocated_item.d.ts +22 -0
  61. package/build/core/physics/items/allocated_item.d.ts.map +1 -0
  62. package/build/core/physics/items/allocated_item.js +29 -0
  63. package/build/core/physics/items/allocated_item_manager.d.ts +31 -0
  64. package/build/core/physics/items/allocated_item_manager.d.ts.map +1 -0
  65. package/build/core/physics/items/allocated_item_manager.js +38 -0
  66. package/build/core/physics/items/center_of_mass.d.ts +14 -0
  67. package/build/core/physics/items/center_of_mass.d.ts.map +1 -0
  68. package/build/core/physics/items/center_of_mass.js +24 -0
  69. package/build/core/physics/items/compute_grouper_center_of_mass.d.ts +19 -0
  70. package/build/core/physics/items/compute_grouper_center_of_mass.d.ts.map +1 -0
  71. package/build/core/physics/items/compute_grouper_center_of_mass.js +28 -0
  72. package/build/core/physics/items/item_templates.d.ts +32 -0
  73. package/build/core/physics/items/item_templates.d.ts.map +1 -0
  74. package/build/core/physics/items/item_templates.js +53 -0
  75. package/build/core/physics/items/multi_container_allocated_items.d.ts +37 -0
  76. package/build/core/physics/items/multi_container_allocated_items.d.ts.map +1 -0
  77. package/build/core/physics/items/multi_container_allocated_items.js +91 -0
  78. package/build/core/physics/items/rotation_transforms.d.ts +8 -0
  79. package/build/core/physics/items/rotation_transforms.d.ts.map +1 -0
  80. package/build/core/physics/items/rotation_transforms.js +21 -0
  81. package/build/core/physics/models/axle_weight_model.d.ts +32 -0
  82. package/build/core/physics/models/axle_weight_model.d.ts.map +1 -0
  83. package/build/core/physics/models/axle_weight_model.js +72 -0
  84. package/build/core/physics/models/bi_truck_model.d.ts +21 -0
  85. package/build/core/physics/models/bi_truck_model.d.ts.map +1 -0
  86. package/build/core/physics/models/bi_truck_model.js +60 -0
  87. package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts +21 -0
  88. package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts.map +1 -0
  89. package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.js +69 -0
  90. package/build/core/physics/models/bitrem_model.d.ts +33 -0
  91. package/build/core/physics/models/bitrem_model.d.ts.map +1 -0
  92. package/build/core/physics/models/bitrem_model.js +123 -0
  93. package/build/core/physics/models/chassi_forces.d.ts +30 -0
  94. package/build/core/physics/models/chassi_forces.d.ts.map +1 -0
  95. package/build/core/physics/models/chassi_forces.js +39 -0
  96. package/build/core/physics/models/deflection/beam_deflection.d.ts +28 -0
  97. package/build/core/physics/models/deflection/beam_deflection.d.ts.map +1 -0
  98. package/build/core/physics/models/deflection/beam_deflection.js +78 -0
  99. package/build/core/physics/models/deflection/bitrem_deflection.d.ts +22 -0
  100. package/build/core/physics/models/deflection/bitrem_deflection.d.ts.map +1 -0
  101. package/build/core/physics/models/deflection/bitrem_deflection.js +54 -0
  102. package/build/core/physics/models/deflection/create_deflection_delegate.d.ts +12 -0
  103. package/build/core/physics/models/deflection/create_deflection_delegate.d.ts.map +1 -0
  104. package/build/core/physics/models/deflection/create_deflection_delegate.js +32 -0
  105. package/build/core/physics/models/deflection/deflection_model.d.ts +19 -0
  106. package/build/core/physics/models/deflection/deflection_model.d.ts.map +1 -0
  107. package/build/core/physics/models/deflection/deflection_model.js +23 -0
  108. package/build/core/physics/models/deflection/deflection_support_manager.d.ts +21 -0
  109. package/build/core/physics/models/deflection/deflection_support_manager.d.ts.map +1 -0
  110. package/build/core/physics/models/deflection/deflection_support_manager.js +40 -0
  111. package/build/core/physics/models/deflection/deflection_tools.d.ts +6 -0
  112. package/build/core/physics/models/deflection/deflection_tools.d.ts.map +1 -0
  113. package/build/core/physics/models/deflection/deflection_tools.js +10 -0
  114. package/build/core/physics/models/deflection/integration_constant_calculator.d.ts +22 -0
  115. package/build/core/physics/models/deflection/integration_constant_calculator.d.ts.map +1 -0
  116. package/build/core/physics/models/deflection/integration_constant_calculator.js +48 -0
  117. package/build/core/physics/models/deflection/rodotrem_deflection.d.ts +22 -0
  118. package/build/core/physics/models/deflection/rodotrem_deflection.d.ts.map +1 -0
  119. package/build/core/physics/models/deflection/rodotrem_deflection.js +47 -0
  120. package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts +21 -0
  121. package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts.map +1 -0
  122. package/build/core/physics/models/deflection/semi_reboque_deflection.js +31 -0
  123. package/build/core/physics/models/deflection/simple_truck_deflection.d.ts +20 -0
  124. package/build/core/physics/models/deflection/simple_truck_deflection.d.ts.map +1 -0
  125. package/build/core/physics/models/deflection/simple_truck_deflection.js +28 -0
  126. package/build/core/physics/models/deflection/vanderleia_deflection.d.ts +21 -0
  127. package/build/core/physics/models/deflection/vanderleia_deflection.d.ts.map +1 -0
  128. package/build/core/physics/models/deflection/vanderleia_deflection.js +41 -0
  129. package/build/core/physics/models/old_tare_model.d.ts +17 -0
  130. package/build/core/physics/models/old_tare_model.d.ts.map +1 -0
  131. package/build/core/physics/models/old_tare_model.js +40 -0
  132. package/build/core/physics/models/old_tare_scale.d.ts +7 -0
  133. package/build/core/physics/models/old_tare_scale.d.ts.map +1 -0
  134. package/build/core/physics/models/old_tare_scale.js +8 -0
  135. package/build/core/physics/models/old_tare_semireboque.d.ts +7 -0
  136. package/build/core/physics/models/old_tare_semireboque.d.ts.map +1 -0
  137. package/build/core/physics/models/old_tare_semireboque.js +37 -0
  138. package/build/core/physics/models/old_tare_truck.d.ts +7 -0
  139. package/build/core/physics/models/old_tare_truck.d.ts.map +1 -0
  140. package/build/core/physics/models/old_tare_truck.js +12 -0
  141. package/build/core/physics/models/old_tare_vanderleia.d.ts +7 -0
  142. package/build/core/physics/models/old_tare_vanderleia.d.ts.map +1 -0
  143. package/build/core/physics/models/old_tare_vanderleia.js +31 -0
  144. package/build/core/physics/models/percentage_on_axles_calculator.d.ts +19 -0
  145. package/build/core/physics/models/percentage_on_axles_calculator.d.ts.map +1 -0
  146. package/build/core/physics/models/percentage_on_axles_calculator.js +39 -0
  147. package/build/core/physics/models/quad_semi_trailer_model.d.ts +21 -0
  148. package/build/core/physics/models/quad_semi_trailer_model.d.ts.map +1 -0
  149. package/build/core/physics/models/quad_semi_trailer_model.js +70 -0
  150. package/build/core/physics/models/rodotrem_model.d.ts +33 -0
  151. package/build/core/physics/models/rodotrem_model.d.ts.map +1 -0
  152. package/build/core/physics/models/rodotrem_model.js +101 -0
  153. package/build/core/physics/models/semi_reboque_base.d.ts +34 -0
  154. package/build/core/physics/models/semi_reboque_base.d.ts.map +1 -0
  155. package/build/core/physics/models/semi_reboque_base.js +85 -0
  156. package/build/core/physics/models/semi_reboque_model.d.ts +41 -0
  157. package/build/core/physics/models/semi_reboque_model.d.ts.map +1 -0
  158. package/build/core/physics/models/semi_reboque_model.js +84 -0
  159. package/build/core/physics/models/simple_truck_base.d.ts +29 -0
  160. package/build/core/physics/models/simple_truck_base.d.ts.map +1 -0
  161. package/build/core/physics/models/simple_truck_base.js +57 -0
  162. package/build/core/physics/models/simple_truck_model.d.ts +41 -0
  163. package/build/core/physics/models/simple_truck_model.d.ts.map +1 -0
  164. package/build/core/physics/models/simple_truck_model.js +76 -0
  165. package/build/core/physics/models/single_container_tare.d.ts +18 -0
  166. package/build/core/physics/models/single_container_tare.d.ts.map +1 -0
  167. package/build/core/physics/models/single_container_tare.js +45 -0
  168. package/build/core/physics/models/tare_model.d.ts +12 -0
  169. package/build/core/physics/models/tare_model.d.ts.map +1 -0
  170. package/build/core/physics/models/tare_model.js +36 -0
  171. package/build/core/physics/models/vanderleia_model.d.ts +33 -0
  172. package/build/core/physics/models/vanderleia_model.d.ts.map +1 -0
  173. package/build/core/physics/models/vanderleia_model.js +100 -0
  174. package/build/core/physics/services/axle_weight_output_builder.d.ts +27 -0
  175. package/build/core/physics/services/axle_weight_output_builder.d.ts.map +1 -0
  176. package/build/core/physics/services/axle_weight_output_builder.js +42 -0
  177. package/build/core/physics/services/axle_weight_service.d.ts +20 -0
  178. package/build/core/physics/services/axle_weight_service.d.ts.map +1 -0
  179. package/build/core/physics/services/axle_weight_service.js +91 -0
  180. package/build/core/physics/services/cm_axle_weight_service.d.ts +12 -0
  181. package/build/core/physics/services/cm_axle_weight_service.d.ts.map +1 -0
  182. package/build/core/physics/services/cm_axle_weight_service.js +33 -0
  183. package/build/core/physics/services/container_corner_forces.d.ts +33 -0
  184. package/build/core/physics/services/container_corner_forces.d.ts.map +1 -0
  185. package/build/core/physics/services/container_corner_forces.js +84 -0
  186. package/build/core/physics/transports/axle_manager.d.ts +22 -0
  187. package/build/core/physics/transports/axle_manager.d.ts.map +1 -0
  188. package/build/core/physics/transports/axle_manager.js +34 -0
  189. package/build/core/physics/transports/axle_record.d.ts +21 -0
  190. package/build/core/physics/transports/axle_record.d.ts.map +1 -0
  191. package/build/core/physics/transports/axle_record.js +57 -0
  192. package/build/core/physics/transports/chassi.d.ts +52 -0
  193. package/build/core/physics/transports/chassi.d.ts.map +1 -0
  194. package/build/core/physics/transports/chassi.js +105 -0
  195. package/build/core/physics/transports/container_record.d.ts +25 -0
  196. package/build/core/physics/transports/container_record.d.ts.map +1 -0
  197. package/build/core/physics/transports/container_record.js +49 -0
  198. package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts +27 -0
  199. package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts.map +1 -0
  200. package/build/core/physics/transports/containerweight/container_max_weight_calculator.js +40 -0
  201. package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts +28 -0
  202. package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts.map +1 -0
  203. package/build/core/physics/transports/containerweight/container_tare_calculator.js +55 -0
  204. package/build/core/physics/transports/containerweight/container_weight_model.d.ts +15 -0
  205. package/build/core/physics/transports/containerweight/container_weight_model.d.ts.map +1 -0
  206. package/build/core/physics/transports/containerweight/container_weight_model.js +31 -0
  207. package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts +17 -0
  208. package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts.map +1 -0
  209. package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.js +31 -0
  210. package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts +20 -0
  211. package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts.map +1 -0
  212. package/build/core/physics/transports/containerweight/single_container_weight_calculator.js +48 -0
  213. package/build/core/physics/transports/grouped_containers.d.ts +34 -0
  214. package/build/core/physics/transports/grouped_containers.d.ts.map +1 -0
  215. package/build/core/physics/transports/grouped_containers.js +68 -0
  216. package/build/core/physics/transports/merged_containers.d.ts +26 -0
  217. package/build/core/physics/transports/merged_containers.d.ts.map +1 -0
  218. package/build/core/physics/transports/merged_containers.js +45 -0
  219. package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts +26 -0
  220. package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts.map +1 -0
  221. package/build/core/physics/transports/tare/bitrem_axle_splitter.js +84 -0
  222. package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts +22 -0
  223. package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts.map +1 -0
  224. package/build/core/physics/transports/tare/bitrem_axle_weight_split.js +32 -0
  225. package/build/core/physics/transports/transport.d.ts +33 -0
  226. package/build/core/physics/transports/transport.d.ts.map +1 -0
  227. package/build/core/physics/transports/transport.js +110 -0
  228. package/build/index.d.ts +8 -0
  229. package/build/index.d.ts.map +1 -0
  230. package/build/index.js +10 -0
  231. package/eslint.config.js +51 -0
  232. package/package.json +38 -0
  233. package/src/core/contracts/chassi_reference.ts +7 -0
  234. package/src/core/contracts/ms_faixas_contract.ts +114 -0
  235. package/src/core/contracts/rotation_enum.ts +11 -0
  236. package/src/core/contracts/suspension_type.ts +4 -0
  237. package/src/core/contracts/transport_record.ts +4 -0
  238. package/src/core/contracts/vehicle_type.ts +12 -0
  239. package/src/core/contracts/vehicle_version.ts +7 -0
  240. package/src/core/contracts/wire_flags.ts +26 -0
  241. package/src/core/math/float_tools.ts +17 -0
  242. package/src/core/math/gaussian_elimination.ts +104 -0
  243. package/src/core/orchestration/axle_weight_physics.ts +37 -0
  244. package/src/core/orchestration/collision_checker.ts +86 -0
  245. package/src/core/orchestration/connector_payload_builder.ts +81 -0
  246. package/src/core/orchestration/java_mass_center.ts +98 -0
  247. package/src/core/orchestration/output_builder.ts +18 -0
  248. package/src/core/orchestration/request_schema.ts +26 -0
  249. package/src/core/orchestration/weight_by_axis_task.ts +140 -0
  250. package/src/core/physics/items/allocated_item.ts +41 -0
  251. package/src/core/physics/items/allocated_item_manager.ts +50 -0
  252. package/src/core/physics/items/center_of_mass.ts +31 -0
  253. package/src/core/physics/items/compute_grouper_center_of_mass.ts +44 -0
  254. package/src/core/physics/items/item_templates.ts +65 -0
  255. package/src/core/physics/items/multi_container_allocated_items.ts +120 -0
  256. package/src/core/physics/items/rotation_transforms.ts +29 -0
  257. package/src/core/physics/models/axle_weight_model.ts +109 -0
  258. package/src/core/physics/models/bi_truck_model.ts +74 -0
  259. package/src/core/physics/models/bi_truck_tractor_semi_trailer_model.ts +86 -0
  260. package/src/core/physics/models/bitrem_model.ts +148 -0
  261. package/src/core/physics/models/chassi_forces.ts +50 -0
  262. package/src/core/physics/models/deflection/beam_deflection.ts +105 -0
  263. package/src/core/physics/models/deflection/bitrem_deflection.ts +68 -0
  264. package/src/core/physics/models/deflection/create_deflection_delegate.ts +46 -0
  265. package/src/core/physics/models/deflection/deflection_model.ts +33 -0
  266. package/src/core/physics/models/deflection/deflection_support_manager.ts +56 -0
  267. package/src/core/physics/models/deflection/deflection_tools.ts +11 -0
  268. package/src/core/physics/models/deflection/integration_constant_calculator.ts +62 -0
  269. package/src/core/physics/models/deflection/rodotrem_deflection.ts +57 -0
  270. package/src/core/physics/models/deflection/semi_reboque_deflection.ts +40 -0
  271. package/src/core/physics/models/deflection/simple_truck_deflection.ts +35 -0
  272. package/src/core/physics/models/deflection/vanderleia_deflection.ts +48 -0
  273. package/src/core/physics/models/old_tare_model.ts +51 -0
  274. package/src/core/physics/models/old_tare_scale.ts +9 -0
  275. package/src/core/physics/models/old_tare_semireboque.ts +51 -0
  276. package/src/core/physics/models/old_tare_truck.ts +15 -0
  277. package/src/core/physics/models/old_tare_vanderleia.ts +44 -0
  278. package/src/core/physics/models/percentage_on_axles_calculator.ts +49 -0
  279. package/src/core/physics/models/quad_semi_trailer_model.ts +87 -0
  280. package/src/core/physics/models/rodotrem_model.ts +131 -0
  281. package/src/core/physics/models/semi_reboque_base.ts +103 -0
  282. package/src/core/physics/models/semi_reboque_model.ts +127 -0
  283. package/src/core/physics/models/simple_truck_base.ts +70 -0
  284. package/src/core/physics/models/simple_truck_model.ts +115 -0
  285. package/src/core/physics/models/single_container_tare.ts +56 -0
  286. package/src/core/physics/models/tare_model.ts +46 -0
  287. package/src/core/physics/models/vanderleia_model.ts +125 -0
  288. package/src/core/physics/services/axle_weight_output_builder.ts +63 -0
  289. package/src/core/physics/services/axle_weight_service.ts +116 -0
  290. package/src/core/physics/services/cm_axle_weight_service.ts +45 -0
  291. package/src/core/physics/services/container_corner_forces.ts +95 -0
  292. package/src/core/physics/transports/axle_manager.ts +45 -0
  293. package/src/core/physics/transports/axle_record.ts +68 -0
  294. package/src/core/physics/transports/chassi.ts +130 -0
  295. package/src/core/physics/transports/container_record.ts +58 -0
  296. package/src/core/physics/transports/containerweight/container_max_weight_calculator.ts +59 -0
  297. package/src/core/physics/transports/containerweight/container_tare_calculator.ts +76 -0
  298. package/src/core/physics/transports/containerweight/container_weight_model.ts +38 -0
  299. package/src/core/physics/transports/containerweight/merged_containers_weight_calculator.ts +39 -0
  300. package/src/core/physics/transports/containerweight/single_container_weight_calculator.ts +65 -0
  301. package/src/core/physics/transports/grouped_containers.ts +91 -0
  302. package/src/core/physics/transports/merged_containers.ts +62 -0
  303. package/src/core/physics/transports/tare/bitrem_axle_splitter.ts +107 -0
  304. package/src/core/physics/transports/tare/bitrem_axle_weight_split.ts +55 -0
  305. package/src/core/physics/transports/transport.ts +137 -0
  306. package/src/index.ts +12 -0
  307. package/src/service/.gitkeep +0 -0
  308. package/test/data/src/core/orchestration/weight_by_axis/case_1_basic_truck_input.json +1759 -0
  309. package/test/data/src/core/orchestration/weight_by_axis/case_2_vanderleia_input.json +1286 -0
  310. package/test/data/src/core/orchestration/weight_by_axis/case_3_interlink_input.json +2226 -0
  311. package/test/data/src/core/orchestration/weight_by_axis/case_4_quad_semi_trailer.json +639 -0
  312. package/test/data/src/core/orchestration/weight_by_axis/case_5_custom_center_of_gravity.json +557 -0
  313. package/test/data/src/core/physics/axle_weight_calculations/case_2_bitruck.json +664 -0
  314. package/test/data/src/core/physics/axle_weight_calculations/case_4_quad_semi_trailer.json +674 -0
  315. package/test/data/src/core/physics/axle_weight_calculations/case_5_bi_truck_semi_trailer.json +674 -0
  316. package/test/data/src/core/physics/axle_weight_service/case_1_input_truck.json +1025 -0
  317. package/test/data/src/core/physics/axle_weight_service/case_1_output_truck.json +38 -0
  318. package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_input.json +1286 -0
  319. package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_output.json +65 -0
  320. package/test/data/src/core/physics/axle_weight_service/case_3_input_semireboque.json +24625 -0
  321. package/test/data/src/core/physics/axle_weight_service/case_3_output_semireboque.json +57 -0
  322. package/test/data/src/core/physics/axle_weight_service/case_4_input_bitrem.json +2226 -0
  323. package/test/data/src/core/physics/axle_weight_service/case_4_output_bitrem.json +96 -0
  324. package/test/data/src/core/physics/beam_deflection/case_10_rodotrem_offset.json +474 -0
  325. package/test/data/src/core/physics/beam_deflection/case_11_bitruck.json +664 -0
  326. package/test/data/src/core/physics/beam_deflection/case_12_quad_semi_trailer.json +792 -0
  327. package/test/data/src/core/physics/beam_deflection/case_13_bi_truck_semi_trailer.json +792 -0
  328. package/test/data/src/core/physics/beam_deflection/case_1_documentation.ipynb +316 -0
  329. package/test/data/src/core/physics/beam_deflection/case_1_semireboque.json +402 -0
  330. package/test/data/src/core/physics/beam_deflection/case_2_bitrem.json +434 -0
  331. package/test/data/src/core/physics/beam_deflection/case_3_rodotrem.json +474 -0
  332. package/test/data/src/core/physics/beam_deflection/case_4_vanderleia_pneumatica.json +425 -0
  333. package/test/data/src/core/physics/beam_deflection/case_5_vanderleia_mecanica.json +366 -0
  334. package/test/data/src/core/physics/beam_deflection/case_6_truck.json +279 -0
  335. package/test/data/src/core/physics/beam_deflection/case_7_semireboque_structural_offset.json +318 -0
  336. package/test/data/src/core/physics/beam_deflection/case_8_vanderleia_offset.json +425 -0
  337. package/test/data/src/core/physics/beam_deflection/case_9_bitrem_offset.json +434 -0
  338. package/test/data/src/core/physics/bitrem_axle_splitter/case_1_simple_bitrem.json +145 -0
  339. package/test/data/src/core/physics/bitrem_axle_splitter/case_2_lowered_bitrem.json +238 -0
  340. package/test/data/src/core/physics/bitrem_axle_splitter/case_3_lowered_positive_proportion.json +238 -0
  341. package/test/data/src/core/physics/c_m_axle_weight_service/case_1_interlink_trailer.json +94 -0
  342. package/test/data/src/core/physics/calculations/case_1_simple_truck.json +83 -0
  343. package/test/data/src/core/physics/calculations/case_2_lowered_bitrem.json +1051 -0
  344. package/test/data/src/core/physics/calculations/case_3_container_mercedes.json +50 -0
  345. package/test/data/src/core/physics/container_corner_forces/case_1.json +674 -0
  346. package/test/data/src/core/physics/container_weight/case_1_basictruck.json +223 -0
  347. package/test/data/src/core/physics/container_weight/case_2_roadtrain.json +277 -0
  348. package/test/data/src/core/physics/container_weight/case_3_semireboque_rebaixado.json +197 -0
  349. package/test/data/src/core/physics/container_weight/case_4_semireboque_neck_limit.json +197 -0
  350. package/test/data/src/core/physics/container_weight/case_5_vanderleia_rebaixada.json +211 -0
  351. package/test/data/src/core/physics/container_weight/case_6_lowered_interlink.json +230 -0
  352. package/test/data/src/core/physics/python_goldens.json +9 -0
  353. package/test/data/src/core/physics/tare/case_1_simple_vanderleia.json +185 -0
  354. package/test/data/src/core/physics/tare/case_2_lowered_vanderleia.json +646 -0
  355. package/test/data/src/core/physics/tare/case_3_lowered_interlink.json +230 -0
  356. package/test/data/src/core/physics/tare/case_4_negative_tare_VUC.json +483 -0
  357. package/test/data/src/core/physics/tare/case_5_truck_bitruck.json +664 -0
  358. package/test/data/src/core/physics/tare/case_6_quad_semi_trailer.json +203 -0
  359. package/test/data/src/core/physics/tare/case_7_bi_truck_semi_trailer.json +203 -0
  360. package/test/data/src/core/physics/tare/case_8_triaxle_semi_trailer.json +203 -0
  361. package/test/data/src/core/physics/time_performance/case_1_center_of_mass.json +2916 -0
  362. package/test/data/src/core/physics/trucks/bitrem.json +150 -0
  363. package/test/data/src/core/physics/trucks/lowered_bitrem.json +1216 -0
  364. package/test/data/src/core/physics/trucks/lowered_bitrem_empty_first_container.json +1182 -0
  365. package/test/data/src/core/physics/trucks/rodotrem.json +148 -0
  366. package/test/data/src/core/physics/trucks/semi_reboque.json +91 -0
  367. package/test/data/src/core/physics/trucks/semi_reboque_rebaixado.json +1629 -0
  368. package/test/data/src/core/physics/trucks/simple_truck.json +85 -0
  369. package/test/data/src/core/physics/trucks/vanderleia_mechanical.json +105 -0
  370. package/test/data/src/core/physics/trucks/vanderleia_pneumatic.json +105 -0
  371. package/test/src/core/orchestration/request_schema.test.ts +20 -0
  372. package/test/src/core/orchestration/weight_by_axis_task.test.ts +87 -0
  373. package/test/src/core/physics/items/center_of_mass.test.ts +38 -0
  374. package/test/src/core/physics/items/multi_container_allocated_items.test.ts +22 -0
  375. package/test/src/core/physics/math_input_helpers.ts +64 -0
  376. package/test/src/core/physics/models/bitrem_model.test.ts +54 -0
  377. package/test/src/core/physics/models/deflection/deflection_model.test.ts +78 -0
  378. package/test/src/core/physics/models/rodotrem_model.test.ts +29 -0
  379. package/test/src/core/physics/models/semi_reboque_model.test.ts +72 -0
  380. package/test/src/core/physics/models/simple_truck_model.test.ts +23 -0
  381. package/test/src/core/physics/models/tare_model.test.ts +34 -0
  382. package/test/src/core/physics/models/vanderleia_model.test.ts +36 -0
  383. package/test/src/core/physics/services/axle_weight_service.test.ts +56 -0
  384. package/test/src/core/physics/services/cm_axle_weight_service.test.ts +23 -0
  385. package/test/src/core/physics/services/container_corner_forces.test.ts +23 -0
  386. package/test/src/core/physics/test_helpers.ts +13 -0
  387. package/test/src/core/physics/transports/chassi.test.ts +35 -0
  388. package/test/src/core/physics/transports/containerweight/container_weight_model.test.ts +57 -0
  389. package/test/src/core/physics/transports/tare/bitrem_axle_splitter.test.ts +30 -0
  390. package/test/src/index.test.ts +35 -0
  391. package/tsconfig.eslint.json +15 -0
  392. package/tsconfig.json +19 -0
@@ -0,0 +1,45 @@
1
+ import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
2
+ import { AxleRecord } from './axle_record.js'
3
+ import type { TransportRecord } from '../../contracts/transport_record.js'
4
+
5
+ /**
6
+ * Ordered axle list for a transport.
7
+ */
8
+ export class AxleManager
9
+ {
10
+ axles: AxleRecord[]
11
+
12
+ /**
13
+ * @param transport_data - Raw transport JSON.
14
+ */
15
+ constructor(transport_data: TransportRecord)
16
+ {
17
+ const axles_data = transport_data[WIRE_FLAGS.AXLE_LIST]
18
+ this.axles = []
19
+ if (!Array.isArray(axles_data))
20
+ {
21
+ return
22
+ }
23
+ for (const axle_data of axles_data)
24
+ {
25
+ this.axles.push(new AxleRecord(axle_data as Record<string, unknown>))
26
+ }
27
+ }
28
+
29
+ /**
30
+ * @returns Axle index list [0..n-1].
31
+ */
32
+ list_axles_indexes(): number[]
33
+ {
34
+ return this.axles.map((_axle, index) => index)
35
+ }
36
+
37
+ /**
38
+ * @param axle_index - Zero-based axle index.
39
+ * @returns Axle at index.
40
+ */
41
+ get_axle(axle_index: number): AxleRecord
42
+ {
43
+ return this.axles[axle_index]
44
+ }
45
+ }
@@ -0,0 +1,68 @@
1
+ import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
2
+
3
+ /**
4
+ * Single axle geometry and capacity from wire JSON.
5
+ */
6
+ export class AxleRecord
7
+ {
8
+ distance_from_previous_axle: number
9
+ max_supported_weight: number
10
+ sequence_index: number
11
+ dnit_weight_limit: number
12
+ tare: number
13
+ loaded_weight: number
14
+ is_connected_to: number | null
15
+
16
+ /**
17
+ * @param axle_data - Raw axle object from transport JSON.
18
+ */
19
+ constructor(axle_data: Record<string, unknown>)
20
+ {
21
+ this.distance_from_previous_axle = read_number(axle_data, WIRE_FLAGS.DISTANCE_FROM_ORIGIN)
22
+ this.max_supported_weight = read_number(axle_data, WIRE_FLAGS.MAX_SUPPORTED_WEIGHT)
23
+ this.sequence_index = read_number(axle_data, WIRE_FLAGS.SEQUENCE_CONTAINER)
24
+ this.dnit_weight_limit = read_number(axle_data, WIRE_FLAGS.DNIT_WEIGHT)
25
+ this.tare = read_number(axle_data, WIRE_FLAGS.TARE)
26
+ this.loaded_weight = read_optional_number(axle_data, 'pesoCarregado') ?? 0
27
+ this.is_connected_to = read_optional_number(axle_data, 'mergeOnAxleIndex')
28
+ }
29
+
30
+ /**
31
+ * @returns Shallow copy of axle wire fields.
32
+ */
33
+ to_wire(): Record<string, unknown>
34
+ {
35
+ return {
36
+ distanciaOrigem: this.distance_from_previous_axle,
37
+ pesoMaxSuportado: this.max_supported_weight,
38
+ pesoDnit: this.dnit_weight_limit,
39
+ tara: this.tare,
40
+ sequenciaContainer: this.sequence_index,
41
+ mergeOnAxleIndex: this.is_connected_to
42
+ }
43
+ }
44
+ }
45
+
46
+ /**
47
+ * @param data - Source object.
48
+ * @param key - Field key.
49
+ * @returns Parsed number.
50
+ */
51
+ function read_number(data: Record<string, unknown>, key: string): number
52
+ {
53
+ return Number(data[key])
54
+ }
55
+
56
+ /**
57
+ * @param data - Source object.
58
+ * @param key - Field key.
59
+ * @returns Parsed number or null.
60
+ */
61
+ function read_optional_number(data: Record<string, unknown>, key: string): number | null
62
+ {
63
+ if (data[key] === undefined || data[key] === null)
64
+ {
65
+ return null
66
+ }
67
+ return Number(data[key])
68
+ }
@@ -0,0 +1,130 @@
1
+ import { CHASSI_REFERENCE, type ChassiReference } from '../../contracts/chassi_reference.js'
2
+ import type { Transport } from './transport.js'
3
+ import { MergedContainers } from './merged_containers.js'
4
+
5
+ /**
6
+ * Chassis geometry reference frame for equilibrium models.
7
+ */
8
+ export class Chassi
9
+ {
10
+ private first_axle_distance: number
11
+ private axle_positions: number[] = []
12
+ private pin_positions: number[] = []
13
+ private grouper_start: number[] = []
14
+ private grouper_end: number[] = []
15
+
16
+ /**
17
+ * @param transport - Parsed transport.
18
+ */
19
+ constructor(transport: Transport)
20
+ {
21
+ this.first_axle_distance = transport.first_axle_distance
22
+ const merged = new MergedContainers(transport)
23
+ this.calculate_groupers_positions(merged)
24
+ this.calculate_axles_positions(transport)
25
+ this.calculate_pins_positions(merged)
26
+ }
27
+
28
+ /**
29
+ * @param axle_index - Zero-based axle index.
30
+ * @param chassi_reference - Reference frame.
31
+ * @returns Axle position.
32
+ */
33
+ get_axle_position(axle_index: number, chassi_reference: ChassiReference): number
34
+ {
35
+ return this.axle_positions[axle_index]
36
+ + this.chassi_reference_change_value(chassi_reference)
37
+ }
38
+
39
+ /**
40
+ * @param pin_index - Zero-based pin index.
41
+ * @param chassi_reference - Reference frame.
42
+ * @returns Pin position.
43
+ */
44
+ get_pin_position(pin_index: number, chassi_reference: ChassiReference): number
45
+ {
46
+ return this.pin_positions[pin_index]
47
+ + this.chassi_reference_change_value(chassi_reference)
48
+ }
49
+
50
+ /**
51
+ * @param grouper_index - Grouper id (1-based).
52
+ * @param chassi_reference - Reference frame.
53
+ * @returns Grouper end position.
54
+ */
55
+ get_grouper_end(grouper_index: number, chassi_reference: ChassiReference): number
56
+ {
57
+ return this.grouper_end[grouper_index - 1]
58
+ + this.chassi_reference_change_value(chassi_reference)
59
+ }
60
+
61
+ /**
62
+ * @param chassi_reference - Reference frame.
63
+ * @returns Offset for reference change.
64
+ */
65
+ private chassi_reference_change_value(chassi_reference: ChassiReference): number
66
+ {
67
+ if (chassi_reference === CHASSI_REFERENCE.GROUPER_1)
68
+ {
69
+ return 0
70
+ }
71
+ if (chassi_reference === CHASSI_REFERENCE.GROUPER_2)
72
+ {
73
+ return -this.grouper_start[1]
74
+ }
75
+ return this.first_axle_distance
76
+ }
77
+
78
+ /**
79
+ * @param transport - Parsed transport.
80
+ */
81
+ private calculate_axles_positions(transport: Transport): void
82
+ {
83
+ this.axle_positions = [-this.first_axle_distance]
84
+ const indexes = transport.axle_manager.list_axles_indexes()
85
+ for (let index = 1; index < indexes.length; index++)
86
+ {
87
+ const axle = transport.axle_manager.get_axle(index)
88
+ const previous = this.axle_positions[index - 1]
89
+ this.axle_positions.push(previous + axle.distance_from_previous_axle)
90
+ }
91
+ }
92
+
93
+ /**
94
+ * @param merged_containers - Merged grouper geometry.
95
+ */
96
+ private calculate_groupers_positions(merged_containers: MergedContainers): void
97
+ {
98
+ const first = merged_containers.get_container_by_grouper_index(1)
99
+ this.grouper_start = [0]
100
+ this.grouper_end = [first.length]
101
+ if (merged_containers.list_grouper_indexes().length <= 1)
102
+ {
103
+ return
104
+ }
105
+ const second = merged_containers.get_container_by_grouper_index(2)
106
+ const second_start = this.grouper_end[0] + (second.container_distance_ahead ?? 0)
107
+ this.grouper_start.push(second_start)
108
+ this.grouper_end.push(second_start + second.length)
109
+ }
110
+
111
+ /**
112
+ * @param merged_containers - Merged grouper geometry.
113
+ */
114
+ private calculate_pins_positions(merged_containers: MergedContainers): void
115
+ {
116
+ const first = merged_containers.get_container_by_grouper_index(1)
117
+ this.pin_positions = [first.main_pin_distance ?? 0]
118
+ if (merged_containers.list_grouper_indexes().length <= 1)
119
+ {
120
+ return
121
+ }
122
+ const second = merged_containers.get_container_by_grouper_index(2)
123
+ if (second.main_pin_distance === null)
124
+ {
125
+ return
126
+ }
127
+ const second_pin = this.grouper_start[1] + second.main_pin_distance
128
+ this.pin_positions.push(second_pin)
129
+ }
130
+ }
@@ -0,0 +1,58 @@
1
+ import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
2
+
3
+ /**
4
+ * Container segment from wire JSON.
5
+ */
6
+ export class ContainerRecord
7
+ {
8
+ length: number
9
+ width: number
10
+ height: number
11
+ sequence_index: number
12
+ main_pin_distance: number | null
13
+ container_distance_ahead: number | null
14
+ grouper: number
15
+ max_supported_weight: number
16
+ tare: number
17
+ supported_weight: number
18
+ raw: Record<string, unknown>
19
+
20
+ /**
21
+ * @param data - Raw container object.
22
+ */
23
+ constructor(data: Record<string, unknown>)
24
+ {
25
+ this.length = Number(data[WIRE_FLAGS.LENGTH])
26
+ this.width = Number(data[WIRE_FLAGS.WIDTH])
27
+ this.height = Number(data[WIRE_FLAGS.HEIGHT])
28
+ this.sequence_index = Number(data[WIRE_FLAGS.SEQUENCE])
29
+ this.main_pin_distance = read_optional(data[WIRE_FLAGS.MAIN_PIN_DISTANCE])
30
+ this.container_distance_ahead = read_optional(data[WIRE_FLAGS.CONTAINER_DISTANCE_AHEAD])
31
+ this.grouper = Number(data[WIRE_FLAGS.GROUPER])
32
+ this.max_supported_weight = Number(data[WIRE_FLAGS.MAX_SUPPORTED_WEIGHT] ?? 0)
33
+ this.tare = Number(data[WIRE_FLAGS.TARE] ?? 0)
34
+ this.supported_weight = this.max_supported_weight - this.tare
35
+ this.raw = { ...data }
36
+ }
37
+
38
+ /**
39
+ * @returns Container volume (length × width × height).
40
+ */
41
+ volume(): number
42
+ {
43
+ return this.length * this.width * this.height
44
+ }
45
+ }
46
+
47
+ /**
48
+ * @param value - Wire field value.
49
+ * @returns Number or null.
50
+ */
51
+ function read_optional(value: unknown): number | null
52
+ {
53
+ if (value === undefined || value === null)
54
+ {
55
+ return null
56
+ }
57
+ return Number(value)
58
+ }
@@ -0,0 +1,59 @@
1
+ import type { GroupedContainers } from '../grouped_containers.js'
2
+
3
+ type MaxWeightInput = {
4
+ sequence_index: number
5
+ percentage_of_weight: number
6
+ total_max_supported_weight: number
7
+ tare: number
8
+ }
9
+
10
+ const MAX_NECK_SUPPORTED = 6000
11
+
12
+ /**
13
+ * Applies neck weight cap and redistributes excess to second container.
14
+ */
15
+ export class ContainerMaxWeightCalculator
16
+ {
17
+ private neck_weight_reduction = 0
18
+
19
+ /**
20
+ * @param grouped_containers - Grouper containers.
21
+ */
22
+ constructor(private readonly grouped_containers: GroupedContainers)
23
+ {}
24
+
25
+ /**
26
+ * @param input - Sequence, share, capacity, and tare.
27
+ * @returns Max supported weight for container.
28
+ */
29
+ calculate(input: MaxWeightInput): number
30
+ {
31
+ const max_supported = input.total_max_supported_weight * input.percentage_of_weight
32
+ if (this.is_neck(input.sequence_index))
33
+ {
34
+ const supported = max_supported - input.tare
35
+ if (supported > MAX_NECK_SUPPORTED)
36
+ {
37
+ this.neck_weight_reduction = supported - MAX_NECK_SUPPORTED
38
+ return input.tare + MAX_NECK_SUPPORTED
39
+ }
40
+ }
41
+ else if (this.is_second_container(input.sequence_index))
42
+ {
43
+ return max_supported + this.neck_weight_reduction
44
+ }
45
+ return max_supported
46
+ }
47
+
48
+ private is_neck(sequence_index: number): boolean
49
+ {
50
+ const list = this.grouped_containers.list_containers_sequence_indexes()
51
+ return list.length >= 2 && list[0] === sequence_index
52
+ }
53
+
54
+ private is_second_container(sequence_index: number): boolean
55
+ {
56
+ const list = this.grouped_containers.list_containers_sequence_indexes()
57
+ return list.length >= 2 && list[1] === sequence_index
58
+ }
59
+ }
@@ -0,0 +1,76 @@
1
+ import type { Transport } from '../transport.js'
2
+ import type { GroupedContainers } from '../grouped_containers.js'
3
+
4
+ const NECK_SEQUENCE = 1
5
+
6
+ /**
7
+ * Distributes grouper tare across containers (neck gets axle-1 share).
8
+ */
9
+ export class ContainerTareCalculator
10
+ {
11
+ private revised_tare_percentage = 0
12
+ private first_neck_tare = 0
13
+
14
+ /**
15
+ * @param transport - Parsed transport.
16
+ * @param grouped_containers - Grouper containers.
17
+ */
18
+ constructor(
19
+ private readonly transport: Transport,
20
+ private readonly grouped_containers: GroupedContainers
21
+ )
22
+ {}
23
+
24
+ /**
25
+ * @param sequence_index - Container sequence.
26
+ * @param percentage_of_weight - Lateral area share.
27
+ * @param total_tare - Grouper total tare.
28
+ * @returns Container tare.
29
+ */
30
+ calculate(
31
+ sequence_index: number,
32
+ percentage_of_weight: number,
33
+ total_tare: number
34
+ ): number
35
+ {
36
+ if (this.is_first_neck(sequence_index))
37
+ {
38
+ this.calculate_tare_of_first_neck(percentage_of_weight)
39
+ this.tare_percentage_review(percentage_of_weight, total_tare)
40
+ return this.first_neck_tare
41
+ }
42
+ return (percentage_of_weight + this.revised_tare_percentage) * total_tare
43
+ }
44
+
45
+ private is_first_neck(sequence_index: number): boolean
46
+ {
47
+ return this.grouped_containers.list_containers_sequence_indexes().length >= 2
48
+ && sequence_index === NECK_SEQUENCE
49
+ }
50
+
51
+ private calculate_tare_of_first_neck(percentage_of_weight: number): void
52
+ {
53
+ const neck = this.grouped_containers.get_container_by_sequence_index(NECK_SEQUENCE)
54
+ const axle1 = this.axle1_on_neck_tare_contribution(neck.length)
55
+ const remaining = percentage_of_weight * (
56
+ this.transport.axle_manager.get_axle(1).tare
57
+ + this.transport.axle_manager.get_axle(2).tare)
58
+ this.first_neck_tare = axle1 + remaining
59
+ }
60
+
61
+ private tare_percentage_review(percentage_of_weight: number, total_tare: number): void
62
+ {
63
+ const tare = percentage_of_weight * total_tare
64
+ const change = (this.first_neck_tare - tare) / total_tare
65
+ const count = this.grouped_containers.list_containers_sequence_indexes().length
66
+ this.revised_tare_percentage = -change / (count - 1)
67
+ }
68
+
69
+ private axle1_on_neck_tare_contribution(neck_length: number): number
70
+ {
71
+ const end_container = this.transport.first_axle_distance + neck_length
72
+ const end_grouper = this.transport.first_axle_distance + this.grouped_containers.length
73
+ const share = end_container / end_grouper
74
+ return share * this.transport.axle_manager.get_axle(0).tare
75
+ }
76
+ }
@@ -0,0 +1,38 @@
1
+ import type { Transport } from '../transport.js'
2
+ import { MergedContainers } from '../merged_containers.js'
3
+ import { MergedContainersWeightCalculator } from './merged_containers_weight_calculator.js'
4
+ import { SingleContainerWeightCalculator } from './single_container_weight_calculator.js'
5
+
6
+ /**
7
+ * Computes per-container supported cargo capacity.
8
+ */
9
+ export class ContainerWeightModel
10
+ {
11
+ private readonly merged_containers: MergedContainers
12
+
13
+ /**
14
+ * @param transport - Parsed transport.
15
+ */
16
+ constructor(private readonly transport: Transport)
17
+ {
18
+ this.merged_containers = new MergedContainers(transport)
19
+ }
20
+
21
+ /** Updates container supported_weight on transport. */
22
+ calculate(): void
23
+ {
24
+ const axles = this.transport.axle_manager.list_axles_indexes()
25
+ .map((index) => this.transport.axle_manager.get_axle(index))
26
+ new MergedContainersWeightCalculator(this.merged_containers, axles).calculate()
27
+ for (const grouper of this.merged_containers.list_grouper_indexes())
28
+ {
29
+ const grouped = this.merged_containers.get_container_by_grouper_index(grouper)
30
+ new SingleContainerWeightCalculator(this.transport, grouped).calculate()
31
+ }
32
+ for (const sequence of this.transport.list_containers_sequence_indexes())
33
+ {
34
+ const container = this.transport.get_container_by_sequence_index(sequence)
35
+ container.supported_weight = container.max_supported_weight - container.tare
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,39 @@
1
+ import type { MergedContainers } from '../merged_containers.js'
2
+ import type { AxleRecord } from '../axle_record.js'
3
+
4
+ /**
5
+ * Sums axle capacity and tare onto merged grouper containers.
6
+ */
7
+ export class MergedContainersWeightCalculator
8
+ {
9
+ /**
10
+ * @param merged_containers - Grouper layout.
11
+ * @param transport_axles_list - All axles.
12
+ */
13
+ constructor(
14
+ private readonly merged_containers: MergedContainers,
15
+ private readonly transport_axles_list: AxleRecord[]
16
+ )
17
+ {}
18
+
19
+ /** Applies summed max weight and tare to each merged grouper container. */
20
+ calculate(): void
21
+ {
22
+ for (const grouper of this.merged_containers.list_grouper_indexes())
23
+ {
24
+ const grouped = this.merged_containers.get_container_by_grouper_index(grouper)
25
+ const sequences = grouped.list_containers_sequence_indexes()
26
+ const merged = grouped.merged_container!
27
+ merged.max_supported_weight = 0
28
+ merged.tare = 0
29
+ for (const axle of this.transport_axles_list)
30
+ {
31
+ if (sequences.includes(axle.sequence_index))
32
+ {
33
+ merged.max_supported_weight += axle.max_supported_weight
34
+ merged.tare += axle.tare
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,65 @@
1
+ import type { Transport } from '../transport.js'
2
+ import type { GroupedContainers } from '../grouped_containers.js'
3
+ import type { ContainerRecord } from '../container_record.js'
4
+ import { ContainerTareCalculator } from './container_tare_calculator.js'
5
+ import { ContainerMaxWeightCalculator } from './container_max_weight_calculator.js'
6
+
7
+ /**
8
+ * Splits grouper capacity across containers by lateral area.
9
+ */
10
+ export class SingleContainerWeightCalculator
11
+ {
12
+ private readonly tare_calculator: ContainerTareCalculator
13
+ private readonly max_calculator: ContainerMaxWeightCalculator
14
+
15
+ /**
16
+ * @param transport - Parsed transport.
17
+ * @param grouped_containers - Grouper containers.
18
+ */
19
+ constructor(
20
+ transport: Transport,
21
+ private readonly grouped_containers: GroupedContainers
22
+ )
23
+ {
24
+ this.tare_calculator = new ContainerTareCalculator(transport, grouped_containers)
25
+ this.max_calculator = new ContainerMaxWeightCalculator(grouped_containers)
26
+ }
27
+
28
+ /** Assigns max_supported_weight and tare per container in grouper. */
29
+ calculate(): void
30
+ {
31
+ const total_area = this.total_lateral_area()
32
+ const merged = this.grouped_containers.merged_container!
33
+ const total_max = merged.max_supported_weight
34
+ const total_tare = merged.tare
35
+ for (const sequence of this.grouped_containers.list_containers_sequence_indexes())
36
+ {
37
+ const container = this.grouped_containers.get_container_by_sequence_index(sequence)
38
+ const share = this.lateral_area(container) / total_area
39
+ const tare = this.tare_calculator.calculate(sequence, share, total_tare)
40
+ container.max_supported_weight = this.max_calculator.calculate({
41
+ sequence_index: sequence,
42
+ percentage_of_weight: share,
43
+ total_max_supported_weight: total_max,
44
+ tare
45
+ })
46
+ container.tare = tare
47
+ }
48
+ }
49
+
50
+ private total_lateral_area(): number
51
+ {
52
+ let total = 0
53
+ for (const sequence of this.grouped_containers.list_containers_sequence_indexes())
54
+ {
55
+ total += this.lateral_area(
56
+ this.grouped_containers.get_container_by_sequence_index(sequence))
57
+ }
58
+ return total
59
+ }
60
+
61
+ private lateral_area(container: ContainerRecord): number
62
+ {
63
+ return container.length * container.height
64
+ }
65
+ }
@@ -0,0 +1,91 @@
1
+ import { ContainerRecord } from './container_record.js'
2
+
3
+ /**
4
+ * Containers merged per grouper.
5
+ */
6
+ export class GroupedContainers
7
+ {
8
+ grouper: number
9
+ merged_container: ContainerRecord | null = null
10
+ private containers = new Map<number, ContainerRecord>()
11
+
12
+ /**
13
+ * @param grouper - Grouper id.
14
+ */
15
+ constructor(grouper: number)
16
+ {
17
+ this.grouper = grouper
18
+ }
19
+
20
+ get length(): number
21
+ {
22
+ return this.merged_container!.length
23
+ }
24
+
25
+ get container_distance_ahead(): number | null
26
+ {
27
+ return this.merged_container!.container_distance_ahead
28
+ }
29
+
30
+ get main_pin_distance(): number | null
31
+ {
32
+ return this.merged_container!.main_pin_distance
33
+ }
34
+
35
+ /**
36
+ * @param container - Container to add.
37
+ */
38
+ add_container(container: ContainerRecord): void
39
+ {
40
+ if (container.grouper === this.grouper)
41
+ {
42
+ this.containers.set(container.sequence_index, container)
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Merges segment lengths into first container of grouper.
48
+ */
49
+ generate_merged_container(): void
50
+ {
51
+ const sequence_indexes = this.list_containers_sequence_indexes()
52
+ const first = this.get_container_by_sequence_index(sequence_indexes[0])
53
+ this.merged_container = clone_container(first)
54
+ for (let index = 1; index < sequence_indexes.length; index++)
55
+ {
56
+ const next = this.get_container_by_sequence_index(sequence_indexes[index])
57
+ this.merged_container.length += next.length
58
+ }
59
+ }
60
+
61
+ /**
62
+ * @param sequence_index - Container sequence.
63
+ * @returns Container record.
64
+ */
65
+ get_container_by_sequence_index(sequence_index: number): ContainerRecord
66
+ {
67
+ const container = this.containers.get(sequence_index)
68
+ if (!container)
69
+ {
70
+ throw new Error(`Missing container ${sequence_index}`)
71
+ }
72
+ return container
73
+ }
74
+
75
+ /**
76
+ * @returns Sorted sequence indexes.
77
+ */
78
+ list_containers_sequence_indexes(): number[]
79
+ {
80
+ return [...this.containers.keys()].sort((left, right) => left - right)
81
+ }
82
+ }
83
+
84
+ /**
85
+ * @param source - Container to clone.
86
+ * @returns Shallow clone with same wire fields.
87
+ */
88
+ function clone_container(source: ContainerRecord): ContainerRecord
89
+ {
90
+ return new ContainerRecord({ ...source.raw })
91
+ }