@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,115 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import { MergedContainers } from '../transports/merged_containers.js'
3
+ import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
4
+ import {
5
+ calculate_chassi_forces_from_multi,
6
+ compute_center_of_mass_by_grouper
7
+ } from '../items/compute_grouper_center_of_mass.js'
8
+ import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
9
+ import { CenterOfMass } from '../items/center_of_mass.js'
10
+ import { ChassiForces } from './chassi_forces.js'
11
+ import { SimpleTruckBase } from './simple_truck_base.js'
12
+ import { BiTruckModel } from './bi_truck_model.js'
13
+
14
+ type TruckDelegate = {
15
+ calculate_chassi_forces_with_load_center_of_mass: (
16
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
17
+ ) => ChassiForces
18
+ }
19
+
20
+ /**
21
+ * Caminhão / VUC axle weight (optional bitruck variant).
22
+ */
23
+ export class SimpleTruckModel
24
+ {
25
+ private readonly delegate: TruckDelegate & { axles_positions?: number[]; equivalent_truck?: SimpleTruckBase }
26
+ private readonly transport: Transport
27
+ private readonly merged_containers: MergedContainers
28
+
29
+ /**
30
+ * @param transport - Parsed transport.
31
+ */
32
+ constructor(transport: Transport)
33
+ {
34
+ this.transport = transport
35
+ this.merged_containers = new MergedContainers(transport)
36
+ if (transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK)
37
+ {
38
+ this.delegate = new BiTruckModel(transport)
39
+ }
40
+ else
41
+ {
42
+ const base = new SimpleTruckBase(transport)
43
+ base.set_axles_positions()
44
+ this.delegate = base
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @param multi_items - Allocated items.
50
+ * @returns Loaded weights per axle.
51
+ */
52
+ calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
53
+ {
54
+ const forces = this.calculate_chassi_forces(multi_items)
55
+ return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
56
+ }
57
+
58
+ /**
59
+ * @param multi_items - Allocated items.
60
+ * @returns Chassis forces.
61
+ */
62
+ calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
63
+ {
64
+ return calculate_chassi_forces_from_multi(
65
+ this.transport,
66
+ multi_items,
67
+ (center_of_mass_by_grouper) =>
68
+ this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
69
+ }
70
+
71
+ /**
72
+ * @param multi_items - Allocated items.
73
+ * @returns Deflection support pairs.
74
+ */
75
+ calculate_support_data(multi_items: MultiContainerAllocatedItems): [number, number][]
76
+ {
77
+ if (this.transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK)
78
+ {
79
+ const center_of_mass_by_grouper = compute_center_of_mass_by_grouper(
80
+ multi_items,
81
+ this.merged_containers)
82
+ const bi_truck = this.delegate as BiTruckModel
83
+ const forces = bi_truck.equivalent_truck
84
+ .calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
85
+ const positions = bi_truck.equivalent_truck.axles_positions
86
+ return [[positions[0], forces.get_force_on_axle(0)], [positions[1], forces.get_force_on_axle(1)]]
87
+ }
88
+ const forces = this.calculate_chassi_forces(multi_items)
89
+ const base = this.delegate as SimpleTruckBase
90
+ return [
91
+ [base.axles_positions[0], forces.get_force_on_axle(0)],
92
+ [base.axles_positions[1], forces.get_force_on_axle(1)]
93
+ ]
94
+ }
95
+
96
+ /**
97
+ * @returns Merged grouper 1 length.
98
+ */
99
+ calculate_container_length(): number
100
+ {
101
+ return this.merged_containers.get_container_by_grouper_index(1).length
102
+ }
103
+
104
+ /**
105
+ * @param center_of_mass_by_grouper - CM per grouper.
106
+ * @returns Chassis forces.
107
+ */
108
+ calculate_chassi_forces_with_load_center_of_mass(
109
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
110
+ ): ChassiForces
111
+ {
112
+ return this.delegate.calculate_chassi_forces_with_load_center_of_mass(
113
+ center_of_mass_by_grouper)
114
+ }
115
+ }
@@ -0,0 +1,56 @@
1
+ import { CenterOfMass } from '../items/center_of_mass.js'
2
+ import { AxleWeightModel } from './axle_weight_model.js'
3
+ import type { Transport } from '../transports/transport.js'
4
+
5
+ /**
6
+ * Physics-based tare from uniform load at volume centroid.
7
+ */
8
+ export class SingleContainerTare
9
+ {
10
+ /**
11
+ * @param transport - Parsed transport.
12
+ */
13
+ constructor(private readonly transport: Transport)
14
+ {}
15
+
16
+ /**
17
+ * @returns Calculated tare per axle.
18
+ */
19
+ calculate(): number[]
20
+ {
21
+ const forces = this.calculate_forces_on_axles(
22
+ this.calculate_z_centroid(),
23
+ this.transport.supported_weight)
24
+ return this.transport.axle_manager.list_axles_indexes().map((index) =>
25
+ {
26
+ const axle = this.transport.axle_manager.get_axle(index)
27
+ return axle.max_supported_weight - forces.get_force_on_axle(index)
28
+ })
29
+ }
30
+
31
+ private calculate_z_centroid(): number
32
+ {
33
+ let z_offset = 0
34
+ let sum_z = 0
35
+ let total_volume = 0
36
+ for (const sequence of this.transport.list_containers_sequence_indexes())
37
+ {
38
+ const container = this.transport.get_container_by_sequence_index(sequence)
39
+ const z_centroid = z_offset + container.length / 2
40
+ z_offset += container.length
41
+ const volume = container.volume()
42
+ sum_z += z_centroid * volume
43
+ total_volume += volume
44
+ }
45
+ return sum_z / total_volume
46
+ }
47
+
48
+ private calculate_forces_on_axles(z_position: number, mass: number)
49
+ {
50
+ const model = new AxleWeightModel(this.transport)
51
+ const center_of_mass = new CenterOfMass()
52
+ center_of_mass.z = z_position
53
+ center_of_mass.mass = mass
54
+ return model.calculate_chassi_forces_with_load_center_of_mass({ 1: center_of_mass })
55
+ }
56
+ }
@@ -0,0 +1,46 @@
1
+ import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
2
+ import type { Transport } from '../transports/transport.js'
3
+ import { OldTareModel } from './old_tare_model.js'
4
+ import { SingleContainerTare } from './single_container_tare.js'
5
+
6
+ const DISTANCE_TOLERANCE = 0.9
7
+
8
+ /**
9
+ * Selects legacy or physics tare model per axle.
10
+ */
11
+ export class TareModel
12
+ {
13
+ /**
14
+ * @param transport - Parsed transport.
15
+ * @returns Tare per axle.
16
+ */
17
+ calculate(transport: Transport): number[]
18
+ {
19
+ if (transport.vehicle_type === VEHICLE_TYPE.BITREM
20
+ || transport.vehicle_type === VEHICLE_TYPE.RODOTREM)
21
+ {
22
+ return new OldTareModel().calculate(transport)
23
+ }
24
+ const reference = new OldTareModel().calculate(transport)
25
+ const physics = new SingleContainerTare(transport).calculate()
26
+ return choose_tare_model(reference, physics)
27
+ }
28
+ }
29
+
30
+ /**
31
+ * @param reference_values - Legacy tare per axle.
32
+ * @param new_values - Physics tare per axle.
33
+ * @returns Selected tare list.
34
+ */
35
+ function choose_tare_model(reference_values: number[], new_values: number[]): number[]
36
+ {
37
+ for (let index = 0; index < reference_values.length; index++)
38
+ {
39
+ const ref = reference_values[index]
40
+ if (Math.abs(new_values[index] - ref) > ref * DISTANCE_TOLERANCE)
41
+ {
42
+ return reference_values
43
+ }
44
+ }
45
+ return new_values
46
+ }
@@ -0,0 +1,125 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
3
+ import { calculate_chassi_forces_from_multi } from '../items/compute_grouper_center_of_mass.js'
4
+ import { Chassi } from '../transports/chassi.js'
5
+ import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
6
+ import { SUSPENSION_TYPE } from '../../contracts/suspension_type.js'
7
+ import { CenterOfMass } from '../items/center_of_mass.js'
8
+ import { ChassiForces } from './chassi_forces.js'
9
+ import { solve_linear_system } from '../../math/gaussian_elimination.js'
10
+
11
+ /**
12
+ * Vanderleia five-axle static model with suspension-dependent coupling.
13
+ */
14
+ export class VanderleiaModel
15
+ {
16
+ readonly chassi: Chassi
17
+ private readonly matrix: number[][]
18
+
19
+ /**
20
+ * @param transport - Parsed transport.
21
+ */
22
+ constructor(private readonly transport: Transport)
23
+ {
24
+ this.chassi = new Chassi(transport)
25
+ this.matrix = generate_vanderleia_matrix(this.chassi, transport)
26
+ }
27
+
28
+ /**
29
+ * @param multi_items - Allocated items.
30
+ * @returns Loaded weights per axle.
31
+ */
32
+ calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
33
+ {
34
+ const forces = this.calculate_chassi_forces(multi_items)
35
+ return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
36
+ }
37
+
38
+ /**
39
+ * @param multi_items - Allocated items.
40
+ * @returns Chassis forces.
41
+ */
42
+ calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
43
+ {
44
+ return calculate_chassi_forces_from_multi(
45
+ this.transport,
46
+ multi_items,
47
+ (center_of_mass_by_grouper) =>
48
+ this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
49
+ }
50
+
51
+ /**
52
+ * @param center_of_mass_by_grouper - CM for grouper 1.
53
+ * @returns Chassis forces on five axles.
54
+ */
55
+ calculate_chassi_forces_with_load_center_of_mass(
56
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
57
+ ): ChassiForces
58
+ {
59
+ const solution = solve_vanderleia_system(this.matrix, center_of_mass_by_grouper[1])
60
+ const forces = new ChassiForces()
61
+ forces.add_pin_forces([solution[3]])
62
+ forces.add_axle_forces([
63
+ solution[5],
64
+ solution[4],
65
+ solution[2],
66
+ solution[1],
67
+ solution[0]
68
+ ])
69
+ return forces
70
+ }
71
+ }
72
+
73
+ /**
74
+ * @param chassi - Chassis geometry.
75
+ * @param transport - Parsed transport (suspension type).
76
+ * @returns 6×6 matrix.
77
+ */
78
+ function generate_vanderleia_matrix(chassi: Chassi, transport: Transport): number[][]
79
+ {
80
+ const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
81
+ const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
82
+ const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
83
+ const pin_1 = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
84
+ const axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
85
+ const axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
86
+ const axle_5 = chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_1)
87
+ const relation = reactions_relation(transport)
88
+ return [
89
+ [1, 0, -relation[0], 0, 0, 0],
90
+ [0, 1, -relation[1], 0, 0, 0],
91
+ [1, 1, 1, 1, 0, 0],
92
+ [axle_5, axle_4, axle_3, pin_1, 0, 0],
93
+ [0, 0, 0, -1, 1, 1],
94
+ [0, 0, 0, -tractor_pin, tractor_axle_2, tractor_axle_1]
95
+ ]
96
+ }
97
+
98
+ /**
99
+ * @param transport - Parsed transport.
100
+ * @returns Reaction coupling factors.
101
+ */
102
+ function reactions_relation(transport: Transport): [number, number]
103
+ {
104
+ const raw = transport.suspension_type
105
+ if (raw === SUSPENSION_TYPE.PNEUMATICA || raw === 'Pneumatica')
106
+ {
107
+ return [1, 1]
108
+ }
109
+ if (raw === SUSPENSION_TYPE.MECANICA || raw === 'Mecanica')
110
+ {
111
+ return [0.867469880, 0.542168675]
112
+ }
113
+ throw new Error(`Unrecognized suspension type: ${String(raw)}`)
114
+ }
115
+
116
+ /**
117
+ * @param matrix - System matrix.
118
+ * @param center_of_mass - Load CM.
119
+ * @returns Solution vector.
120
+ */
121
+ function solve_vanderleia_system(matrix: number[][], center_of_mass: CenterOfMass): number[]
122
+ {
123
+ const independent = [0, 0, center_of_mass.mass, center_of_mass.mass * center_of_mass.z, 0, 0]
124
+ return solve_linear_system(matrix, independent)
125
+ }
@@ -0,0 +1,63 @@
1
+ import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
2
+ import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
3
+ import type { Transport } from '../transports/transport.js'
4
+ import type { Chassi } from '../transports/chassi.js'
5
+
6
+ /**
7
+ * @param transport - Parsed transport.
8
+ * @param grouper - Grouper index.
9
+ * @returns Axle indexes for grouper output.
10
+ */
11
+ export function select_axles_for_grouper(transport: Transport, grouper: number): number[]
12
+ {
13
+ const type = transport.vehicle_type
14
+ if (type === VEHICLE_TYPE.RODOTREM || type === VEHICLE_TYPE.BITREM)
15
+ {
16
+ return grouper === 1 ? [0, 1, 2] : [3, 4]
17
+ }
18
+ return transport.axle_manager.list_axles_indexes()
19
+ }
20
+
21
+ /**
22
+ * @param axles_indexes - Axle indexes in output row.
23
+ * @returns Chassi reference for distance helper.
24
+ */
25
+ export function find_grouper_reference(
26
+ axles_indexes: number[]
27
+ ): typeof CHASSI_REFERENCE.GROUPER_1 | typeof CHASSI_REFERENCE.GROUPER_2
28
+ {
29
+ return axles_indexes.includes(0) ? CHASSI_REFERENCE.GROUPER_1 : CHASSI_REFERENCE.GROUPER_2
30
+ }
31
+
32
+ type AxleWeightOutputInput = {
33
+ transport: Transport
34
+ chassi: Chassi
35
+ axles_indexes: number[]
36
+ weight_on_axles: number[]
37
+ }
38
+
39
+ /**
40
+ * @param input - Transport, chassi, axles, and cargo loads.
41
+ * @returns pesoEixos wire rows.
42
+ */
43
+ export function build_axle_weights_output(input: AxleWeightOutputInput): Record<string, unknown>[]
44
+ {
45
+ return input.axles_indexes.map((axle_index) =>
46
+ {
47
+ const axle = input.transport.axle_manager.get_axle(axle_index)
48
+ const cargo = input.weight_on_axles[axle_index]
49
+ return {
50
+ distanciaOrigem: axle.distance_from_previous_axle,
51
+ pesoMaxFinal: axle.max_supported_weight,
52
+ tara: axle.tare,
53
+ pesoMax: axle.max_supported_weight - axle.tare,
54
+ pesoCarregado: cargo,
55
+ pesoCarregadoFinal: axle.tare + cargo,
56
+ distanciaOrigemSemPrimeiroEixo: axle_index === 0
57
+ ? 0
58
+ : input.chassi.get_axle_position(
59
+ axle_index,
60
+ find_grouper_reference(input.axles_indexes))
61
+ }
62
+ })
63
+ }
@@ -0,0 +1,116 @@
1
+ import { MsFaixasContract } from '../../contracts/ms_faixas_contract.js'
2
+ import { Transport } from '../transports/transport.js'
3
+ import { Chassi } from '../transports/chassi.js'
4
+ import { MergedContainers } from '../transports/merged_containers.js'
5
+ import { AxleWeightModel } from '../models/axle_weight_model.js'
6
+ import {
7
+ build_axle_weights_output,
8
+ select_axles_for_grouper
9
+ } from './axle_weight_output_builder.js'
10
+
11
+ const TRANSPORT_LIST_FLAG = 'envs'
12
+ const TRANSPORT_ID_FLAG = 'idCaminhao'
13
+ const CONTAINERS_FLAG = 'conteiners'
14
+ const SEQUENCE_FLAG = 'sequencia'
15
+ const FAIXAS_FLAG = 'faixas'
16
+ const TARE_FLAG = 'tara'
17
+ const ITEMS_FLAG = 'items'
18
+ const MAX_SUPPORTED_FLAG = 'pesoSuportado'
19
+ const CENTER_OF_GRAVITY_FLAG = 'centroGravidade'
20
+ const AXLE_WEIGHTS_FLAG = 'pesoEixos'
21
+
22
+ /**
23
+ * Full ms-faixas axle weight pipeline (Python AxleWeightService port).
24
+ */
25
+ export class AxleWeightService
26
+ {
27
+ private readonly transport: Transport
28
+ private readonly chassi: Chassi
29
+ private readonly allocated_by_sequence: Record<number, import('../items/allocated_item_manager.js').AllocatedItemManager>
30
+
31
+ /**
32
+ * @param input_data - Ms-faixas payload with envs.
33
+ */
34
+ constructor(input_data: Record<string, unknown>)
35
+ {
36
+ const contract = new MsFaixasContract(input_data)
37
+ this.transport = new Transport(contract.transport_data)
38
+ this.chassi = new Chassi(this.transport)
39
+ this.allocated_by_sequence = contract.allocated_items_by_sequence_id
40
+ }
41
+
42
+ /**
43
+ * @returns Math output with envs and pesoEixos per container.
44
+ */
45
+ run(): Record<string, unknown>
46
+ {
47
+ return {
48
+ [TRANSPORT_LIST_FLAG]: [{
49
+ [TRANSPORT_ID_FLAG]: this.transport.id,
50
+ [CONTAINERS_FLAG]: this.build_containers_data()
51
+ }]
52
+ }
53
+ }
54
+
55
+ private build_containers_data(): Record<string, unknown>[]
56
+ {
57
+ const weights_by_sequence = this.evaluate_weight_on_axles()
58
+ const center_of_gravity: Record<number, number> = {}
59
+ for (const sequence of this.transport.list_containers_sequence_indexes())
60
+ {
61
+ center_of_gravity[sequence] = 0
62
+ }
63
+ return this.transport.list_containers_sequence_indexes().map((sequence) =>
64
+ {
65
+ const container = this.transport.get_container_by_sequence_index(sequence)
66
+ return {
67
+ [SEQUENCE_FLAG]: container.sequence_index,
68
+ [FAIXAS_FLAG]: [],
69
+ [TARE_FLAG]: 0,
70
+ [ITEMS_FLAG]: [],
71
+ [MAX_SUPPORTED_FLAG]: container.max_supported_weight,
72
+ [CENTER_OF_GRAVITY_FLAG]: center_of_gravity[sequence],
73
+ [AXLE_WEIGHTS_FLAG]: weights_by_sequence[sequence] ?? []
74
+ }
75
+ })
76
+ }
77
+
78
+ private evaluate_weight_on_axles(): Record<number, Record<string, unknown>[]>
79
+ {
80
+ const model = new AxleWeightModel(this.transport)
81
+ const weight_on_axles = model.calculate_weight_on_axles(this.allocated_by_sequence)
82
+ const merged = new MergedContainers(this.transport)
83
+ const result: Record<number, Record<string, unknown>[]> = {}
84
+ for (const grouper of merged.list_grouper_indexes())
85
+ {
86
+ this.assign_grouper_axle_outputs({
87
+ grouper,
88
+ grouped: merged.get_container_by_grouper_index(grouper),
89
+ weight_on_axles,
90
+ result
91
+ })
92
+ }
93
+ return result
94
+ }
95
+
96
+ private assign_grouper_axle_outputs(input: {
97
+ grouper: number
98
+ grouped: import('../transports/grouped_containers.js').GroupedContainers
99
+ weight_on_axles: number[]
100
+ result: Record<number, Record<string, unknown>[]>
101
+ }): void
102
+ {
103
+ const sequences = input.grouped.list_containers_sequence_indexes()
104
+ const axles = select_axles_for_grouper(this.transport, input.grouper)
105
+ input.result[sequences[0]] = build_axle_weights_output({
106
+ transport: this.transport,
107
+ chassi: this.chassi,
108
+ axles_indexes: axles,
109
+ weight_on_axles: input.weight_on_axles
110
+ })
111
+ for (let index = 1; index < sequences.length; index++)
112
+ {
113
+ input.result[sequences[index]] = []
114
+ }
115
+ }
116
+ }
@@ -0,0 +1,45 @@
1
+ import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
2
+ import type { TransportRecord } from '../../contracts/transport_record.js'
3
+ import { CenterOfMass } from '../items/center_of_mass.js'
4
+ import { AxleWeightModel } from '../models/axle_weight_model.js'
5
+
6
+ /**
7
+ * Center-of-mass-driven axle weight service (port of CMAxleWeightService).
8
+ */
9
+ export class CmAxleWeightService
10
+ {
11
+ /**
12
+ * @param cm_axle_weight_data - Transport dict with center_of_mass map.
13
+ * @returns Loaded cargo weight per axle.
14
+ */
15
+ calculate(cm_axle_weight_data: TransportRecord): number[]
16
+ {
17
+ const model = new AxleWeightModel(cm_axle_weight_data)
18
+ const center_of_mass_by_grouper = read_center_of_mass_map(
19
+ cm_axle_weight_data[WIRE_FLAGS.CM_SERVICE_CENTER_OF_MASS] as Record<string, unknown>)
20
+ const chassi_forces = model.calculate_chassi_forces_with_load_center_of_mass(
21
+ center_of_mass_by_grouper)
22
+ return chassi_forces.list_axles_indexes().map(
23
+ (index) => chassi_forces.get_force_on_axle(index))
24
+ }
25
+ }
26
+
27
+ /**
28
+ * @param cm_data - Wire center_of_mass map.
29
+ * @returns Grouper id to CenterOfMass.
30
+ */
31
+ function read_center_of_mass_map(
32
+ cm_data: Record<string, unknown>
33
+ ): Record<number, CenterOfMass>
34
+ {
35
+ const result: Record<number, CenterOfMass> = {}
36
+ for (const grouper_key of Object.keys(cm_data))
37
+ {
38
+ const entry = cm_data[grouper_key] as Record<string, unknown>
39
+ const center_of_mass = new CenterOfMass()
40
+ center_of_mass.mass = Number(entry[WIRE_FLAGS.CM_SERVICE_MASS])
41
+ center_of_mass.z = Number(entry[WIRE_FLAGS.CM_SERVICE_Z])
42
+ result[Number(grouper_key)] = center_of_mass
43
+ }
44
+ return result
45
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Container corner force distribution (ISSUE-349).
3
+ */
4
+ export class ContainerCornerForces
5
+ {
6
+ private readonly x_box_center: number[] = []
7
+ private readonly z_box_center: number[] = []
8
+ private readonly y_box_center: number[] = []
9
+ private readonly weight_box: number[] = []
10
+ private total_mass = 0
11
+ private x_cm = 0
12
+ private y_cm = 0
13
+ private z_cm = 0
14
+ private force_on_door: number | null = null
15
+ private force_on_right_corner_door = 0
16
+ private force_on_left_corner_door = 0
17
+ private force_on_end_wall = 0
18
+ private force_on_right_corner_end_wall = 0
19
+ private force_on_left_corner_end_wall = 0
20
+
21
+ /**
22
+ * @param input_data - Items and container dimensions.
23
+ */
24
+ constructor(private readonly input_data: Record<string, unknown>)
25
+ {
26
+ const items = input_data.items as Record<string, unknown>[]
27
+ for (const item of items)
28
+ {
29
+ this.x_box_center.push(Number(item.x) + 0.5 * Number(item.width))
30
+ this.z_box_center.push(Number(item.z) + 0.5 * Number(item.length))
31
+ this.y_box_center.push(Number(item.y) + 0.5 * Number(item.height))
32
+ this.weight_box.push(Number(item.weight))
33
+ }
34
+ this.total_mass = this.weight_box.reduce((sum, weight) => sum + weight, 0)
35
+ }
36
+
37
+ /** Computes center of gravity from item boxes. */
38
+ calculate_cm(): void
39
+ {
40
+ this.x_cm = dot(this.x_box_center, this.weight_box) / this.total_mass
41
+ this.z_cm = dot(this.z_box_center, this.weight_box) / this.total_mass
42
+ this.y_cm = dot(this.y_box_center, this.weight_box) / this.total_mass
43
+ }
44
+
45
+ /** Computes corner reaction forces including container tare split. */
46
+ calculate_corner_forces(): void
47
+ {
48
+ const container = this.input_data.container as Record<string, unknown>
49
+ const container_length = Number(container.length)
50
+ const container_width = Number(container.width)
51
+ this.force_on_door = (this.z_cm * this.total_mass) / container_length
52
+ this.force_on_right_corner_door = (this.x_cm * this.force_on_door) / container_width
53
+ this.force_on_left_corner_door = this.force_on_door - this.force_on_right_corner_door
54
+ this.force_on_end_wall = this.total_mass - this.force_on_door
55
+ this.force_on_right_corner_end_wall = (this.x_cm * this.force_on_end_wall) / container_width
56
+ this.force_on_left_corner_end_wall = this.force_on_end_wall - this.force_on_right_corner_end_wall
57
+ const tare_quarter = 0.25 * Number(container.tare)
58
+ this.force_on_right_corner_door += tare_quarter
59
+ this.force_on_left_corner_door += tare_quarter
60
+ this.force_on_right_corner_end_wall += tare_quarter
61
+ this.force_on_left_corner_end_wall += tare_quarter
62
+ }
63
+
64
+ /**
65
+ * @returns Response JSON.
66
+ */
67
+ json(): Record<string, unknown>
68
+ {
69
+ const response: Record<string, unknown> = {
70
+ centerOfGravity: { x: this.x_cm, y: this.y_cm, z: this.z_cm }
71
+ }
72
+ if (this.force_on_door !== null)
73
+ {
74
+ response.corner_forces = {
75
+ force_on_door: this.force_on_door,
76
+ force_on_right_corner_door: this.force_on_right_corner_door,
77
+ force_on_left_corner_door: this.force_on_left_corner_door,
78
+ force_on_end_wall: this.force_on_end_wall,
79
+ force_on_right_corner_end_wall: this.force_on_right_corner_end_wall,
80
+ force_on_left_corner_end_wall: this.force_on_left_corner_end_wall
81
+ }
82
+ }
83
+ return response
84
+ }
85
+ }
86
+
87
+ /**
88
+ * @param values - Value list.
89
+ * @param weights - Weight list.
90
+ * @returns Weighted sum.
91
+ */
92
+ function dot(values: number[], weights: number[]): number
93
+ {
94
+ return values.reduce((sum, value, index) => sum + value * weights[index], 0)
95
+ }