@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.
- package/.cursor/ai_changelog/INDEX.md +13 -0
- package/.cursor/ai_changelog/_TEMPLATE.md +55 -0
- package/.cursor/rules/code-standards.mdc +103 -0
- package/.cursor/rules/knowledge-base.mdc +14 -0
- package/.cursor/rules/planning-standards.mdc +55 -0
- package/.cursor/skills/document-feature-knowledge/SKILL.md +51 -0
- package/README.md +49 -0
- package/bitbucket-pipelines.yml +81 -0
- package/build/core/contracts/chassi_reference.d.ts +7 -0
- package/build/core/contracts/chassi_reference.d.ts.map +1 -0
- package/build/core/contracts/chassi_reference.js +5 -0
- package/build/core/contracts/ms_faixas_contract.d.ts +13 -0
- package/build/core/contracts/ms_faixas_contract.d.ts.map +1 -0
- package/build/core/contracts/ms_faixas_contract.js +89 -0
- package/build/core/contracts/rotation_enum.d.ts +11 -0
- package/build/core/contracts/rotation_enum.d.ts.map +1 -0
- package/build/core/contracts/rotation_enum.js +9 -0
- package/build/core/contracts/suspension_type.d.ts +5 -0
- package/build/core/contracts/suspension_type.d.ts.map +1 -0
- package/build/core/contracts/suspension_type.js +4 -0
- package/build/core/contracts/transport_record.d.ts +5 -0
- package/build/core/contracts/transport_record.d.ts.map +1 -0
- package/build/core/contracts/transport_record.js +1 -0
- package/build/core/contracts/vehicle_type.d.ts +12 -0
- package/build/core/contracts/vehicle_type.d.ts.map +1 -0
- package/build/core/contracts/vehicle_type.js +10 -0
- package/build/core/contracts/vehicle_version.d.ts +8 -0
- package/build/core/contracts/vehicle_version.d.ts.map +1 -0
- package/build/core/contracts/vehicle_version.js +7 -0
- package/build/core/contracts/wire_flags.d.ts +27 -0
- package/build/core/contracts/wire_flags.d.ts.map +1 -0
- package/build/core/contracts/wire_flags.js +26 -0
- package/build/core/math/float_tools.d.ts +7 -0
- package/build/core/math/float_tools.d.ts.map +1 -0
- package/build/core/math/float_tools.js +14 -0
- package/build/core/math/gaussian_elimination.d.ts +8 -0
- package/build/core/math/gaussian_elimination.d.ts.map +1 -0
- package/build/core/math/gaussian_elimination.js +85 -0
- package/build/core/orchestration/axle_weight_physics.d.ts +7 -0
- package/build/core/orchestration/axle_weight_physics.d.ts.map +1 -0
- package/build/core/orchestration/axle_weight_physics.js +27 -0
- package/build/core/orchestration/collision_checker.d.ts +6 -0
- package/build/core/orchestration/collision_checker.d.ts.map +1 -0
- package/build/core/orchestration/collision_checker.js +67 -0
- package/build/core/orchestration/connector_payload_builder.d.ts +11 -0
- package/build/core/orchestration/connector_payload_builder.d.ts.map +1 -0
- package/build/core/orchestration/connector_payload_builder.js +67 -0
- package/build/core/orchestration/java_mass_center.d.ts +9 -0
- package/build/core/orchestration/java_mass_center.d.ts.map +1 -0
- package/build/core/orchestration/java_mass_center.js +79 -0
- package/build/core/orchestration/output_builder.d.ts +11 -0
- package/build/core/orchestration/output_builder.d.ts.map +1 -0
- package/build/core/orchestration/output_builder.js +15 -0
- package/build/core/orchestration/request_schema.d.ts +65 -0
- package/build/core/orchestration/request_schema.d.ts.map +1 -0
- package/build/core/orchestration/request_schema.js +20 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts +7 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts.map +1 -0
- package/build/core/orchestration/weight_by_axis_task.js +105 -0
- package/build/core/physics/items/allocated_item.d.ts +22 -0
- package/build/core/physics/items/allocated_item.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item.js +29 -0
- package/build/core/physics/items/allocated_item_manager.d.ts +31 -0
- package/build/core/physics/items/allocated_item_manager.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item_manager.js +38 -0
- package/build/core/physics/items/center_of_mass.d.ts +14 -0
- package/build/core/physics/items/center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/center_of_mass.js +24 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts +19 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.js +28 -0
- package/build/core/physics/items/item_templates.d.ts +32 -0
- package/build/core/physics/items/item_templates.d.ts.map +1 -0
- package/build/core/physics/items/item_templates.js +53 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts +37 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts.map +1 -0
- package/build/core/physics/items/multi_container_allocated_items.js +91 -0
- package/build/core/physics/items/rotation_transforms.d.ts +8 -0
- package/build/core/physics/items/rotation_transforms.d.ts.map +1 -0
- package/build/core/physics/items/rotation_transforms.js +21 -0
- package/build/core/physics/models/axle_weight_model.d.ts +32 -0
- package/build/core/physics/models/axle_weight_model.d.ts.map +1 -0
- package/build/core/physics/models/axle_weight_model.js +72 -0
- package/build/core/physics/models/bi_truck_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_model.js +60 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.js +69 -0
- package/build/core/physics/models/bitrem_model.d.ts +33 -0
- package/build/core/physics/models/bitrem_model.d.ts.map +1 -0
- package/build/core/physics/models/bitrem_model.js +123 -0
- package/build/core/physics/models/chassi_forces.d.ts +30 -0
- package/build/core/physics/models/chassi_forces.d.ts.map +1 -0
- package/build/core/physics/models/chassi_forces.js +39 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts +28 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/beam_deflection.js +78 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/bitrem_deflection.js +54 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts +12 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts.map +1 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.js +32 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts +19 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_model.js +23 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts +21 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_support_manager.js +40 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts +6 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_tools.js +10 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts +22 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts.map +1 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.js +48 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.js +47 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.js +31 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts +20 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.js +28 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.js +41 -0
- package/build/core/physics/models/old_tare_model.d.ts +17 -0
- package/build/core/physics/models/old_tare_model.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_model.js +40 -0
- package/build/core/physics/models/old_tare_scale.d.ts +7 -0
- package/build/core/physics/models/old_tare_scale.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_scale.js +8 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts +7 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_semireboque.js +37 -0
- package/build/core/physics/models/old_tare_truck.d.ts +7 -0
- package/build/core/physics/models/old_tare_truck.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_truck.js +12 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts +7 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_vanderleia.js +31 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts +19 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts.map +1 -0
- package/build/core/physics/models/percentage_on_axles_calculator.js +39 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/quad_semi_trailer_model.js +70 -0
- package/build/core/physics/models/rodotrem_model.d.ts +33 -0
- package/build/core/physics/models/rodotrem_model.d.ts.map +1 -0
- package/build/core/physics/models/rodotrem_model.js +101 -0
- package/build/core/physics/models/semi_reboque_base.d.ts +34 -0
- package/build/core/physics/models/semi_reboque_base.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_base.js +85 -0
- package/build/core/physics/models/semi_reboque_model.d.ts +41 -0
- package/build/core/physics/models/semi_reboque_model.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_model.js +84 -0
- package/build/core/physics/models/simple_truck_base.d.ts +29 -0
- package/build/core/physics/models/simple_truck_base.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_base.js +57 -0
- package/build/core/physics/models/simple_truck_model.d.ts +41 -0
- package/build/core/physics/models/simple_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_model.js +76 -0
- package/build/core/physics/models/single_container_tare.d.ts +18 -0
- package/build/core/physics/models/single_container_tare.d.ts.map +1 -0
- package/build/core/physics/models/single_container_tare.js +45 -0
- package/build/core/physics/models/tare_model.d.ts +12 -0
- package/build/core/physics/models/tare_model.d.ts.map +1 -0
- package/build/core/physics/models/tare_model.js +36 -0
- package/build/core/physics/models/vanderleia_model.d.ts +33 -0
- package/build/core/physics/models/vanderleia_model.d.ts.map +1 -0
- package/build/core/physics/models/vanderleia_model.js +100 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts +27 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_output_builder.js +42 -0
- package/build/core/physics/services/axle_weight_service.d.ts +20 -0
- package/build/core/physics/services/axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_service.js +91 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts +12 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/cm_axle_weight_service.js +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts.map +1 -0
- package/build/core/physics/services/container_corner_forces.js +84 -0
- package/build/core/physics/transports/axle_manager.d.ts +22 -0
- package/build/core/physics/transports/axle_manager.d.ts.map +1 -0
- package/build/core/physics/transports/axle_manager.js +34 -0
- package/build/core/physics/transports/axle_record.d.ts +21 -0
- package/build/core/physics/transports/axle_record.d.ts.map +1 -0
- package/build/core/physics/transports/axle_record.js +57 -0
- package/build/core/physics/transports/chassi.d.ts +52 -0
- package/build/core/physics/transports/chassi.d.ts.map +1 -0
- package/build/core/physics/transports/chassi.js +105 -0
- package/build/core/physics/transports/container_record.d.ts +25 -0
- package/build/core/physics/transports/container_record.d.ts.map +1 -0
- package/build/core/physics/transports/container_record.js +49 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts +27 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.js +40 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts +28 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.js +55 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts +15 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_weight_model.js +31 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts +17 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.js +31 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts +20 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.js +48 -0
- package/build/core/physics/transports/grouped_containers.d.ts +34 -0
- package/build/core/physics/transports/grouped_containers.d.ts.map +1 -0
- package/build/core/physics/transports/grouped_containers.js +68 -0
- package/build/core/physics/transports/merged_containers.d.ts +26 -0
- package/build/core/physics/transports/merged_containers.d.ts.map +1 -0
- package/build/core/physics/transports/merged_containers.js +45 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts +26 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.js +84 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts +22 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.js +32 -0
- package/build/core/physics/transports/transport.d.ts +33 -0
- package/build/core/physics/transports/transport.d.ts.map +1 -0
- package/build/core/physics/transports/transport.js +110 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +10 -0
- package/eslint.config.js +51 -0
- package/package.json +38 -0
- package/src/core/contracts/chassi_reference.ts +7 -0
- package/src/core/contracts/ms_faixas_contract.ts +114 -0
- package/src/core/contracts/rotation_enum.ts +11 -0
- package/src/core/contracts/suspension_type.ts +4 -0
- package/src/core/contracts/transport_record.ts +4 -0
- package/src/core/contracts/vehicle_type.ts +12 -0
- package/src/core/contracts/vehicle_version.ts +7 -0
- package/src/core/contracts/wire_flags.ts +26 -0
- package/src/core/math/float_tools.ts +17 -0
- package/src/core/math/gaussian_elimination.ts +104 -0
- package/src/core/orchestration/axle_weight_physics.ts +37 -0
- package/src/core/orchestration/collision_checker.ts +86 -0
- package/src/core/orchestration/connector_payload_builder.ts +81 -0
- package/src/core/orchestration/java_mass_center.ts +98 -0
- package/src/core/orchestration/output_builder.ts +18 -0
- package/src/core/orchestration/request_schema.ts +26 -0
- package/src/core/orchestration/weight_by_axis_task.ts +140 -0
- package/src/core/physics/items/allocated_item.ts +41 -0
- package/src/core/physics/items/allocated_item_manager.ts +50 -0
- package/src/core/physics/items/center_of_mass.ts +31 -0
- package/src/core/physics/items/compute_grouper_center_of_mass.ts +44 -0
- package/src/core/physics/items/item_templates.ts +65 -0
- package/src/core/physics/items/multi_container_allocated_items.ts +120 -0
- package/src/core/physics/items/rotation_transforms.ts +29 -0
- package/src/core/physics/models/axle_weight_model.ts +109 -0
- package/src/core/physics/models/bi_truck_model.ts +74 -0
- package/src/core/physics/models/bi_truck_tractor_semi_trailer_model.ts +86 -0
- package/src/core/physics/models/bitrem_model.ts +148 -0
- package/src/core/physics/models/chassi_forces.ts +50 -0
- package/src/core/physics/models/deflection/beam_deflection.ts +105 -0
- package/src/core/physics/models/deflection/bitrem_deflection.ts +68 -0
- package/src/core/physics/models/deflection/create_deflection_delegate.ts +46 -0
- package/src/core/physics/models/deflection/deflection_model.ts +33 -0
- package/src/core/physics/models/deflection/deflection_support_manager.ts +56 -0
- package/src/core/physics/models/deflection/deflection_tools.ts +11 -0
- package/src/core/physics/models/deflection/integration_constant_calculator.ts +62 -0
- package/src/core/physics/models/deflection/rodotrem_deflection.ts +57 -0
- package/src/core/physics/models/deflection/semi_reboque_deflection.ts +40 -0
- package/src/core/physics/models/deflection/simple_truck_deflection.ts +35 -0
- package/src/core/physics/models/deflection/vanderleia_deflection.ts +48 -0
- package/src/core/physics/models/old_tare_model.ts +51 -0
- package/src/core/physics/models/old_tare_scale.ts +9 -0
- package/src/core/physics/models/old_tare_semireboque.ts +51 -0
- package/src/core/physics/models/old_tare_truck.ts +15 -0
- package/src/core/physics/models/old_tare_vanderleia.ts +44 -0
- package/src/core/physics/models/percentage_on_axles_calculator.ts +49 -0
- package/src/core/physics/models/quad_semi_trailer_model.ts +87 -0
- package/src/core/physics/models/rodotrem_model.ts +131 -0
- package/src/core/physics/models/semi_reboque_base.ts +103 -0
- package/src/core/physics/models/semi_reboque_model.ts +127 -0
- package/src/core/physics/models/simple_truck_base.ts +70 -0
- package/src/core/physics/models/simple_truck_model.ts +115 -0
- package/src/core/physics/models/single_container_tare.ts +56 -0
- package/src/core/physics/models/tare_model.ts +46 -0
- package/src/core/physics/models/vanderleia_model.ts +125 -0
- package/src/core/physics/services/axle_weight_output_builder.ts +63 -0
- package/src/core/physics/services/axle_weight_service.ts +116 -0
- package/src/core/physics/services/cm_axle_weight_service.ts +45 -0
- package/src/core/physics/services/container_corner_forces.ts +95 -0
- package/src/core/physics/transports/axle_manager.ts +45 -0
- package/src/core/physics/transports/axle_record.ts +68 -0
- package/src/core/physics/transports/chassi.ts +130 -0
- package/src/core/physics/transports/container_record.ts +58 -0
- package/src/core/physics/transports/containerweight/container_max_weight_calculator.ts +59 -0
- package/src/core/physics/transports/containerweight/container_tare_calculator.ts +76 -0
- package/src/core/physics/transports/containerweight/container_weight_model.ts +38 -0
- package/src/core/physics/transports/containerweight/merged_containers_weight_calculator.ts +39 -0
- package/src/core/physics/transports/containerweight/single_container_weight_calculator.ts +65 -0
- package/src/core/physics/transports/grouped_containers.ts +91 -0
- package/src/core/physics/transports/merged_containers.ts +62 -0
- package/src/core/physics/transports/tare/bitrem_axle_splitter.ts +107 -0
- package/src/core/physics/transports/tare/bitrem_axle_weight_split.ts +55 -0
- package/src/core/physics/transports/transport.ts +137 -0
- package/src/index.ts +12 -0
- package/src/service/.gitkeep +0 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_1_basic_truck_input.json +1759 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_3_interlink_input.json +2226 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_4_quad_semi_trailer.json +639 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_5_custom_center_of_gravity.json +557 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_2_bitruck.json +664 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_4_quad_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_5_bi_truck_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_input_truck.json +1025 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_output_truck.json +38 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_output.json +65 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_input_semireboque.json +24625 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_output_semireboque.json +57 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_input_bitrem.json +2226 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_output_bitrem.json +96 -0
- package/test/data/src/core/physics/beam_deflection/case_10_rodotrem_offset.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_11_bitruck.json +664 -0
- package/test/data/src/core/physics/beam_deflection/case_12_quad_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_13_bi_truck_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_1_documentation.ipynb +316 -0
- package/test/data/src/core/physics/beam_deflection/case_1_semireboque.json +402 -0
- package/test/data/src/core/physics/beam_deflection/case_2_bitrem.json +434 -0
- package/test/data/src/core/physics/beam_deflection/case_3_rodotrem.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_4_vanderleia_pneumatica.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_5_vanderleia_mecanica.json +366 -0
- package/test/data/src/core/physics/beam_deflection/case_6_truck.json +279 -0
- package/test/data/src/core/physics/beam_deflection/case_7_semireboque_structural_offset.json +318 -0
- package/test/data/src/core/physics/beam_deflection/case_8_vanderleia_offset.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_9_bitrem_offset.json +434 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_1_simple_bitrem.json +145 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_2_lowered_bitrem.json +238 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_3_lowered_positive_proportion.json +238 -0
- package/test/data/src/core/physics/c_m_axle_weight_service/case_1_interlink_trailer.json +94 -0
- package/test/data/src/core/physics/calculations/case_1_simple_truck.json +83 -0
- package/test/data/src/core/physics/calculations/case_2_lowered_bitrem.json +1051 -0
- package/test/data/src/core/physics/calculations/case_3_container_mercedes.json +50 -0
- package/test/data/src/core/physics/container_corner_forces/case_1.json +674 -0
- package/test/data/src/core/physics/container_weight/case_1_basictruck.json +223 -0
- package/test/data/src/core/physics/container_weight/case_2_roadtrain.json +277 -0
- package/test/data/src/core/physics/container_weight/case_3_semireboque_rebaixado.json +197 -0
- package/test/data/src/core/physics/container_weight/case_4_semireboque_neck_limit.json +197 -0
- package/test/data/src/core/physics/container_weight/case_5_vanderleia_rebaixada.json +211 -0
- package/test/data/src/core/physics/container_weight/case_6_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/python_goldens.json +9 -0
- package/test/data/src/core/physics/tare/case_1_simple_vanderleia.json +185 -0
- package/test/data/src/core/physics/tare/case_2_lowered_vanderleia.json +646 -0
- package/test/data/src/core/physics/tare/case_3_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/tare/case_4_negative_tare_VUC.json +483 -0
- package/test/data/src/core/physics/tare/case_5_truck_bitruck.json +664 -0
- package/test/data/src/core/physics/tare/case_6_quad_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_7_bi_truck_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_8_triaxle_semi_trailer.json +203 -0
- package/test/data/src/core/physics/time_performance/case_1_center_of_mass.json +2916 -0
- package/test/data/src/core/physics/trucks/bitrem.json +150 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem.json +1216 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem_empty_first_container.json +1182 -0
- package/test/data/src/core/physics/trucks/rodotrem.json +148 -0
- package/test/data/src/core/physics/trucks/semi_reboque.json +91 -0
- package/test/data/src/core/physics/trucks/semi_reboque_rebaixado.json +1629 -0
- package/test/data/src/core/physics/trucks/simple_truck.json +85 -0
- package/test/data/src/core/physics/trucks/vanderleia_mechanical.json +105 -0
- package/test/data/src/core/physics/trucks/vanderleia_pneumatic.json +105 -0
- package/test/src/core/orchestration/request_schema.test.ts +20 -0
- package/test/src/core/orchestration/weight_by_axis_task.test.ts +87 -0
- package/test/src/core/physics/items/center_of_mass.test.ts +38 -0
- package/test/src/core/physics/items/multi_container_allocated_items.test.ts +22 -0
- package/test/src/core/physics/math_input_helpers.ts +64 -0
- package/test/src/core/physics/models/bitrem_model.test.ts +54 -0
- package/test/src/core/physics/models/deflection/deflection_model.test.ts +78 -0
- package/test/src/core/physics/models/rodotrem_model.test.ts +29 -0
- package/test/src/core/physics/models/semi_reboque_model.test.ts +72 -0
- package/test/src/core/physics/models/simple_truck_model.test.ts +23 -0
- package/test/src/core/physics/models/tare_model.test.ts +34 -0
- package/test/src/core/physics/models/vanderleia_model.test.ts +36 -0
- package/test/src/core/physics/services/axle_weight_service.test.ts +56 -0
- package/test/src/core/physics/services/cm_axle_weight_service.test.ts +23 -0
- package/test/src/core/physics/services/container_corner_forces.test.ts +23 -0
- package/test/src/core/physics/test_helpers.ts +13 -0
- package/test/src/core/physics/transports/chassi.test.ts +35 -0
- package/test/src/core/physics/transports/containerweight/container_weight_model.test.ts +57 -0
- package/test/src/core/physics/transports/tare/bitrem_axle_splitter.test.ts +30 -0
- package/test/src/index.test.ts +35 -0
- package/tsconfig.eslint.json +15 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AxleRecord } from '../axle_record.js';
|
|
2
|
+
export type BitremAxleSplit = {
|
|
3
|
+
mult: number;
|
|
4
|
+
on_axle_3: boolean;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* @param first_proportion - First proportion from splitter.
|
|
8
|
+
* @param second_proportion - Second proportion from splitter.
|
|
9
|
+
* @returns Multiplier and target axle flag.
|
|
10
|
+
*/
|
|
11
|
+
export declare function compute_bitrem_axle_split(first_proportion: number, second_proportion: number): BitremAxleSplit;
|
|
12
|
+
export type BitremAxleSplitTarget = {
|
|
13
|
+
old: AxleRecord;
|
|
14
|
+
axle_3: AxleRecord;
|
|
15
|
+
axle_4: AxleRecord;
|
|
16
|
+
split: BitremAxleSplit;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @param target - Axles and split multipliers.
|
|
20
|
+
*/
|
|
21
|
+
export declare function apply_bitrem_axle_split(target: BitremAxleSplitTarget): void;
|
|
22
|
+
//# sourceMappingURL=bitrem_axle_weight_split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitrem_axle_weight_split.d.ts","sourceRoot":"","sources":["../../../../../src/core/physics/transports/tare/bitrem_axle_weight_split.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACrB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACrC,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GAC1B,eAAe,CAYjB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAChC,GAAG,EAAE,UAAU,CAAA;IACf,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAe3E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param first_proportion - First proportion from splitter.
|
|
3
|
+
* @param second_proportion - Second proportion from splitter.
|
|
4
|
+
* @returns Multiplier and target axle flag.
|
|
5
|
+
*/
|
|
6
|
+
export function compute_bitrem_axle_split(first_proportion, second_proportion) {
|
|
7
|
+
const diff = first_proportion - second_proportion;
|
|
8
|
+
if (diff > 0) {
|
|
9
|
+
return { mult: 0.17 + 1 / (Math.abs(diff) + 2), on_axle_3: true };
|
|
10
|
+
}
|
|
11
|
+
if (diff < 0) {
|
|
12
|
+
return { mult: -0.17 + 1 / (Math.abs(diff) + 2), on_axle_3: false };
|
|
13
|
+
}
|
|
14
|
+
return { mult: 0.5, on_axle_3: true };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* @param target - Axles and split multipliers.
|
|
18
|
+
*/
|
|
19
|
+
export function apply_bitrem_axle_split(target) {
|
|
20
|
+
const { old, axle_3, axle_4, split } = target;
|
|
21
|
+
if (split.on_axle_3) {
|
|
22
|
+
axle_3.max_supported_weight = old.max_supported_weight * split.mult;
|
|
23
|
+
axle_4.max_supported_weight = old.max_supported_weight - axle_3.max_supported_weight;
|
|
24
|
+
axle_3.tare = old.tare * split.mult;
|
|
25
|
+
axle_4.tare = old.tare - axle_3.tare;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
axle_4.max_supported_weight = old.max_supported_weight * split.mult;
|
|
29
|
+
axle_3.max_supported_weight = old.max_supported_weight - axle_4.max_supported_weight;
|
|
30
|
+
axle_4.tare = old.tare * split.mult;
|
|
31
|
+
axle_3.tare = old.tare - axle_4.tare;
|
|
32
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type VehicleTypeCode } from '../../contracts/vehicle_type.js';
|
|
2
|
+
import type { TransportRecord } from '../../contracts/transport_record.js';
|
|
3
|
+
import { AxleManager } from './axle_manager.js';
|
|
4
|
+
import { ContainerRecord } from './container_record.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parsed transport matching jettainterface.Transport behavior used by axleweight.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Transport {
|
|
9
|
+
id: string;
|
|
10
|
+
containers: Map<number, ContainerRecord>;
|
|
11
|
+
amount: number;
|
|
12
|
+
supported_weight: number;
|
|
13
|
+
tare: number;
|
|
14
|
+
axle_manager: AxleManager;
|
|
15
|
+
first_axle_distance: number;
|
|
16
|
+
vehicle_type: VehicleTypeCode;
|
|
17
|
+
vehicle_version: number;
|
|
18
|
+
suspension_type: string | null;
|
|
19
|
+
/**
|
|
20
|
+
* @param transport_data - Raw transport dict.
|
|
21
|
+
*/
|
|
22
|
+
constructor(transport_data: TransportRecord);
|
|
23
|
+
/**
|
|
24
|
+
* @returns Sorted container sequence indexes.
|
|
25
|
+
*/
|
|
26
|
+
list_containers_sequence_indexes(): number[];
|
|
27
|
+
/**
|
|
28
|
+
* @param sequence_index - Container sequence.
|
|
29
|
+
* @returns Container record.
|
|
30
|
+
*/
|
|
31
|
+
get_container_by_sequence_index(sequence_index: number): ContainerRecord;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/core/physics/transports/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,qBAAa,SAAS;IAElB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,WAAW,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,YAAY,EAAE,eAAe,CAAA;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAE9B;;OAEG;gBACS,cAAc,EAAE,eAAe;IAe3C;;OAEG;IACH,gCAAgC,IAAI,MAAM,EAAE;IAK5C;;;OAGG;IACH,+BAA+B,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe;CAS3E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { WIRE_FLAGS } from '../../contracts/wire_flags.js';
|
|
2
|
+
import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js';
|
|
3
|
+
import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js';
|
|
4
|
+
import { AxleManager } from './axle_manager.js';
|
|
5
|
+
import { ContainerRecord } from './container_record.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parsed transport matching jettainterface.Transport behavior used by axleweight.
|
|
8
|
+
*/
|
|
9
|
+
export class Transport {
|
|
10
|
+
id;
|
|
11
|
+
containers;
|
|
12
|
+
amount;
|
|
13
|
+
supported_weight;
|
|
14
|
+
tare;
|
|
15
|
+
axle_manager;
|
|
16
|
+
first_axle_distance;
|
|
17
|
+
vehicle_type;
|
|
18
|
+
vehicle_version;
|
|
19
|
+
suspension_type;
|
|
20
|
+
/**
|
|
21
|
+
* @param transport_data - Raw transport dict.
|
|
22
|
+
*/
|
|
23
|
+
constructor(transport_data) {
|
|
24
|
+
this.id = String(transport_data[WIRE_FLAGS.TRANSPORT_ID]);
|
|
25
|
+
this.containers = read_containers(transport_data);
|
|
26
|
+
this.amount = Number(transport_data[WIRE_FLAGS.AMOUNT] ?? 0);
|
|
27
|
+
this.supported_weight = Number(transport_data[WIRE_FLAGS.SUPPORTED_WEIGHT]);
|
|
28
|
+
this.tare = Number(transport_data.tara ?? 0);
|
|
29
|
+
this.axle_manager = new AxleManager(transport_data);
|
|
30
|
+
this.first_axle_distance = Number(transport_data[WIRE_FLAGS.FIRST_AXLE_DISTANCE] ?? 0);
|
|
31
|
+
this.vehicle_type = read_vehicle_type(transport_data);
|
|
32
|
+
this.vehicle_version = read_vehicle_version(transport_data);
|
|
33
|
+
this.suspension_type = read_suspension_type(transport_data);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @returns Sorted container sequence indexes.
|
|
37
|
+
*/
|
|
38
|
+
list_containers_sequence_indexes() {
|
|
39
|
+
return [...this.containers.keys()].sort((left, right) => left - right);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param sequence_index - Container sequence.
|
|
43
|
+
* @returns Container record.
|
|
44
|
+
*/
|
|
45
|
+
get_container_by_sequence_index(sequence_index) {
|
|
46
|
+
const container = this.containers.get(sequence_index);
|
|
47
|
+
if (!container) {
|
|
48
|
+
throw new Error(`Container sequence ${sequence_index} not found`);
|
|
49
|
+
}
|
|
50
|
+
return container;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param transport_data - Raw transport dict.
|
|
55
|
+
* @returns Containers keyed by sequence.
|
|
56
|
+
*/
|
|
57
|
+
function read_containers(transport_data) {
|
|
58
|
+
const map = new Map();
|
|
59
|
+
const list = transport_data[WIRE_FLAGS.CONTAINERS];
|
|
60
|
+
if (!Array.isArray(list)) {
|
|
61
|
+
return map;
|
|
62
|
+
}
|
|
63
|
+
for (const entry of list) {
|
|
64
|
+
const container = new ContainerRecord(entry);
|
|
65
|
+
map.set(container.sequence_index, container);
|
|
66
|
+
}
|
|
67
|
+
return map;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @param transport_data - Raw transport dict.
|
|
71
|
+
* @returns Vehicle type code.
|
|
72
|
+
*/
|
|
73
|
+
function read_vehicle_type(transport_data) {
|
|
74
|
+
const raw = transport_data[WIRE_FLAGS.VEHICLE_TYPE];
|
|
75
|
+
if (raw === undefined || raw === null) {
|
|
76
|
+
return VEHICLE_TYPE.CONTAINER;
|
|
77
|
+
}
|
|
78
|
+
return Number(raw);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @param transport_data - Raw transport dict.
|
|
82
|
+
* @returns Resolved vehicle version code.
|
|
83
|
+
*/
|
|
84
|
+
function read_vehicle_version(transport_data) {
|
|
85
|
+
const vehicle_type = read_vehicle_type(transport_data);
|
|
86
|
+
const version_code = Number(transport_data[WIRE_FLAGS.VEHICLE_VERSION] ?? 0);
|
|
87
|
+
if (vehicle_type === VEHICLE_TYPE.CAMINHAO && version_code === 4) {
|
|
88
|
+
return VEHICLE_VERSION.CAMINHAO_BITRUCK;
|
|
89
|
+
}
|
|
90
|
+
if (vehicle_type === VEHICLE_TYPE.SEMIREBOQUE) {
|
|
91
|
+
if (version_code === 5 || version_code === 7) {
|
|
92
|
+
return VEHICLE_VERSION.SEMIREBOQUE_QUAD;
|
|
93
|
+
}
|
|
94
|
+
if (version_code === 6) {
|
|
95
|
+
return VEHICLE_VERSION.SEMIREBOQUE_BITRUCK;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return VEHICLE_VERSION.DEFAULT;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @param transport_data - Raw transport dict.
|
|
102
|
+
* @returns Suspension wire string or null.
|
|
103
|
+
*/
|
|
104
|
+
function read_suspension_type(transport_data) {
|
|
105
|
+
const raw = transport_data[WIRE_FLAGS.SUSPENSION_TYPE];
|
|
106
|
+
if (raw === undefined || raw === null) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return String(raw);
|
|
110
|
+
}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates loaded cargo weight per axle for each transport in the payload.
|
|
3
|
+
* Same contract as WeightByAxisTask.run() in ms-faixas-porcentuais.
|
|
4
|
+
* @param json_data - Raw JSON string with `{ envs, config? }`.
|
|
5
|
+
* @returns JSON string with `envs` and axle weights, or error payload.
|
|
6
|
+
*/
|
|
7
|
+
export declare function calculate_weight_on_axles_physics(json_data: string): string;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG3E"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { run_weight_by_axis_task } from './core/orchestration/weight_by_axis_task.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculates loaded cargo weight per axle for each transport in the payload.
|
|
4
|
+
* Same contract as WeightByAxisTask.run() in ms-faixas-porcentuais.
|
|
5
|
+
* @param json_data - Raw JSON string with `{ envs, config? }`.
|
|
6
|
+
* @returns JSON string with `envs` and axle weights, or error payload.
|
|
7
|
+
*/
|
|
8
|
+
export function calculate_weight_on_axles_physics(json_data) {
|
|
9
|
+
return run_weight_by_axis_task(json_data);
|
|
10
|
+
}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import eslintPluginTs from '@typescript-eslint/eslint-plugin'
|
|
2
|
+
import parserTs from '@typescript-eslint/parser'
|
|
3
|
+
|
|
4
|
+
const shared_parser = {
|
|
5
|
+
parser: parserTs,
|
|
6
|
+
parserOptions: {
|
|
7
|
+
project: './tsconfig.eslint.json',
|
|
8
|
+
sourceType: 'module',
|
|
9
|
+
ecmaVersion: 2020
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const production_rules = {
|
|
14
|
+
indent: ['error', 4, { SwitchCase: 1 }],
|
|
15
|
+
semi: ['error', 'never'],
|
|
16
|
+
curly: ['error', 'all'],
|
|
17
|
+
quotes: ['error', 'single', { allowTemplateLiterals: true }],
|
|
18
|
+
'no-unused-vars': 'off',
|
|
19
|
+
'no-trailing-spaces': ['error'],
|
|
20
|
+
'brace-style': ['error', 'allman'],
|
|
21
|
+
'keyword-spacing': ['error', { before: true, after: true }],
|
|
22
|
+
'max-lines': ['error', { max: 125, skipBlankLines: true, skipComments: true }],
|
|
23
|
+
'max-lines-per-function': ['error', { max: 25, skipBlankLines: true, skipComments: true }],
|
|
24
|
+
'max-params': ['error', 3],
|
|
25
|
+
'space-infix-ops': ['error', { int32Hint: false }],
|
|
26
|
+
'max-statements-per-line': ['error', { max: 2 }],
|
|
27
|
+
'@typescript-eslint/no-unused-vars': [
|
|
28
|
+
'error',
|
|
29
|
+
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' }
|
|
30
|
+
],
|
|
31
|
+
'@typescript-eslint/naming-convention': [
|
|
32
|
+
'error',
|
|
33
|
+
{ selector: 'class', format: ['PascalCase'] },
|
|
34
|
+
{ selector: 'function', format: ['snake_case'] },
|
|
35
|
+
{ selector: 'variable', format: ['snake_case'] },
|
|
36
|
+
{
|
|
37
|
+
selector: 'variable',
|
|
38
|
+
modifiers: ['const'],
|
|
39
|
+
format: ['snake_case', 'UPPER_CASE']
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default [
|
|
45
|
+
{
|
|
46
|
+
files: ['src/**/*.ts'],
|
|
47
|
+
languageOptions: shared_parser,
|
|
48
|
+
plugins: { '@typescript-eslint': eslintPluginTs },
|
|
49
|
+
rules: production_rules
|
|
50
|
+
}
|
|
51
|
+
]
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jetta/axle-load-calculator",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Merged weight_by_axis physics and orchestration library",
|
|
5
|
+
"main": "build/index.js",
|
|
6
|
+
"types": "build/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"private": false,
|
|
9
|
+
"scripts": {
|
|
10
|
+
"prebuild": "rm -rf build/* && npm ci",
|
|
11
|
+
"test": "tsx ./node_modules/mocha/bin/mocha \"test/**/*.ts\"",
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"lint": "eslint src --ext .ts",
|
|
14
|
+
"lint:fix": "eslint src --fix",
|
|
15
|
+
"audit": "npm audit --omit=dev",
|
|
16
|
+
"preversion": "git fetch --prune --tags",
|
|
17
|
+
"version": "npm run build",
|
|
18
|
+
"postversion": "git push origin HEAD --follow-tags",
|
|
19
|
+
"publish:alpha": "npm version --tag-version-prefix=alpha-v",
|
|
20
|
+
"publish:stable": "npm version",
|
|
21
|
+
"prerelease:alpha": "npm version prerelease --tag-version-prefix=alpha-v",
|
|
22
|
+
"coverage": "c8 --reporter=html --reporter=text npm run test"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"zod": "^3.24.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/chai": "^5.2.3",
|
|
29
|
+
"@types/mocha": "^10.0.10",
|
|
30
|
+
"@types/node": "^25.9.1",
|
|
31
|
+
"@typescript-eslint/eslint-plugin": "^8.59.4",
|
|
32
|
+
"@typescript-eslint/parser": "^8.59.4",
|
|
33
|
+
"chai": "^6.2.2",
|
|
34
|
+
"mocha": "^11.7.6",
|
|
35
|
+
"tsx": "^4.22.3",
|
|
36
|
+
"typescript": "^6.0.3"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { AllocatedItem } from '../physics/items/allocated_item.js'
|
|
2
|
+
import { AllocatedItemManager } from '../physics/items/allocated_item_manager.js'
|
|
3
|
+
import { ItemTemplates } from '../physics/items/item_templates.js'
|
|
4
|
+
|
|
5
|
+
const TRANSPORT_LIST_FLAG = 'envs'
|
|
6
|
+
const CONTAINERS_FLAG = 'containers'
|
|
7
|
+
const ITEM_LIST_FLAG = 'items'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Parses ms-faixas `{ envs: [...] }` payloads for axleweight services.
|
|
11
|
+
*/
|
|
12
|
+
export class MsFaixasContract
|
|
13
|
+
{
|
|
14
|
+
transport_data: Record<string, unknown>
|
|
15
|
+
allocated_items_by_sequence_id: Record<number, AllocatedItemManager>
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param ms_faixas_input - Request with envs array.
|
|
19
|
+
*/
|
|
20
|
+
constructor(ms_faixas_input: Record<string, unknown>)
|
|
21
|
+
{
|
|
22
|
+
const envs = ms_faixas_input[TRANSPORT_LIST_FLAG] as Record<string, unknown>[]
|
|
23
|
+
this.transport_data = { ...envs[0] }
|
|
24
|
+
this.allocated_items_by_sequence_id = build_allocated_items(this.transport_data)
|
|
25
|
+
strip_items_from_transport(this.transport_data)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param transport_data - Env vehicle data.
|
|
31
|
+
* @returns Allocated items keyed by sequence index.
|
|
32
|
+
*/
|
|
33
|
+
function build_allocated_items(
|
|
34
|
+
transport_data: Record<string, unknown>
|
|
35
|
+
): Record<number, AllocatedItemManager>
|
|
36
|
+
{
|
|
37
|
+
const templates = build_item_templates(transport_data)
|
|
38
|
+
const result: Record<number, AllocatedItemManager> = {}
|
|
39
|
+
const containers = transport_data[CONTAINERS_FLAG] as Record<string, unknown>[]
|
|
40
|
+
for (let index = 0; index < containers.length; index++)
|
|
41
|
+
{
|
|
42
|
+
const container = containers[index]
|
|
43
|
+
const sequence = Number(container.sequencia ?? index + 1)
|
|
44
|
+
result[sequence] = build_container_items(templates, container)
|
|
45
|
+
}
|
|
46
|
+
return result
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @param transport_data - Env vehicle.
|
|
51
|
+
* @returns Item templates from all container items.
|
|
52
|
+
*/
|
|
53
|
+
function build_item_templates(transport_data: Record<string, unknown>): ItemTemplates
|
|
54
|
+
{
|
|
55
|
+
const templates = new ItemTemplates()
|
|
56
|
+
const containers = transport_data[CONTAINERS_FLAG] as Record<string, unknown>[]
|
|
57
|
+
for (const container of containers)
|
|
58
|
+
{
|
|
59
|
+
const items = container[ITEM_LIST_FLAG] as Record<string, unknown>[] | undefined
|
|
60
|
+
if (!items)
|
|
61
|
+
{
|
|
62
|
+
continue
|
|
63
|
+
}
|
|
64
|
+
for (const item of items)
|
|
65
|
+
{
|
|
66
|
+
templates.add_template_from_item_data(item)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return templates
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @param templates - Shared templates.
|
|
74
|
+
* @param container - Container JSON.
|
|
75
|
+
* @returns Allocated item manager for container.
|
|
76
|
+
*/
|
|
77
|
+
function build_container_items(
|
|
78
|
+
templates: ItemTemplates,
|
|
79
|
+
container: Record<string, unknown>
|
|
80
|
+
): AllocatedItemManager
|
|
81
|
+
{
|
|
82
|
+
const manager = new AllocatedItemManager(templates)
|
|
83
|
+
const items = container[ITEM_LIST_FLAG] as Record<string, unknown>[] | undefined
|
|
84
|
+
if (!items)
|
|
85
|
+
{
|
|
86
|
+
return manager
|
|
87
|
+
}
|
|
88
|
+
const allocated: AllocatedItem[] = []
|
|
89
|
+
for (const item_data of items)
|
|
90
|
+
{
|
|
91
|
+
const item_id = String(item_data.id ?? item_data._id)
|
|
92
|
+
const template_index = templates.index_of(item_id)
|
|
93
|
+
const item = new AllocatedItem(templates, template_index)
|
|
94
|
+
item.xi = Number(item_data.x ?? 0)
|
|
95
|
+
item.yi = Number(item_data.y ?? 0)
|
|
96
|
+
// Ms-faixas stores longitudinal position in `y` (jettainterface maps y→chassis z).
|
|
97
|
+
item.zi = Number(item_data.y ?? item_data.z ?? 0)
|
|
98
|
+
allocated.push(item)
|
|
99
|
+
}
|
|
100
|
+
manager.add_allocated_items(allocated)
|
|
101
|
+
return manager
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param transport_data - Env vehicle to strip item lists from.
|
|
106
|
+
*/
|
|
107
|
+
function strip_items_from_transport(transport_data: Record<string, unknown>): void
|
|
108
|
+
{
|
|
109
|
+
const containers = transport_data[CONTAINERS_FLAG] as Record<string, unknown>[]
|
|
110
|
+
for (const container of containers)
|
|
111
|
+
{
|
|
112
|
+
delete container[ITEM_LIST_FLAG]
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const WIRE_FLAGS = Object.freeze({
|
|
2
|
+
TRANSPORT_ID: '_id',
|
|
3
|
+
CONTAINERS: 'containers',
|
|
4
|
+
AXLE_LIST: 'eixos',
|
|
5
|
+
MAIN_PIN_DISTANCE: 'distPinoRei',
|
|
6
|
+
CONTAINER_DISTANCE_AHEAD: 'containerDistanceAhead',
|
|
7
|
+
FIRST_AXLE_DISTANCE: 'primeiroEixo',
|
|
8
|
+
VEHICLE_TYPE: 'tipoVeiculo',
|
|
9
|
+
VEHICLE_VERSION: 'tipoVersao',
|
|
10
|
+
SUSPENSION_TYPE: 'tipoSuspensao',
|
|
11
|
+
SUPPORTED_WEIGHT: 'pesoDeCarga',
|
|
12
|
+
AMOUNT: 'qtd',
|
|
13
|
+
LENGTH: 'comprimento',
|
|
14
|
+
WIDTH: 'largura',
|
|
15
|
+
HEIGHT: 'altura',
|
|
16
|
+
SEQUENCE: 'sequencia',
|
|
17
|
+
GROUPER: 'grouper',
|
|
18
|
+
DISTANCE_FROM_ORIGIN: 'distanciaOrigem',
|
|
19
|
+
MAX_SUPPORTED_WEIGHT: 'pesoMaxSuportado',
|
|
20
|
+
SEQUENCE_CONTAINER: 'sequenciaContainer',
|
|
21
|
+
DNIT_WEIGHT: 'pesoDnit',
|
|
22
|
+
TARE: 'tara',
|
|
23
|
+
CM_SERVICE_CENTER_OF_MASS: 'center_of_mass',
|
|
24
|
+
CM_SERVICE_Z: 'z_position',
|
|
25
|
+
CM_SERVICE_MASS: 'mass'
|
|
26
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts nested float lists to a plain number matrix (NumPy float_list_to_np_array equivalent).
|
|
3
|
+
* @param float_list - Nested numeric list.
|
|
4
|
+
* @returns Plain number matrix or vector.
|
|
5
|
+
*/
|
|
6
|
+
export function float_list_to_matrix(float_list: number[] | number[][]): number[] | number[][]
|
|
7
|
+
{
|
|
8
|
+
if (float_list.length === 0)
|
|
9
|
+
{
|
|
10
|
+
return []
|
|
11
|
+
}
|
|
12
|
+
if (typeof float_list[0] === 'number')
|
|
13
|
+
{
|
|
14
|
+
return float_list as number[]
|
|
15
|
+
}
|
|
16
|
+
return (float_list as number[][]).map((row) => row.map((value) => Number(value)))
|
|
17
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solves Ax = b for square matrix A using Gaussian elimination (NumPy-compatible order).
|
|
3
|
+
* @param matrix - Coefficient matrix row-major n×n.
|
|
4
|
+
* @param independent - Right-hand side vector length n.
|
|
5
|
+
* @returns Solution vector length n.
|
|
6
|
+
*/
|
|
7
|
+
export function solve_linear_system(matrix: number[][], independent: number[]): number[]
|
|
8
|
+
{
|
|
9
|
+
const size = independent.length
|
|
10
|
+
const augmented = matrix.map((row, row_index) => [...row, independent[row_index]])
|
|
11
|
+
for (let pivot_column = 0; pivot_column < size; pivot_column++)
|
|
12
|
+
{
|
|
13
|
+
forward_eliminate(augmented, pivot_column, size)
|
|
14
|
+
}
|
|
15
|
+
return back_substitute(augmented, size)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param augmented - Augmented matrix.
|
|
20
|
+
* @param pivot_column - Current pivot column index.
|
|
21
|
+
* @param size - System size.
|
|
22
|
+
*/
|
|
23
|
+
function forward_eliminate(augmented: number[][], pivot_column: number, size: number): void
|
|
24
|
+
{
|
|
25
|
+
const pivot_row = find_pivot_row(augmented, pivot_column, size)
|
|
26
|
+
swap_rows(augmented, pivot_row, pivot_column)
|
|
27
|
+
eliminate_below(augmented, pivot_column, size)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param augmented - Augmented matrix.
|
|
32
|
+
* @param pivot_column - Pivot column.
|
|
33
|
+
* @param size - System size.
|
|
34
|
+
* @returns Row index with largest absolute pivot.
|
|
35
|
+
*/
|
|
36
|
+
function find_pivot_row(augmented: number[][], pivot_column: number, size: number): number
|
|
37
|
+
{
|
|
38
|
+
let pivot_row = pivot_column
|
|
39
|
+
let max_abs = Math.abs(augmented[pivot_column][pivot_column])
|
|
40
|
+
for (let row = pivot_column + 1; row < size; row++)
|
|
41
|
+
{
|
|
42
|
+
const candidate = Math.abs(augmented[row][pivot_column])
|
|
43
|
+
if (candidate > max_abs)
|
|
44
|
+
{
|
|
45
|
+
max_abs = candidate
|
|
46
|
+
pivot_row = row
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return pivot_row
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @param augmented - Augmented matrix.
|
|
54
|
+
* @param pivot_row - Row to swap to pivot position.
|
|
55
|
+
* @param pivot_column - Pivot column index.
|
|
56
|
+
*/
|
|
57
|
+
function swap_rows(augmented: number[][], pivot_row: number, pivot_column: number): void
|
|
58
|
+
{
|
|
59
|
+
if (pivot_row === pivot_column)
|
|
60
|
+
{
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
const temp = augmented[pivot_column]
|
|
64
|
+
augmented[pivot_column] = augmented[pivot_row]
|
|
65
|
+
augmented[pivot_row] = temp
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param augmented - Augmented matrix.
|
|
70
|
+
* @param pivot_column - Pivot column index.
|
|
71
|
+
* @param size - System size.
|
|
72
|
+
*/
|
|
73
|
+
function eliminate_below(augmented: number[][], pivot_column: number, size: number): void
|
|
74
|
+
{
|
|
75
|
+
const pivot_value = augmented[pivot_column][pivot_column]
|
|
76
|
+
for (let row = pivot_column + 1; row < size; row++)
|
|
77
|
+
{
|
|
78
|
+
const factor = augmented[row][pivot_column] / pivot_value
|
|
79
|
+
for (let column = pivot_column; column <= size; column++)
|
|
80
|
+
{
|
|
81
|
+
augmented[row][column] -= factor * augmented[pivot_column][column]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param augmented - Row-echelon augmented matrix.
|
|
88
|
+
* @param size - System size.
|
|
89
|
+
* @returns Solution vector.
|
|
90
|
+
*/
|
|
91
|
+
function back_substitute(augmented: number[][], size: number): number[]
|
|
92
|
+
{
|
|
93
|
+
const solution = new Array<number>(size).fill(0)
|
|
94
|
+
for (let row = size - 1; row >= 0; row--)
|
|
95
|
+
{
|
|
96
|
+
let sum = augmented[row][size]
|
|
97
|
+
for (let column = row + 1; column < size; column++)
|
|
98
|
+
{
|
|
99
|
+
sum -= augmented[row][column] * solution[column]
|
|
100
|
+
}
|
|
101
|
+
solution[row] = sum / augmented[row][row]
|
|
102
|
+
}
|
|
103
|
+
return solution
|
|
104
|
+
}
|