@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,105 @@
1
+ import type { AllocatedItemManager } from '../../items/allocated_item_manager.js'
2
+ import { DeflectionSupportManager } from './deflection_support_manager.js'
3
+ import { IntegrationConstantCalculator } from './integration_constant_calculator.js'
4
+
5
+ /**
6
+ * Cantilever beam deflection curve (DRAGON-76).
7
+ */
8
+ export class BeamDeflection
9
+ {
10
+ private readonly support_manager: DeflectionSupportManager
11
+ private readonly constant_1: number
12
+ private readonly constant_2: number
13
+ private readonly external_forces: [number, number][]
14
+
15
+ /**
16
+ * @param support_data - Support positions and forces.
17
+ * @param allocated_item_manager - Load items.
18
+ * @param external_forces - Optional external point loads.
19
+ */
20
+ constructor(
21
+ support_data: [number, number][],
22
+ private readonly allocated_item_manager: AllocatedItemManager,
23
+ external_forces: [number, number][] = []
24
+ )
25
+ {
26
+ this.support_manager = new DeflectionSupportManager(support_data)
27
+ this.external_forces = this.support_manager
28
+ .add_structural_offset_to_external_forces(external_forces)
29
+ const integration = new IntegrationConstantCalculator(
30
+ this.support_manager,
31
+ this.support_manager.structural_offset)
32
+ ;[this.constant_1, this.constant_2] = integration.calculate_integration_constants(
33
+ allocated_item_manager)
34
+ }
35
+
36
+ /**
37
+ * @param beam_length - Container beam length.
38
+ * @param number_of_curve_samples - Sample count.
39
+ * @returns Deflection values along beam.
40
+ */
41
+ generate_curve_values(beam_length: number, number_of_curve_samples: number): number[]
42
+ {
43
+ const length = beam_length + this.support_manager.structural_offset
44
+ const y_values: number[] = []
45
+ for (let index = 0; index < number_of_curve_samples; index++)
46
+ {
47
+ const x = (length * index) / (number_of_curve_samples - 1)
48
+ y_values.push(this.evaluate_at_x(x))
49
+ }
50
+ return y_values
51
+ }
52
+
53
+ private evaluate_at_x(x: number): number
54
+ {
55
+ let value = this.constant_1 * x + this.constant_2
56
+ value += this.item_cubic_contribution(x)
57
+ value += this.support_cubic_contribution(x)
58
+ value += this.external_cubic_contribution(x)
59
+ return value
60
+ }
61
+
62
+ private item_cubic_contribution(x: number): number
63
+ {
64
+ let value = 0
65
+ for (const item_index of this.allocated_item_manager.list_item_indexes())
66
+ {
67
+ const item = this.allocated_item_manager.get_item(item_index)
68
+ const position = item.zi + item.length / 2 + this.support_manager.structural_offset
69
+ const displacement = x - position
70
+ if (displacement > 0)
71
+ {
72
+ value += (-item.weight / 6) * displacement ** 3
73
+ }
74
+ }
75
+ return value
76
+ }
77
+
78
+ private support_cubic_contribution(x: number): number
79
+ {
80
+ let value = 0
81
+ for (const support_index of this.support_manager.list_support_indexes())
82
+ {
83
+ const displacement = x - this.support_manager.get_position(support_index)
84
+ if (displacement > 0)
85
+ {
86
+ value += (this.support_manager.get_force(support_index) / 6) * displacement ** 3
87
+ }
88
+ }
89
+ return value
90
+ }
91
+
92
+ private external_cubic_contribution(x: number): number
93
+ {
94
+ let value = 0
95
+ for (const [position, force] of this.external_forces)
96
+ {
97
+ const displacement = x - position
98
+ if (displacement > 0)
99
+ {
100
+ value += (force / 6) * displacement ** 3
101
+ }
102
+ }
103
+ return value
104
+ }
105
+ }
@@ -0,0 +1,68 @@
1
+ import { CHASSI_REFERENCE } from '../../../contracts/chassi_reference.js'
2
+ import type { BitremModel } from '../bitrem_model.js'
3
+ import type { ChassiForces } from '../chassi_forces.js'
4
+ import type { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
5
+ import { BeamDeflection } from './beam_deflection.js'
6
+ import { calculate_deflection_indicator } from './deflection_tools.js'
7
+
8
+ /**
9
+ * Bitrem interlink + semi beam deflection (sum of two indicators).
10
+ */
11
+ export class BitremDeflection
12
+ {
13
+ /**
14
+ * @param bitrem_model - Axle weight model.
15
+ * @param number_of_curve_samples - Curve sample count.
16
+ */
17
+ constructor(
18
+ private readonly bitrem_model: BitremModel,
19
+ private readonly number_of_curve_samples: number
20
+ )
21
+ {}
22
+
23
+ /**
24
+ * @param multi_items - Allocated items.
25
+ * @returns Combined deflection indicator.
26
+ */
27
+ calculate_deflection(multi_items: MultiContainerAllocatedItems): number
28
+ {
29
+ const forces = this.bitrem_model.calculate_chassi_forces(multi_items)
30
+ const interlink = this.interlink_curve(multi_items, forces)
31
+ const semi = this.semitrailer_curve(multi_items, forces)
32
+ return calculate_deflection_indicator(interlink)
33
+ + calculate_deflection_indicator(semi)
34
+ }
35
+
36
+ private interlink_curve(multi_items: MultiContainerAllocatedItems, forces: ChassiForces): number[]
37
+ {
38
+ const pin_1 = this.bitrem_model.chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
39
+ const axle_3 = this.bitrem_model.chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
40
+ const support: [number, number][] = [
41
+ [pin_1, forces.get_force_on_pin(0)],
42
+ [axle_3, forces.get_force_on_axle(2) + forces.get_force_on_axle(3)]
43
+ ]
44
+ const pin_2 = this.bitrem_model.chassi.get_pin_position(1, CHASSI_REFERENCE.GROUPER_1)
45
+ const external: [number, number][] = [[pin_2, -forces.get_force_on_pin(1)]]
46
+ const items = multi_items.get_allocated_items_by_grouper_index(1)
47
+ const pin_2_pos = pin_2
48
+ const length = Math.max(pin_2_pos, axle_3)
49
+ return new BeamDeflection(support, items, external).generate_curve_values(
50
+ length,
51
+ this.number_of_curve_samples)
52
+ }
53
+
54
+ private semitrailer_curve(multi_items: MultiContainerAllocatedItems, forces: ChassiForces): number[]
55
+ {
56
+ const pin_2 = this.bitrem_model.chassi.get_pin_position(1, CHASSI_REFERENCE.GROUPER_2)
57
+ const axle_4 = this.bitrem_model.chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_2)
58
+ const support: [number, number][] = [
59
+ [pin_2, forces.get_force_on_pin(1)],
60
+ [axle_4, forces.get_force_on_axle(4)]
61
+ ]
62
+ const items = multi_items.get_allocated_items_by_grouper_index(2)
63
+ const length = this.bitrem_model.chassi.get_grouper_end(2, CHASSI_REFERENCE.GROUPER_2)
64
+ return new BeamDeflection(support, items).generate_curve_values(
65
+ length,
66
+ this.number_of_curve_samples)
67
+ }
68
+ }
@@ -0,0 +1,46 @@
1
+ import { VEHICLE_TYPE, type VehicleTypeCode } from '../../../contracts/vehicle_type.js'
2
+ import type { Transport } from '../../transports/transport.js'
3
+ import { SemiReboqueModel } from '../semi_reboque_model.js'
4
+ import { BitremModel } from '../bitrem_model.js'
5
+ import { RodotremModel } from '../rodotrem_model.js'
6
+ import { VanderleiaModel } from '../vanderleia_model.js'
7
+ import { SimpleTruckModel } from '../simple_truck_model.js'
8
+ import { SemiReboqueDeflection } from './semi_reboque_deflection.js'
9
+ import { BitremDeflection } from './bitrem_deflection.js'
10
+ import { RodotremDeflection } from './rodotrem_deflection.js'
11
+ import { VanderleiaDeflection } from './vanderleia_deflection.js'
12
+ import { SimpleTruckDeflection } from './simple_truck_deflection.js'
13
+
14
+ type DeflectionDelegate = {
15
+ calculate_deflection: (multi: import('../../items/multi_container_allocated_items.js').MultiContainerAllocatedItems) => number
16
+ }
17
+
18
+ type DelegateFactory = (transport: Transport, samples: number) => DeflectionDelegate
19
+
20
+ const DELEGATE_BY_TYPE: Partial<Record<VehicleTypeCode, DelegateFactory>> = {
21
+ [VEHICLE_TYPE.SEMIREBOQUE]: (t, n) => new SemiReboqueDeflection(new SemiReboqueModel(t), n),
22
+ [VEHICLE_TYPE.REBAIXADO]: (t, n) => new SemiReboqueDeflection(new SemiReboqueModel(t), n),
23
+ [VEHICLE_TYPE.BITREM]: (t, n) => new BitremDeflection(new BitremModel(t), n),
24
+ [VEHICLE_TYPE.RODOTREM]: (t, n) => new RodotremDeflection(new RodotremModel(t), n),
25
+ [VEHICLE_TYPE.VANDERLEIA]: (t, n) => new VanderleiaDeflection(new VanderleiaModel(t), n),
26
+ [VEHICLE_TYPE.CAMINHAO]: (t, n) => new SimpleTruckDeflection(new SimpleTruckModel(t), n),
27
+ [VEHICLE_TYPE.VUC]: (t, n) => new SimpleTruckDeflection(new SimpleTruckModel(t), n)
28
+ }
29
+
30
+ /**
31
+ * @param transport - Parsed transport.
32
+ * @param number_of_curve_samples - Sample count for deflection curve.
33
+ * @returns Vehicle-specific deflection delegate.
34
+ */
35
+ export function create_deflection_delegate(
36
+ transport: Transport,
37
+ number_of_curve_samples: number
38
+ ): DeflectionDelegate
39
+ {
40
+ const factory = DELEGATE_BY_TYPE[transport.vehicle_type]
41
+ if (!factory)
42
+ {
43
+ throw new Error('Deflection model of this vehicle is not implemented yet')
44
+ }
45
+ return factory(transport, number_of_curve_samples)
46
+ }
@@ -0,0 +1,33 @@
1
+ import type { Transport } from '../../transports/transport.js'
2
+ import type { AllocatedItemManager } from '../../items/allocated_item_manager.js'
3
+ import { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
4
+ import { create_deflection_delegate } from './create_deflection_delegate.js'
5
+
6
+ type DeflectionDelegate = ReturnType<typeof create_deflection_delegate>
7
+
8
+ /**
9
+ * Vehicle-specific beam deflection facade (DRAGON-76).
10
+ */
11
+ export class DeflectionModel
12
+ {
13
+ private readonly delegate: DeflectionDelegate
14
+
15
+ /**
16
+ * @param transport - Parsed transport.
17
+ * @param number_of_curve_samples - Curve sample count.
18
+ */
19
+ constructor(transport: Transport, number_of_curve_samples: number)
20
+ {
21
+ this.delegate = create_deflection_delegate(transport, number_of_curve_samples)
22
+ }
23
+
24
+ /**
25
+ * @param allocated_by_sequence - Items per container sequence.
26
+ * @returns Deflection indicator.
27
+ */
28
+ calculate_deflection(allocated_by_sequence: Record<number, AllocatedItemManager>): number
29
+ {
30
+ const multi = new MultiContainerAllocatedItems(allocated_by_sequence)
31
+ return this.delegate.calculate_deflection(multi)
32
+ }
33
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Ordered support positions and reaction forces for beam deflection.
3
+ */
4
+ export class DeflectionSupportManager
5
+ {
6
+ structural_offset = 0
7
+ private readonly support_data: [number, number][]
8
+
9
+ /**
10
+ * @param support_data - [[position, force], ...] sorted by position.
11
+ */
12
+ constructor(support_data: [number, number][])
13
+ {
14
+ this.support_data = support_data.map((row) => [...row] as [number, number])
15
+ this.evaluate_structural_offset()
16
+ }
17
+
18
+ list_support_indexes(): number[]
19
+ {
20
+ return this.support_data.map((_row, index) => index)
21
+ }
22
+
23
+ get_position(support_index: number): number
24
+ {
25
+ return this.support_data[support_index][0]
26
+ }
27
+
28
+ get_force(support_index: number): number
29
+ {
30
+ return this.support_data[support_index][1]
31
+ }
32
+
33
+ /**
34
+ * @param external_forces - Optional extra point loads.
35
+ * @returns Forces with structural offset applied to positions.
36
+ */
37
+ add_structural_offset_to_external_forces(
38
+ external_forces: [number, number][]
39
+ ): [number, number][]
40
+ {
41
+ return external_forces.map(([position, force]) => [
42
+ position + this.structural_offset,
43
+ force
44
+ ])
45
+ }
46
+
47
+ private evaluate_structural_offset(): void
48
+ {
49
+ const leftmost = Math.min(...this.support_data.map((row) => row[0]))
50
+ this.structural_offset = leftmost < 0 ? -leftmost : 0
51
+ for (const row of this.support_data)
52
+ {
53
+ row[0] += this.structural_offset
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @param curve_values - Beam deflection samples.
3
+ * @returns Scalar deflection indicator.
4
+ */
5
+ export function calculate_deflection_indicator(curve_values: number[]): number
6
+ {
7
+ const mean = curve_values.reduce((sum, value) => sum + value, 0) / curve_values.length
8
+ const variance = curve_values.reduce((sum, value) => sum + (value - mean) ** 2, 0)
9
+ / curve_values.length
10
+ return Math.sqrt(variance) + Math.abs(mean)
11
+ }
@@ -0,0 +1,62 @@
1
+ import type { AllocatedItemManager } from '../../items/allocated_item_manager.js'
2
+ import { solve_linear_system } from '../../../math/gaussian_elimination.js'
3
+ import type { DeflectionSupportManager } from './deflection_support_manager.js'
4
+
5
+ /**
6
+ * Integration constants for beam elastic curve (two supports).
7
+ */
8
+ export class IntegrationConstantCalculator
9
+ {
10
+ private readonly b_constants: number[]
11
+
12
+ /**
13
+ * @param deflection_supports - Support manager.
14
+ * @param structural_offset - Beam offset.
15
+ */
16
+ constructor(
17
+ private readonly deflection_supports: DeflectionSupportManager,
18
+ private readonly structural_offset: number
19
+ )
20
+ {
21
+ this.b_constants = deflection_supports.list_support_indexes().map(() => 0)
22
+ }
23
+
24
+ /**
25
+ * @param allocated_items - Load items.
26
+ * @returns Integration constants C1 and C2.
27
+ */
28
+ calculate_integration_constants(
29
+ allocated_items: AllocatedItemManager
30
+ ): [number, number]
31
+ {
32
+ this.calculate_b_constants(allocated_items)
33
+ const a_matrix = this.deflection_supports.list_support_indexes().map((index) => [
34
+ this.deflection_supports.get_position(index),
35
+ 1
36
+ ])
37
+ const displacement = this.deflection_supports.get_position(1)
38
+ - this.deflection_supports.get_position(0)
39
+ const second_term = (-this.deflection_supports.get_force(0) / 6)
40
+ * displacement * displacement * displacement
41
+ const solution = solve_linear_system(a_matrix, [this.b_constants[0], this.b_constants[1] + second_term])
42
+ return [solution[0], solution[1]]
43
+ }
44
+
45
+ private calculate_b_constants(allocated_items: AllocatedItemManager): void
46
+ {
47
+ for (const item_index of allocated_items.list_item_indexes())
48
+ {
49
+ const item = allocated_items.get_item(item_index)
50
+ const center = item.zi + item.length / 2 + this.structural_offset
51
+ const factor = item.weight / 6
52
+ for (const support_index of this.deflection_supports.list_support_indexes())
53
+ {
54
+ const displacement = this.deflection_supports.get_position(support_index) - center
55
+ if (displacement > 0)
56
+ {
57
+ this.b_constants[support_index] += factor * displacement ** 3
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,57 @@
1
+ import { CHASSI_REFERENCE } from '../../../contracts/chassi_reference.js'
2
+ import type { RodotremModel } from '../rodotrem_model.js'
3
+ import type { ChassiForces } from '../chassi_forces.js'
4
+ import type { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
5
+ import { BeamDeflection } from './beam_deflection.js'
6
+ import { calculate_deflection_indicator } from './deflection_tools.js'
7
+
8
+ /**
9
+ * Rodotrem semi + simple trailer deflection indicator sum.
10
+ */
11
+ export class RodotremDeflection
12
+ {
13
+ /**
14
+ * @param rodotrem_model - Axle weight model.
15
+ * @param number_of_curve_samples - Curve sample count.
16
+ */
17
+ constructor(
18
+ private readonly rodotrem_model: RodotremModel,
19
+ private readonly number_of_curve_samples: number
20
+ )
21
+ {}
22
+
23
+ /**
24
+ * @param multi_items - Allocated items.
25
+ * @returns Combined deflection indicator.
26
+ */
27
+ calculate_deflection(multi_items: MultiContainerAllocatedItems): number
28
+ {
29
+ const forces = this.rodotrem_model.calculate_chassi_forces(multi_items)
30
+ const semi = this.semi_curve(multi_items, forces)
31
+ const simple = this.simple_curve(multi_items, forces)
32
+ return calculate_deflection_indicator(semi) + calculate_deflection_indicator(simple)
33
+ }
34
+
35
+ private semi_curve(multi_items: MultiContainerAllocatedItems, forces: ChassiForces): number[]
36
+ {
37
+ const pin = this.rodotrem_model.chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
38
+ const axle_3 = this.rodotrem_model.chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
39
+ const support: [number, number][] = [[pin, forces.get_force_on_pin(0)], [axle_3, forces.get_force_on_axle(2)]]
40
+ const items = multi_items.get_allocated_items_by_grouper_index(1)
41
+ const length = this.rodotrem_model.chassi.get_grouper_end(1, CHASSI_REFERENCE.GROUPER_1)
42
+ return new BeamDeflection(support, items).generate_curve_values(length, this.number_of_curve_samples)
43
+ }
44
+
45
+ private simple_curve(multi_items: MultiContainerAllocatedItems, forces: ChassiForces): number[]
46
+ {
47
+ const axle_4 = this.rodotrem_model.chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_2)
48
+ const axle_5 = this.rodotrem_model.chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_2)
49
+ const support: [number, number][] = [
50
+ [axle_4, forces.get_force_on_axle(3)],
51
+ [axle_5, forces.get_force_on_axle(4)]
52
+ ]
53
+ const items = multi_items.get_allocated_items_by_grouper_index(2)
54
+ const length = this.rodotrem_model.chassi.get_grouper_end(2, CHASSI_REFERENCE.GROUPER_2)
55
+ return new BeamDeflection(support, items).generate_curve_values(length, this.number_of_curve_samples)
56
+ }
57
+ }
@@ -0,0 +1,40 @@
1
+ import type { SemiReboqueModel } from '../semi_reboque_model.js'
2
+ import type { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
3
+ import { BeamDeflection } from './beam_deflection.js'
4
+ import { calculate_deflection_indicator } from './deflection_tools.js'
5
+
6
+ /**
7
+ * Semi-reboque beam deflection indicator.
8
+ */
9
+ export class SemiReboqueDeflection
10
+ {
11
+ /**
12
+ * @param semi_reboque_model - Axle weight model.
13
+ * @param number_of_curve_samples - Curve sample count.
14
+ */
15
+ constructor(
16
+ private readonly semi_reboque_model: SemiReboqueModel,
17
+ private readonly number_of_curve_samples: number
18
+ )
19
+ {}
20
+
21
+ /**
22
+ * @param multi_items - Allocated items.
23
+ * @returns Deflection indicator scalar.
24
+ */
25
+ calculate_deflection(multi_items: MultiContainerAllocatedItems): number
26
+ {
27
+ const curve = this.calculate_deflection_curve(multi_items)
28
+ return calculate_deflection_indicator(curve)
29
+ }
30
+
31
+ private calculate_deflection_curve(multi_items: MultiContainerAllocatedItems): number[]
32
+ {
33
+ const support = this.semi_reboque_model.calculate_support_data(multi_items)
34
+ const allocated = multi_items.get_allocated_items_by_grouper_index(1)
35
+ const beam = new BeamDeflection(support, allocated)
36
+ return beam.generate_curve_values(
37
+ this.semi_reboque_model.calculate_container_length(),
38
+ this.number_of_curve_samples)
39
+ }
40
+ }
@@ -0,0 +1,35 @@
1
+ import type { SimpleTruckModel } from '../simple_truck_model.js'
2
+ import type { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
3
+ import { BeamDeflection } from './beam_deflection.js'
4
+ import { calculate_deflection_indicator } from './deflection_tools.js'
5
+
6
+ /**
7
+ * Caminhão beam deflection indicator.
8
+ */
9
+ export class SimpleTruckDeflection
10
+ {
11
+ /**
12
+ * @param simple_truck_model - Axle weight model.
13
+ * @param number_of_curve_samples - Curve sample count.
14
+ */
15
+ constructor(
16
+ private readonly simple_truck_model: SimpleTruckModel,
17
+ private readonly number_of_curve_samples: number
18
+ )
19
+ {}
20
+
21
+ /**
22
+ * @param multi_items - Allocated items.
23
+ * @returns Deflection indicator scalar.
24
+ */
25
+ calculate_deflection(multi_items: MultiContainerAllocatedItems): number
26
+ {
27
+ const support = this.simple_truck_model.calculate_support_data(multi_items)
28
+ const allocated = multi_items.get_allocated_items_by_grouper_index(1)
29
+ const beam = new BeamDeflection(support, allocated)
30
+ const curve = beam.generate_curve_values(
31
+ this.simple_truck_model.calculate_container_length(),
32
+ this.number_of_curve_samples)
33
+ return calculate_deflection_indicator(curve)
34
+ }
35
+ }
@@ -0,0 +1,48 @@
1
+ import { CHASSI_REFERENCE } from '../../../contracts/chassi_reference.js'
2
+ import type { VanderleiaModel } from '../vanderleia_model.js'
3
+ import type { MultiContainerAllocatedItems } from '../../items/multi_container_allocated_items.js'
4
+ import { BeamDeflection } from './beam_deflection.js'
5
+ import { calculate_deflection_indicator } from './deflection_tools.js'
6
+
7
+ /**
8
+ * Vanderleia trailer beam deflection indicator.
9
+ */
10
+ export class VanderleiaDeflection
11
+ {
12
+ /**
13
+ * @param vanderleia_model - Axle weight model.
14
+ * @param number_of_curve_samples - Curve sample count.
15
+ */
16
+ constructor(
17
+ private readonly vanderleia_model: VanderleiaModel,
18
+ private readonly number_of_curve_samples: number
19
+ )
20
+ {}
21
+
22
+ /**
23
+ * @param multi_items - Allocated items.
24
+ * @returns Deflection indicator scalar.
25
+ */
26
+ calculate_deflection(multi_items: MultiContainerAllocatedItems): number
27
+ {
28
+ const support = this.generate_support_data(multi_items)
29
+ const allocated = multi_items.get_allocated_items_by_grouper_index(1)
30
+ const beam = new BeamDeflection(support, allocated)
31
+ const length = this.vanderleia_model.chassi.get_grouper_end(1, CHASSI_REFERENCE.GROUPER_1)
32
+ const curve = beam.generate_curve_values(length, this.number_of_curve_samples)
33
+ return calculate_deflection_indicator(curve)
34
+ }
35
+
36
+ private generate_support_data(multi_items: MultiContainerAllocatedItems): [number, number][]
37
+ {
38
+ const forces = this.vanderleia_model.calculate_chassi_forces(multi_items)
39
+ const trailer_force = forces.get_force_on_axle(2)
40
+ + forces.get_force_on_axle(3)
41
+ + forces.get_force_on_axle(4)
42
+ const pin = this.vanderleia_model.chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
43
+ const axle_3 = this.vanderleia_model.chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
44
+ const axle_5 = this.vanderleia_model.chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_1)
45
+ const mean_axle = 0.5 * (axle_5 - axle_3) + axle_3
46
+ return [[pin, forces.get_force_on_pin(0)], [mean_axle, trailer_force]]
47
+ }
48
+ }
@@ -0,0 +1,51 @@
1
+ import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
2
+ import type { Transport } from '../transports/transport.js'
3
+ import { scale_tare } from './old_tare_scale.js'
4
+ import { semireboque_tare } from './old_tare_semireboque.js'
5
+ import { vanderleia_tare } from './old_tare_vanderleia.js'
6
+ import { truck_tare } from './old_tare_truck.js'
7
+
8
+ /**
9
+ * Legacy tare split by vehicle type (Python OldTareModel).
10
+ */
11
+ export class OldTareModel
12
+ {
13
+ /**
14
+ * @param transport - Parsed transport.
15
+ * @returns Tare per axle.
16
+ */
17
+ calculate(transport: Transport): number[]
18
+ {
19
+ return old_tare_by_vehicle(transport)
20
+ }
21
+ }
22
+
23
+ /**
24
+ * @param transport - Parsed transport.
25
+ * @returns Tare per axle for vehicle type.
26
+ */
27
+ export function old_tare_by_vehicle(transport: Transport): number[]
28
+ {
29
+ const type = transport.vehicle_type
30
+ if (type === VEHICLE_TYPE.BITREM)
31
+ {
32
+ return scale_tare(transport.tare, [0.23, 0.255, 0.285, 0.23])
33
+ }
34
+ if (type === VEHICLE_TYPE.RODOTREM)
35
+ {
36
+ return scale_tare(transport.tare, [0.19, 0.28, 0.21, 0.16, 0.16])
37
+ }
38
+ if (type === VEHICLE_TYPE.SEMIREBOQUE || type === VEHICLE_TYPE.REBAIXADO)
39
+ {
40
+ return semireboque_tare(transport)
41
+ }
42
+ if (type === VEHICLE_TYPE.VANDERLEIA)
43
+ {
44
+ return vanderleia_tare(transport)
45
+ }
46
+ if (type === VEHICLE_TYPE.CAMINHAO || type === VEHICLE_TYPE.VUC)
47
+ {
48
+ return truck_tare(transport)
49
+ }
50
+ return []
51
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @param tare - Total vehicle tare.
3
+ * @param multipliers - Per-axle factors.
4
+ * @returns Scaled tare list.
5
+ */
6
+ export function scale_tare(tare: number, multipliers: number[]): number[]
7
+ {
8
+ return multipliers.map((factor) => tare * factor)
9
+ }