@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,51 @@
1
+ import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
2
+ import type { Transport } from '../transports/transport.js'
3
+ import { scale_tare } from './old_tare_scale.js'
4
+
5
+ const TRUNCATED_LIMIT = 13000
6
+
7
+ /**
8
+ * @param transport - Parsed transport.
9
+ * @returns Semireboque tare per axle.
10
+ */
11
+ export function semireboque_tare(transport: Transport): number[]
12
+ {
13
+ const version = transport.vehicle_version
14
+ if (version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
15
+ || version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT)
16
+ {
17
+ return scale_tare(transport.tare, [0.27509640559, 0.29967158355, 0.11978366503, 0.30544834583])
18
+ }
19
+ if (version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK)
20
+ {
21
+ return scale_tare(transport.tare, [0.17852139406, 0.17852139406, 0.43218944824, 0.21076776365])
22
+ }
23
+ return semireboque_standard_tare(transport)
24
+ }
25
+
26
+ function semireboque_standard_tare(transport: Transport): number[]
27
+ {
28
+ const axle_1_max = transport.axle_manager.get_axle(1).max_supported_weight
29
+ if (axle_1_max > TRUNCATED_LIMIT)
30
+ {
31
+ return semireboque_heavy_axle_tare(transport.tare)
32
+ }
33
+ if (transport.tare < 18500)
34
+ {
35
+ return scale_tare(transport.tare, [0.312, 0.2, 0.488])
36
+ }
37
+ return scale_tare(transport.tare, [0.26, 0.35, 0.39])
38
+ }
39
+
40
+ function semireboque_heavy_axle_tare(tare: number): number[]
41
+ {
42
+ if (tare > 19000)
43
+ {
44
+ return scale_tare(tare, [0.24, 0.35, 0.41])
45
+ }
46
+ if (tare > 17000)
47
+ {
48
+ return scale_tare(tare, [0.3, 0.315, 0.385])
49
+ }
50
+ return scale_tare(tare, [0.286, 0.379, 0.335])
51
+ }
@@ -0,0 +1,15 @@
1
+ import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
2
+ import type { Transport } from '../transports/transport.js'
3
+ import { scale_tare } from './old_tare_scale.js'
4
+
5
+ /**
6
+ * @param transport - Truck or VUC transport.
7
+ * @returns Tare per axle.
8
+ */
9
+ export function truck_tare(transport: Transport): number[]
10
+ {
11
+ const multipliers = transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK
12
+ ? [0.2834844826865682, 0.28348448268656806, 0.43303103462686376]
13
+ : [0.452, 0.548]
14
+ return scale_tare(transport.tare, multipliers)
15
+ }
@@ -0,0 +1,44 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import { scale_tare } from './old_tare_scale.js'
3
+
4
+ const TRUNCATED_LIMIT = 13000
5
+
6
+ /**
7
+ * @param transport - Parsed transport.
8
+ * @returns Vanderleia tare per axle.
9
+ */
10
+ export function vanderleia_tare(transport: Transport): number[]
11
+ {
12
+ const axle_1_max = transport.axle_manager.get_axle(1).max_supported_weight
13
+ if (axle_1_max > TRUNCATED_LIMIT)
14
+ {
15
+ return vanderleia_heavy_axle_tare(transport.tare)
16
+ }
17
+ return vanderleia_light_axle_tare(transport.tare)
18
+ }
19
+
20
+ function vanderleia_heavy_axle_tare(tare: number): number[]
21
+ {
22
+ if (tare > 23500)
23
+ {
24
+ return scale_tare(tare, [0.22, 0.33, 0.155, 0.155, 0.14])
25
+ }
26
+ if (tare > 21000)
27
+ {
28
+ return scale_tare(tare, [0.25, 0.32, 0.145, 0.145, 0.14])
29
+ }
30
+ return scale_tare(tare, [0.267, 0.314, 0.141, 0.141, 0.137])
31
+ }
32
+
33
+ function vanderleia_light_axle_tare(tare: number): number[]
34
+ {
35
+ if (tare > 23500)
36
+ {
37
+ return scale_tare(tare, [0.22, 0.24, 0.185, 0.185, 0.17])
38
+ }
39
+ if (tare > 21000)
40
+ {
41
+ return scale_tare(tare, [0.25, 0.2, 0.185, 0.185, 0.18])
42
+ }
43
+ return scale_tare(tare, [0.267, 0.164, 0.191, 0.191, 0.187])
44
+ }
@@ -0,0 +1,49 @@
1
+ import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
2
+ import type { Transport } from '../transports/transport.js'
3
+
4
+ /**
5
+ * Converts loaded cargo per axle into utilization percentages.
6
+ */
7
+ export class PercentageOnAxlesCalculator
8
+ {
9
+ /**
10
+ * @param transport - Parsed transport.
11
+ */
12
+ constructor(private readonly transport: Transport)
13
+ {}
14
+
15
+ /**
16
+ * @param loaded_weight_list - Cargo load per axle index.
17
+ * @returns Utilization ratio per axle (bitrem: 4 entries).
18
+ */
19
+ weight_on_axles_to_percentages(loaded_weight_list: number[]): number[]
20
+ {
21
+ if (this.transport.vehicle_type === VEHICLE_TYPE.BITREM)
22
+ {
23
+ return [
24
+ this.calculate_percentage(0, loaded_weight_list[0]),
25
+ this.calculate_percentage(1, loaded_weight_list[1]),
26
+ this.calculate_bitrem_joined_percentage(
27
+ loaded_weight_list[2] + loaded_weight_list[3]),
28
+ this.calculate_percentage(4, loaded_weight_list[4])
29
+ ]
30
+ }
31
+ return this.transport.axle_manager.list_axles_indexes().map((index) =>
32
+ this.calculate_percentage(index, loaded_weight_list[index]))
33
+ }
34
+
35
+ private calculate_percentage(axle_index: number, loaded_weight: number): number
36
+ {
37
+ const axle = this.transport.axle_manager.get_axle(axle_index)
38
+ return (loaded_weight + axle.tare) / axle.max_supported_weight
39
+ }
40
+
41
+ private calculate_bitrem_joined_percentage(loaded_weight: number): number
42
+ {
43
+ const axle_2 = this.transport.axle_manager.get_axle(2)
44
+ const axle_3 = this.transport.axle_manager.get_axle(3)
45
+ const total_tare = axle_2.tare + axle_3.tare
46
+ const total_max = axle_2.max_supported_weight + axle_3.max_supported_weight
47
+ return (loaded_weight + total_tare) / total_max
48
+ }
49
+ }
@@ -0,0 +1,87 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import { Chassi } from '../transports/chassi.js'
3
+ import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
4
+ import { CenterOfMass } from '../items/center_of_mass.js'
5
+ import { ChassiForces } from './chassi_forces.js'
6
+ import { SemiReboqueBase } from './semi_reboque_base.js'
7
+ import { solve_linear_system } from '../../math/gaussian_elimination.js'
8
+
9
+ /**
10
+ * Quad-axle semi-trailer (equivalent semi + 2×2 split on axles 3–4).
11
+ */
12
+ export class QuadSemiTrailerModel
13
+ {
14
+ private readonly chassi: Chassi
15
+ readonly equivalent_semi_trailer: SemiReboqueBase
16
+
17
+ /**
18
+ * @param transport - Parsed transport.
19
+ */
20
+ constructor(transport: Transport)
21
+ {
22
+ this.chassi = new Chassi(transport)
23
+ this.equivalent_semi_trailer = new SemiReboqueBase(transport)
24
+ this.equivalent_semi_trailer.set_linear_system_matrix(
25
+ get_equivalent_chassi_positions(this.chassi, transport))
26
+ }
27
+
28
+ /**
29
+ * @param center_of_mass_by_grouper - CM per grouper.
30
+ * @returns Four-axle chassis forces.
31
+ */
32
+ calculate_chassi_forces_with_load_center_of_mass(
33
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
34
+ ): ChassiForces
35
+ {
36
+ const equivalent = this.equivalent_semi_trailer
37
+ .calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
38
+ const equivalent_z = this.equivalent_semi_trailer.chassi_positions[4]
39
+ const independent = [
40
+ equivalent.get_force_on_axle(2),
41
+ equivalent.get_force_on_axle(2) * equivalent_z
42
+ ]
43
+ const quad = solve_linear_system(generate_quad_matrix(this.chassi), independent)
44
+ const forces = new ChassiForces()
45
+ forces.add_axle_forces([
46
+ equivalent.get_force_on_axle(0),
47
+ equivalent.get_force_on_axle(1),
48
+ quad[0],
49
+ quad[1]
50
+ ])
51
+ forces.add_pin_forces([equivalent.get_force_on_pin(0)])
52
+ return forces
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @param chassi - Chassis geometry.
58
+ * @returns 2×2 quad axle matrix.
59
+ */
60
+ function generate_quad_matrix(chassi: Chassi): number[][]
61
+ {
62
+ const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
63
+ const semi_axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
64
+ return [[1, 1], [semi_axle_3, semi_axle_4]]
65
+ }
66
+
67
+ /**
68
+ * @param chassi - Chassis geometry.
69
+ * @param transport - Parsed transport.
70
+ * @returns Equivalent 5-position layout for semi base.
71
+ */
72
+ function get_equivalent_chassi_positions(chassi: Chassi, transport: Transport): number[]
73
+ {
74
+ const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
75
+ const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
76
+ const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
77
+ const semi_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
78
+ const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
79
+ const semi_axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
80
+ const axle_3 = transport.axle_manager.get_axle(2)
81
+ const axle_4 = transport.axle_manager.get_axle(3)
82
+ const semi_equivalent = (
83
+ semi_axle_3 * axle_3.max_supported_weight
84
+ + semi_axle_4 * axle_4.max_supported_weight
85
+ ) / (axle_3.max_supported_weight + axle_4.max_supported_weight)
86
+ return [tractor_pin, tractor_axle_1, tractor_axle_2, semi_pin, semi_equivalent]
87
+ }
@@ -0,0 +1,131 @@
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 { CenterOfMass } from '../items/center_of_mass.js'
7
+ import { ChassiForces } from './chassi_forces.js'
8
+ import { solve_linear_system } from '../../math/gaussian_elimination.js'
9
+
10
+ /**
11
+ * Rodotrem: semi+tractor 4×4 plus simple trailer 2-axle lever.
12
+ */
13
+ export class RodotremModel
14
+ {
15
+ readonly chassi: Chassi
16
+ private readonly matrix: number[][]
17
+
18
+ /**
19
+ * @param transport - Parsed transport.
20
+ */
21
+ constructor(private readonly transport: Transport)
22
+ {
23
+ this.chassi = new Chassi(transport)
24
+ this.matrix = generate_rodotrem_semi_matrix(this.chassi)
25
+ }
26
+
27
+ /**
28
+ * @param multi_items - Allocated items.
29
+ * @returns Loaded weights per axle.
30
+ */
31
+ calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
32
+ {
33
+ const forces = this.calculate_chassi_forces(multi_items)
34
+ return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
35
+ }
36
+
37
+ /**
38
+ * @param multi_items - Allocated items.
39
+ * @returns Chassis forces.
40
+ */
41
+ calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
42
+ {
43
+ return calculate_chassi_forces_from_multi(
44
+ this.transport,
45
+ multi_items,
46
+ (center_of_mass_by_grouper) =>
47
+ this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
48
+ }
49
+
50
+ /**
51
+ * @param center_of_mass_by_grouper - CM for groupers 1 and 2.
52
+ * @returns Five-axle chassis forces.
53
+ */
54
+ calculate_chassi_forces_with_load_center_of_mass(
55
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
56
+ ): ChassiForces
57
+ {
58
+ const semi_solution = solve_semi_tractor_system(
59
+ this.matrix,
60
+ center_of_mass_by_grouper[1])
61
+ const simple_solution = solve_simple_trailer_system(
62
+ this.chassi,
63
+ center_of_mass_by_grouper[2])
64
+ const forces = new ChassiForces()
65
+ forces.add_pin_forces([semi_solution[1]])
66
+ forces.add_axle_forces([
67
+ semi_solution[3],
68
+ semi_solution[2],
69
+ semi_solution[0],
70
+ simple_solution[1],
71
+ simple_solution[0]
72
+ ])
73
+ return forces
74
+ }
75
+ }
76
+
77
+ /**
78
+ * @param chassi - Chassis geometry.
79
+ * @returns Semi+tractor 4×4 matrix.
80
+ */
81
+ function generate_rodotrem_semi_matrix(chassi: Chassi): number[][]
82
+ {
83
+ const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
84
+ const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
85
+ const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
86
+ const semi_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
87
+ const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
88
+ return [
89
+ [1, 1, 0, 0],
90
+ [semi_axle_3, semi_pin, 0, 0],
91
+ [0, -1, 1, 1],
92
+ [0, -tractor_pin, tractor_axle_2, tractor_axle_1]
93
+ ]
94
+ }
95
+
96
+ /**
97
+ * @param matrix - Semi system matrix.
98
+ * @param center_of_mass - Semi trailer CM.
99
+ * @returns 4-vector solution.
100
+ */
101
+ function solve_semi_tractor_system(matrix: number[][], center_of_mass: CenterOfMass): number[]
102
+ {
103
+ const independent = [
104
+ center_of_mass.mass,
105
+ center_of_mass.mass * center_of_mass.z,
106
+ 0,
107
+ 0
108
+ ]
109
+ return solve_linear_system(matrix, independent)
110
+ }
111
+
112
+ /**
113
+ * @param chassi - Chassis geometry.
114
+ * @param center_of_mass - Simple trailer CM.
115
+ * @returns Two-axle lever solution [axle4, axle5].
116
+ */
117
+ function solve_simple_trailer_system(
118
+ chassi: Chassi,
119
+ center_of_mass: CenterOfMass
120
+ ): [number, number]
121
+ {
122
+ const axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_2)
123
+ const axle_5 = chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_2)
124
+ const axle_4_force = center_of_mass.mass
125
+ * (axle_4 - center_of_mass.z)
126
+ / (axle_4 - axle_5)
127
+ const axle_5_force = center_of_mass.mass
128
+ * (center_of_mass.z - axle_5)
129
+ / (axle_4 - axle_5)
130
+ return [axle_4_force, axle_5_force]
131
+ }
@@ -0,0 +1,103 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import { Chassi } from '../transports/chassi.js'
3
+ import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
4
+ import { CenterOfMass } from '../items/center_of_mass.js'
5
+ import { ChassiForces } from './chassi_forces.js'
6
+ import { solve_linear_system } from '../../math/gaussian_elimination.js'
7
+
8
+ /**
9
+ * Semi-trailer 4×4 static system base.
10
+ */
11
+ export class SemiReboqueBase
12
+ {
13
+ chassi_positions: number[] = []
14
+ private matrix: number[][] = []
15
+
16
+ /**
17
+ * @param transport - Parsed transport.
18
+ */
19
+ constructor(private readonly transport: Transport)
20
+ {
21
+ this.set_linear_system_matrix()
22
+ }
23
+
24
+ /**
25
+ * @param center_of_mass_by_grouper - CM per grouper.
26
+ * @returns Chassis forces.
27
+ */
28
+ calculate_chassi_forces_with_load_center_of_mass(
29
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
30
+ ): ChassiForces
31
+ {
32
+ const solution = this.solve_weight_on_axles_system(center_of_mass_by_grouper[1])
33
+ const forces = new ChassiForces()
34
+ forces.add_pin_forces([solution[1]])
35
+ forces.add_axle_forces([solution[3], solution[2], solution[0]])
36
+ return forces
37
+ }
38
+
39
+ /**
40
+ * @param chassi_positions - Optional preset positions.
41
+ */
42
+ set_linear_system_matrix(chassi_positions?: number[]): void
43
+ {
44
+ if (chassi_positions)
45
+ {
46
+ this.chassi_positions = chassi_positions
47
+ }
48
+ else
49
+ {
50
+ this.chassi_positions = this.get_chassi_positions()
51
+ }
52
+ this.matrix = build_semi_matrix(this.chassi_positions)
53
+ }
54
+
55
+ /**
56
+ * @param center_of_mass - Load CM.
57
+ * @returns 4-vector solution.
58
+ */
59
+ private solve_weight_on_axles_system(center_of_mass: CenterOfMass): number[]
60
+ {
61
+ const independent = [
62
+ center_of_mass.mass,
63
+ center_of_mass.mass * center_of_mass.z,
64
+ 0,
65
+ 0
66
+ ]
67
+ return solve_linear_system(this.matrix, independent)
68
+ }
69
+
70
+ /**
71
+ * @returns Default chassis positions for semi system.
72
+ */
73
+ private get_chassi_positions(): number[]
74
+ {
75
+ const chassi = new Chassi(this.transport)
76
+ return [
77
+ chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR),
78
+ chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR),
79
+ chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR),
80
+ chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1),
81
+ chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
82
+ ]
83
+ }
84
+ }
85
+
86
+ /**
87
+ * @param positions - Pin and axle positions.
88
+ * @returns 4×4 coefficient matrix.
89
+ */
90
+ function build_semi_matrix(positions: number[]): number[][]
91
+ {
92
+ const tractor_pin = positions[0]
93
+ const tractor_axle_1 = positions[1]
94
+ const tractor_axle_2 = positions[2]
95
+ const semi_pin = positions[3]
96
+ const semi_axle_3 = positions[4]
97
+ return [
98
+ [1, 1, 0, 0],
99
+ [semi_axle_3, semi_pin, 0, 0],
100
+ [0, -1, 1, 1],
101
+ [0, -tractor_pin, tractor_axle_2, tractor_axle_1]
102
+ ]
103
+ }
@@ -0,0 +1,127 @@
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 { SemiReboqueBase } from './semi_reboque_base.js'
12
+ import { QuadSemiTrailerModel } from './quad_semi_trailer_model.js'
13
+ import { BiTruckTractorSemiTrailerModel } from './bi_truck_tractor_semi_trailer_model.js'
14
+
15
+ type SemiDelegate = {
16
+ calculate_chassi_forces_with_load_center_of_mass: (
17
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
18
+ ) => ChassiForces
19
+ }
20
+
21
+ /**
22
+ * Semi-reboque axle weight with quad/bitruck variants.
23
+ */
24
+ export class SemiReboqueModel
25
+ {
26
+ private readonly delegate: SemiDelegate & {
27
+ chassi_positions?: number[]
28
+ equivalent_semi_trailer?: SemiReboqueBase
29
+ }
30
+ private readonly transport: Transport
31
+ private readonly merged_containers: MergedContainers
32
+
33
+ /**
34
+ * @param transport - Parsed transport.
35
+ */
36
+ constructor(transport: Transport)
37
+ {
38
+ this.transport = transport
39
+ this.merged_containers = new MergedContainers(transport)
40
+ if (transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
41
+ || transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT)
42
+ {
43
+ this.delegate = new QuadSemiTrailerModel(transport)
44
+ }
45
+ else if (transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK)
46
+ {
47
+ this.delegate = new BiTruckTractorSemiTrailerModel(transport)
48
+ }
49
+ else
50
+ {
51
+ const base = new SemiReboqueBase(transport)
52
+ base.set_linear_system_matrix()
53
+ this.delegate = base
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @param multi_items - Allocated items.
59
+ * @returns Loaded weights per axle.
60
+ */
61
+ calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
62
+ {
63
+ const forces = this.calculate_chassi_forces(multi_items)
64
+ return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
65
+ }
66
+
67
+ /**
68
+ * @param multi_items - Allocated items.
69
+ * @returns Chassis forces.
70
+ */
71
+ calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
72
+ {
73
+ return calculate_chassi_forces_from_multi(
74
+ this.transport,
75
+ multi_items,
76
+ (center_of_mass_by_grouper) =>
77
+ this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
78
+ }
79
+
80
+ /**
81
+ * @param multi_items - Allocated items.
82
+ * @returns Deflection support pairs.
83
+ */
84
+ calculate_support_data(multi_items: MultiContainerAllocatedItems): [number, number][]
85
+ {
86
+ const quad_or_bitruck = this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
87
+ || this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT
88
+ || this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK
89
+ if (quad_or_bitruck)
90
+ {
91
+ const center_of_mass_by_grouper = compute_center_of_mass_by_grouper(
92
+ multi_items,
93
+ this.merged_containers)
94
+ const quad = this.delegate as QuadSemiTrailerModel
95
+ const forces = quad.equivalent_semi_trailer
96
+ .calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
97
+ const positions = quad.equivalent_semi_trailer.chassi_positions
98
+ return [[positions[3], forces.get_force_on_pin(0)], [positions[4], forces.get_force_on_axle(2)]]
99
+ }
100
+ const forces = this.calculate_chassi_forces(multi_items)
101
+ const base = this.delegate as SemiReboqueBase
102
+ return [
103
+ [base.chassi_positions[3], forces.get_force_on_pin(0)],
104
+ [base.chassi_positions[4], forces.get_force_on_axle(2)]
105
+ ]
106
+ }
107
+
108
+ /**
109
+ * @returns Merged grouper 1 length.
110
+ */
111
+ calculate_container_length(): number
112
+ {
113
+ return this.merged_containers.get_container_by_grouper_index(1).length
114
+ }
115
+
116
+ /**
117
+ * @param center_of_mass_by_grouper - CM per grouper.
118
+ * @returns Chassis forces.
119
+ */
120
+ calculate_chassi_forces_with_load_center_of_mass(
121
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
122
+ ): ChassiForces
123
+ {
124
+ return this.delegate.calculate_chassi_forces_with_load_center_of_mass(
125
+ center_of_mass_by_grouper)
126
+ }
127
+ }
@@ -0,0 +1,70 @@
1
+ import type { Transport } from '../transports/transport.js'
2
+ import { Chassi } from '../transports/chassi.js'
3
+ import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
4
+ import { CenterOfMass } from '../items/center_of_mass.js'
5
+ import { ChassiForces } from './chassi_forces.js'
6
+
7
+ /**
8
+ * Two-axle truck lever equilibrium.
9
+ */
10
+ export class SimpleTruckBase
11
+ {
12
+ axles_positions: number[] = []
13
+
14
+ /**
15
+ * @param transport - Parsed transport.
16
+ */
17
+ constructor(private readonly transport: Transport)
18
+ {
19
+ this.set_axles_positions()
20
+ }
21
+
22
+ /**
23
+ * @param center_of_mass_by_grouper - CM per grouper id.
24
+ * @returns Chassis forces.
25
+ */
26
+ calculate_chassi_forces_with_load_center_of_mass(
27
+ center_of_mass_by_grouper: Record<number, CenterOfMass>
28
+ ): ChassiForces
29
+ {
30
+ const center_of_mass = center_of_mass_by_grouper[1]
31
+ const [axle_1, axle_2] = this.solve_linear_system(center_of_mass)
32
+ const forces = new ChassiForces()
33
+ forces.add_axle_forces([axle_1, axle_2])
34
+ return forces
35
+ }
36
+
37
+ /**
38
+ * @param axles_positions - Optional preset positions.
39
+ */
40
+ set_axles_positions(axles_positions?: number[]): void
41
+ {
42
+ if (axles_positions)
43
+ {
44
+ this.axles_positions = axles_positions
45
+ return
46
+ }
47
+ const chassi = new Chassi(this.transport)
48
+ this.axles_positions = [
49
+ chassi.get_axle_position(0, CHASSI_REFERENCE.GROUPER_1),
50
+ chassi.get_axle_position(1, CHASSI_REFERENCE.GROUPER_1)
51
+ ]
52
+ }
53
+
54
+ /**
55
+ * @param center_of_mass - Load center of mass.
56
+ * @returns Axle 1 and 2 cargo reactions.
57
+ */
58
+ private solve_linear_system(center_of_mass: CenterOfMass): [number, number]
59
+ {
60
+ const axle_1_position = this.axles_positions[0]
61
+ const axle_2_position = this.axles_positions[1]
62
+ const axle_1 = center_of_mass.mass
63
+ * (center_of_mass.z - axle_2_position)
64
+ / (axle_1_position - axle_2_position)
65
+ const axle_2 = center_of_mass.mass
66
+ * (axle_1_position - center_of_mass.z)
67
+ / (axle_1_position - axle_2_position)
68
+ return [axle_1, axle_2]
69
+ }
70
+ }