@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,45 @@
|
|
|
1
|
+
import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
|
|
2
|
+
import { AxleRecord } from './axle_record.js'
|
|
3
|
+
import type { TransportRecord } from '../../contracts/transport_record.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Ordered axle list for a transport.
|
|
7
|
+
*/
|
|
8
|
+
export class AxleManager
|
|
9
|
+
{
|
|
10
|
+
axles: AxleRecord[]
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param transport_data - Raw transport JSON.
|
|
14
|
+
*/
|
|
15
|
+
constructor(transport_data: TransportRecord)
|
|
16
|
+
{
|
|
17
|
+
const axles_data = transport_data[WIRE_FLAGS.AXLE_LIST]
|
|
18
|
+
this.axles = []
|
|
19
|
+
if (!Array.isArray(axles_data))
|
|
20
|
+
{
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
for (const axle_data of axles_data)
|
|
24
|
+
{
|
|
25
|
+
this.axles.push(new AxleRecord(axle_data as Record<string, unknown>))
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @returns Axle index list [0..n-1].
|
|
31
|
+
*/
|
|
32
|
+
list_axles_indexes(): number[]
|
|
33
|
+
{
|
|
34
|
+
return this.axles.map((_axle, index) => index)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param axle_index - Zero-based axle index.
|
|
39
|
+
* @returns Axle at index.
|
|
40
|
+
*/
|
|
41
|
+
get_axle(axle_index: number): AxleRecord
|
|
42
|
+
{
|
|
43
|
+
return this.axles[axle_index]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Single axle geometry and capacity from wire JSON.
|
|
5
|
+
*/
|
|
6
|
+
export class AxleRecord
|
|
7
|
+
{
|
|
8
|
+
distance_from_previous_axle: number
|
|
9
|
+
max_supported_weight: number
|
|
10
|
+
sequence_index: number
|
|
11
|
+
dnit_weight_limit: number
|
|
12
|
+
tare: number
|
|
13
|
+
loaded_weight: number
|
|
14
|
+
is_connected_to: number | null
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param axle_data - Raw axle object from transport JSON.
|
|
18
|
+
*/
|
|
19
|
+
constructor(axle_data: Record<string, unknown>)
|
|
20
|
+
{
|
|
21
|
+
this.distance_from_previous_axle = read_number(axle_data, WIRE_FLAGS.DISTANCE_FROM_ORIGIN)
|
|
22
|
+
this.max_supported_weight = read_number(axle_data, WIRE_FLAGS.MAX_SUPPORTED_WEIGHT)
|
|
23
|
+
this.sequence_index = read_number(axle_data, WIRE_FLAGS.SEQUENCE_CONTAINER)
|
|
24
|
+
this.dnit_weight_limit = read_number(axle_data, WIRE_FLAGS.DNIT_WEIGHT)
|
|
25
|
+
this.tare = read_number(axle_data, WIRE_FLAGS.TARE)
|
|
26
|
+
this.loaded_weight = read_optional_number(axle_data, 'pesoCarregado') ?? 0
|
|
27
|
+
this.is_connected_to = read_optional_number(axle_data, 'mergeOnAxleIndex')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @returns Shallow copy of axle wire fields.
|
|
32
|
+
*/
|
|
33
|
+
to_wire(): Record<string, unknown>
|
|
34
|
+
{
|
|
35
|
+
return {
|
|
36
|
+
distanciaOrigem: this.distance_from_previous_axle,
|
|
37
|
+
pesoMaxSuportado: this.max_supported_weight,
|
|
38
|
+
pesoDnit: this.dnit_weight_limit,
|
|
39
|
+
tara: this.tare,
|
|
40
|
+
sequenciaContainer: this.sequence_index,
|
|
41
|
+
mergeOnAxleIndex: this.is_connected_to
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @param data - Source object.
|
|
48
|
+
* @param key - Field key.
|
|
49
|
+
* @returns Parsed number.
|
|
50
|
+
*/
|
|
51
|
+
function read_number(data: Record<string, unknown>, key: string): number
|
|
52
|
+
{
|
|
53
|
+
return Number(data[key])
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @param data - Source object.
|
|
58
|
+
* @param key - Field key.
|
|
59
|
+
* @returns Parsed number or null.
|
|
60
|
+
*/
|
|
61
|
+
function read_optional_number(data: Record<string, unknown>, key: string): number | null
|
|
62
|
+
{
|
|
63
|
+
if (data[key] === undefined || data[key] === null)
|
|
64
|
+
{
|
|
65
|
+
return null
|
|
66
|
+
}
|
|
67
|
+
return Number(data[key])
|
|
68
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { CHASSI_REFERENCE, type ChassiReference } from '../../contracts/chassi_reference.js'
|
|
2
|
+
import type { Transport } from './transport.js'
|
|
3
|
+
import { MergedContainers } from './merged_containers.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Chassis geometry reference frame for equilibrium models.
|
|
7
|
+
*/
|
|
8
|
+
export class Chassi
|
|
9
|
+
{
|
|
10
|
+
private first_axle_distance: number
|
|
11
|
+
private axle_positions: number[] = []
|
|
12
|
+
private pin_positions: number[] = []
|
|
13
|
+
private grouper_start: number[] = []
|
|
14
|
+
private grouper_end: number[] = []
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param transport - Parsed transport.
|
|
18
|
+
*/
|
|
19
|
+
constructor(transport: Transport)
|
|
20
|
+
{
|
|
21
|
+
this.first_axle_distance = transport.first_axle_distance
|
|
22
|
+
const merged = new MergedContainers(transport)
|
|
23
|
+
this.calculate_groupers_positions(merged)
|
|
24
|
+
this.calculate_axles_positions(transport)
|
|
25
|
+
this.calculate_pins_positions(merged)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param axle_index - Zero-based axle index.
|
|
30
|
+
* @param chassi_reference - Reference frame.
|
|
31
|
+
* @returns Axle position.
|
|
32
|
+
*/
|
|
33
|
+
get_axle_position(axle_index: number, chassi_reference: ChassiReference): number
|
|
34
|
+
{
|
|
35
|
+
return this.axle_positions[axle_index]
|
|
36
|
+
+ this.chassi_reference_change_value(chassi_reference)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param pin_index - Zero-based pin index.
|
|
41
|
+
* @param chassi_reference - Reference frame.
|
|
42
|
+
* @returns Pin position.
|
|
43
|
+
*/
|
|
44
|
+
get_pin_position(pin_index: number, chassi_reference: ChassiReference): number
|
|
45
|
+
{
|
|
46
|
+
return this.pin_positions[pin_index]
|
|
47
|
+
+ this.chassi_reference_change_value(chassi_reference)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param grouper_index - Grouper id (1-based).
|
|
52
|
+
* @param chassi_reference - Reference frame.
|
|
53
|
+
* @returns Grouper end position.
|
|
54
|
+
*/
|
|
55
|
+
get_grouper_end(grouper_index: number, chassi_reference: ChassiReference): number
|
|
56
|
+
{
|
|
57
|
+
return this.grouper_end[grouper_index - 1]
|
|
58
|
+
+ this.chassi_reference_change_value(chassi_reference)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param chassi_reference - Reference frame.
|
|
63
|
+
* @returns Offset for reference change.
|
|
64
|
+
*/
|
|
65
|
+
private chassi_reference_change_value(chassi_reference: ChassiReference): number
|
|
66
|
+
{
|
|
67
|
+
if (chassi_reference === CHASSI_REFERENCE.GROUPER_1)
|
|
68
|
+
{
|
|
69
|
+
return 0
|
|
70
|
+
}
|
|
71
|
+
if (chassi_reference === CHASSI_REFERENCE.GROUPER_2)
|
|
72
|
+
{
|
|
73
|
+
return -this.grouper_start[1]
|
|
74
|
+
}
|
|
75
|
+
return this.first_axle_distance
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @param transport - Parsed transport.
|
|
80
|
+
*/
|
|
81
|
+
private calculate_axles_positions(transport: Transport): void
|
|
82
|
+
{
|
|
83
|
+
this.axle_positions = [-this.first_axle_distance]
|
|
84
|
+
const indexes = transport.axle_manager.list_axles_indexes()
|
|
85
|
+
for (let index = 1; index < indexes.length; index++)
|
|
86
|
+
{
|
|
87
|
+
const axle = transport.axle_manager.get_axle(index)
|
|
88
|
+
const previous = this.axle_positions[index - 1]
|
|
89
|
+
this.axle_positions.push(previous + axle.distance_from_previous_axle)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @param merged_containers - Merged grouper geometry.
|
|
95
|
+
*/
|
|
96
|
+
private calculate_groupers_positions(merged_containers: MergedContainers): void
|
|
97
|
+
{
|
|
98
|
+
const first = merged_containers.get_container_by_grouper_index(1)
|
|
99
|
+
this.grouper_start = [0]
|
|
100
|
+
this.grouper_end = [first.length]
|
|
101
|
+
if (merged_containers.list_grouper_indexes().length <= 1)
|
|
102
|
+
{
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
const second = merged_containers.get_container_by_grouper_index(2)
|
|
106
|
+
const second_start = this.grouper_end[0] + (second.container_distance_ahead ?? 0)
|
|
107
|
+
this.grouper_start.push(second_start)
|
|
108
|
+
this.grouper_end.push(second_start + second.length)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @param merged_containers - Merged grouper geometry.
|
|
113
|
+
*/
|
|
114
|
+
private calculate_pins_positions(merged_containers: MergedContainers): void
|
|
115
|
+
{
|
|
116
|
+
const first = merged_containers.get_container_by_grouper_index(1)
|
|
117
|
+
this.pin_positions = [first.main_pin_distance ?? 0]
|
|
118
|
+
if (merged_containers.list_grouper_indexes().length <= 1)
|
|
119
|
+
{
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
const second = merged_containers.get_container_by_grouper_index(2)
|
|
123
|
+
if (second.main_pin_distance === null)
|
|
124
|
+
{
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
const second_pin = this.grouper_start[1] + second.main_pin_distance
|
|
128
|
+
this.pin_positions.push(second_pin)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Container segment from wire JSON.
|
|
5
|
+
*/
|
|
6
|
+
export class ContainerRecord
|
|
7
|
+
{
|
|
8
|
+
length: number
|
|
9
|
+
width: number
|
|
10
|
+
height: number
|
|
11
|
+
sequence_index: number
|
|
12
|
+
main_pin_distance: number | null
|
|
13
|
+
container_distance_ahead: number | null
|
|
14
|
+
grouper: number
|
|
15
|
+
max_supported_weight: number
|
|
16
|
+
tare: number
|
|
17
|
+
supported_weight: number
|
|
18
|
+
raw: Record<string, unknown>
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param data - Raw container object.
|
|
22
|
+
*/
|
|
23
|
+
constructor(data: Record<string, unknown>)
|
|
24
|
+
{
|
|
25
|
+
this.length = Number(data[WIRE_FLAGS.LENGTH])
|
|
26
|
+
this.width = Number(data[WIRE_FLAGS.WIDTH])
|
|
27
|
+
this.height = Number(data[WIRE_FLAGS.HEIGHT])
|
|
28
|
+
this.sequence_index = Number(data[WIRE_FLAGS.SEQUENCE])
|
|
29
|
+
this.main_pin_distance = read_optional(data[WIRE_FLAGS.MAIN_PIN_DISTANCE])
|
|
30
|
+
this.container_distance_ahead = read_optional(data[WIRE_FLAGS.CONTAINER_DISTANCE_AHEAD])
|
|
31
|
+
this.grouper = Number(data[WIRE_FLAGS.GROUPER])
|
|
32
|
+
this.max_supported_weight = Number(data[WIRE_FLAGS.MAX_SUPPORTED_WEIGHT] ?? 0)
|
|
33
|
+
this.tare = Number(data[WIRE_FLAGS.TARE] ?? 0)
|
|
34
|
+
this.supported_weight = this.max_supported_weight - this.tare
|
|
35
|
+
this.raw = { ...data }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns Container volume (length × width × height).
|
|
40
|
+
*/
|
|
41
|
+
volume(): number
|
|
42
|
+
{
|
|
43
|
+
return this.length * this.width * this.height
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param value - Wire field value.
|
|
49
|
+
* @returns Number or null.
|
|
50
|
+
*/
|
|
51
|
+
function read_optional(value: unknown): number | null
|
|
52
|
+
{
|
|
53
|
+
if (value === undefined || value === null)
|
|
54
|
+
{
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
return Number(value)
|
|
58
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { GroupedContainers } from '../grouped_containers.js'
|
|
2
|
+
|
|
3
|
+
type MaxWeightInput = {
|
|
4
|
+
sequence_index: number
|
|
5
|
+
percentage_of_weight: number
|
|
6
|
+
total_max_supported_weight: number
|
|
7
|
+
tare: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const MAX_NECK_SUPPORTED = 6000
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Applies neck weight cap and redistributes excess to second container.
|
|
14
|
+
*/
|
|
15
|
+
export class ContainerMaxWeightCalculator
|
|
16
|
+
{
|
|
17
|
+
private neck_weight_reduction = 0
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param grouped_containers - Grouper containers.
|
|
21
|
+
*/
|
|
22
|
+
constructor(private readonly grouped_containers: GroupedContainers)
|
|
23
|
+
{}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param input - Sequence, share, capacity, and tare.
|
|
27
|
+
* @returns Max supported weight for container.
|
|
28
|
+
*/
|
|
29
|
+
calculate(input: MaxWeightInput): number
|
|
30
|
+
{
|
|
31
|
+
const max_supported = input.total_max_supported_weight * input.percentage_of_weight
|
|
32
|
+
if (this.is_neck(input.sequence_index))
|
|
33
|
+
{
|
|
34
|
+
const supported = max_supported - input.tare
|
|
35
|
+
if (supported > MAX_NECK_SUPPORTED)
|
|
36
|
+
{
|
|
37
|
+
this.neck_weight_reduction = supported - MAX_NECK_SUPPORTED
|
|
38
|
+
return input.tare + MAX_NECK_SUPPORTED
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (this.is_second_container(input.sequence_index))
|
|
42
|
+
{
|
|
43
|
+
return max_supported + this.neck_weight_reduction
|
|
44
|
+
}
|
|
45
|
+
return max_supported
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private is_neck(sequence_index: number): boolean
|
|
49
|
+
{
|
|
50
|
+
const list = this.grouped_containers.list_containers_sequence_indexes()
|
|
51
|
+
return list.length >= 2 && list[0] === sequence_index
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private is_second_container(sequence_index: number): boolean
|
|
55
|
+
{
|
|
56
|
+
const list = this.grouped_containers.list_containers_sequence_indexes()
|
|
57
|
+
return list.length >= 2 && list[1] === sequence_index
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Transport } from '../transport.js'
|
|
2
|
+
import type { GroupedContainers } from '../grouped_containers.js'
|
|
3
|
+
|
|
4
|
+
const NECK_SEQUENCE = 1
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Distributes grouper tare across containers (neck gets axle-1 share).
|
|
8
|
+
*/
|
|
9
|
+
export class ContainerTareCalculator
|
|
10
|
+
{
|
|
11
|
+
private revised_tare_percentage = 0
|
|
12
|
+
private first_neck_tare = 0
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param transport - Parsed transport.
|
|
16
|
+
* @param grouped_containers - Grouper containers.
|
|
17
|
+
*/
|
|
18
|
+
constructor(
|
|
19
|
+
private readonly transport: Transport,
|
|
20
|
+
private readonly grouped_containers: GroupedContainers
|
|
21
|
+
)
|
|
22
|
+
{}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param sequence_index - Container sequence.
|
|
26
|
+
* @param percentage_of_weight - Lateral area share.
|
|
27
|
+
* @param total_tare - Grouper total tare.
|
|
28
|
+
* @returns Container tare.
|
|
29
|
+
*/
|
|
30
|
+
calculate(
|
|
31
|
+
sequence_index: number,
|
|
32
|
+
percentage_of_weight: number,
|
|
33
|
+
total_tare: number
|
|
34
|
+
): number
|
|
35
|
+
{
|
|
36
|
+
if (this.is_first_neck(sequence_index))
|
|
37
|
+
{
|
|
38
|
+
this.calculate_tare_of_first_neck(percentage_of_weight)
|
|
39
|
+
this.tare_percentage_review(percentage_of_weight, total_tare)
|
|
40
|
+
return this.first_neck_tare
|
|
41
|
+
}
|
|
42
|
+
return (percentage_of_weight + this.revised_tare_percentage) * total_tare
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private is_first_neck(sequence_index: number): boolean
|
|
46
|
+
{
|
|
47
|
+
return this.grouped_containers.list_containers_sequence_indexes().length >= 2
|
|
48
|
+
&& sequence_index === NECK_SEQUENCE
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private calculate_tare_of_first_neck(percentage_of_weight: number): void
|
|
52
|
+
{
|
|
53
|
+
const neck = this.grouped_containers.get_container_by_sequence_index(NECK_SEQUENCE)
|
|
54
|
+
const axle1 = this.axle1_on_neck_tare_contribution(neck.length)
|
|
55
|
+
const remaining = percentage_of_weight * (
|
|
56
|
+
this.transport.axle_manager.get_axle(1).tare
|
|
57
|
+
+ this.transport.axle_manager.get_axle(2).tare)
|
|
58
|
+
this.first_neck_tare = axle1 + remaining
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private tare_percentage_review(percentage_of_weight: number, total_tare: number): void
|
|
62
|
+
{
|
|
63
|
+
const tare = percentage_of_weight * total_tare
|
|
64
|
+
const change = (this.first_neck_tare - tare) / total_tare
|
|
65
|
+
const count = this.grouped_containers.list_containers_sequence_indexes().length
|
|
66
|
+
this.revised_tare_percentage = -change / (count - 1)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private axle1_on_neck_tare_contribution(neck_length: number): number
|
|
70
|
+
{
|
|
71
|
+
const end_container = this.transport.first_axle_distance + neck_length
|
|
72
|
+
const end_grouper = this.transport.first_axle_distance + this.grouped_containers.length
|
|
73
|
+
const share = end_container / end_grouper
|
|
74
|
+
return share * this.transport.axle_manager.get_axle(0).tare
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Transport } from '../transport.js'
|
|
2
|
+
import { MergedContainers } from '../merged_containers.js'
|
|
3
|
+
import { MergedContainersWeightCalculator } from './merged_containers_weight_calculator.js'
|
|
4
|
+
import { SingleContainerWeightCalculator } from './single_container_weight_calculator.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Computes per-container supported cargo capacity.
|
|
8
|
+
*/
|
|
9
|
+
export class ContainerWeightModel
|
|
10
|
+
{
|
|
11
|
+
private readonly merged_containers: MergedContainers
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param transport - Parsed transport.
|
|
15
|
+
*/
|
|
16
|
+
constructor(private readonly transport: Transport)
|
|
17
|
+
{
|
|
18
|
+
this.merged_containers = new MergedContainers(transport)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Updates container supported_weight on transport. */
|
|
22
|
+
calculate(): void
|
|
23
|
+
{
|
|
24
|
+
const axles = this.transport.axle_manager.list_axles_indexes()
|
|
25
|
+
.map((index) => this.transport.axle_manager.get_axle(index))
|
|
26
|
+
new MergedContainersWeightCalculator(this.merged_containers, axles).calculate()
|
|
27
|
+
for (const grouper of this.merged_containers.list_grouper_indexes())
|
|
28
|
+
{
|
|
29
|
+
const grouped = this.merged_containers.get_container_by_grouper_index(grouper)
|
|
30
|
+
new SingleContainerWeightCalculator(this.transport, grouped).calculate()
|
|
31
|
+
}
|
|
32
|
+
for (const sequence of this.transport.list_containers_sequence_indexes())
|
|
33
|
+
{
|
|
34
|
+
const container = this.transport.get_container_by_sequence_index(sequence)
|
|
35
|
+
container.supported_weight = container.max_supported_weight - container.tare
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MergedContainers } from '../merged_containers.js'
|
|
2
|
+
import type { AxleRecord } from '../axle_record.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Sums axle capacity and tare onto merged grouper containers.
|
|
6
|
+
*/
|
|
7
|
+
export class MergedContainersWeightCalculator
|
|
8
|
+
{
|
|
9
|
+
/**
|
|
10
|
+
* @param merged_containers - Grouper layout.
|
|
11
|
+
* @param transport_axles_list - All axles.
|
|
12
|
+
*/
|
|
13
|
+
constructor(
|
|
14
|
+
private readonly merged_containers: MergedContainers,
|
|
15
|
+
private readonly transport_axles_list: AxleRecord[]
|
|
16
|
+
)
|
|
17
|
+
{}
|
|
18
|
+
|
|
19
|
+
/** Applies summed max weight and tare to each merged grouper container. */
|
|
20
|
+
calculate(): void
|
|
21
|
+
{
|
|
22
|
+
for (const grouper of this.merged_containers.list_grouper_indexes())
|
|
23
|
+
{
|
|
24
|
+
const grouped = this.merged_containers.get_container_by_grouper_index(grouper)
|
|
25
|
+
const sequences = grouped.list_containers_sequence_indexes()
|
|
26
|
+
const merged = grouped.merged_container!
|
|
27
|
+
merged.max_supported_weight = 0
|
|
28
|
+
merged.tare = 0
|
|
29
|
+
for (const axle of this.transport_axles_list)
|
|
30
|
+
{
|
|
31
|
+
if (sequences.includes(axle.sequence_index))
|
|
32
|
+
{
|
|
33
|
+
merged.max_supported_weight += axle.max_supported_weight
|
|
34
|
+
merged.tare += axle.tare
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Transport } from '../transport.js'
|
|
2
|
+
import type { GroupedContainers } from '../grouped_containers.js'
|
|
3
|
+
import type { ContainerRecord } from '../container_record.js'
|
|
4
|
+
import { ContainerTareCalculator } from './container_tare_calculator.js'
|
|
5
|
+
import { ContainerMaxWeightCalculator } from './container_max_weight_calculator.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Splits grouper capacity across containers by lateral area.
|
|
9
|
+
*/
|
|
10
|
+
export class SingleContainerWeightCalculator
|
|
11
|
+
{
|
|
12
|
+
private readonly tare_calculator: ContainerTareCalculator
|
|
13
|
+
private readonly max_calculator: ContainerMaxWeightCalculator
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param transport - Parsed transport.
|
|
17
|
+
* @param grouped_containers - Grouper containers.
|
|
18
|
+
*/
|
|
19
|
+
constructor(
|
|
20
|
+
transport: Transport,
|
|
21
|
+
private readonly grouped_containers: GroupedContainers
|
|
22
|
+
)
|
|
23
|
+
{
|
|
24
|
+
this.tare_calculator = new ContainerTareCalculator(transport, grouped_containers)
|
|
25
|
+
this.max_calculator = new ContainerMaxWeightCalculator(grouped_containers)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Assigns max_supported_weight and tare per container in grouper. */
|
|
29
|
+
calculate(): void
|
|
30
|
+
{
|
|
31
|
+
const total_area = this.total_lateral_area()
|
|
32
|
+
const merged = this.grouped_containers.merged_container!
|
|
33
|
+
const total_max = merged.max_supported_weight
|
|
34
|
+
const total_tare = merged.tare
|
|
35
|
+
for (const sequence of this.grouped_containers.list_containers_sequence_indexes())
|
|
36
|
+
{
|
|
37
|
+
const container = this.grouped_containers.get_container_by_sequence_index(sequence)
|
|
38
|
+
const share = this.lateral_area(container) / total_area
|
|
39
|
+
const tare = this.tare_calculator.calculate(sequence, share, total_tare)
|
|
40
|
+
container.max_supported_weight = this.max_calculator.calculate({
|
|
41
|
+
sequence_index: sequence,
|
|
42
|
+
percentage_of_weight: share,
|
|
43
|
+
total_max_supported_weight: total_max,
|
|
44
|
+
tare
|
|
45
|
+
})
|
|
46
|
+
container.tare = tare
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private total_lateral_area(): number
|
|
51
|
+
{
|
|
52
|
+
let total = 0
|
|
53
|
+
for (const sequence of this.grouped_containers.list_containers_sequence_indexes())
|
|
54
|
+
{
|
|
55
|
+
total += this.lateral_area(
|
|
56
|
+
this.grouped_containers.get_container_by_sequence_index(sequence))
|
|
57
|
+
}
|
|
58
|
+
return total
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private lateral_area(container: ContainerRecord): number
|
|
62
|
+
{
|
|
63
|
+
return container.length * container.height
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ContainerRecord } from './container_record.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Containers merged per grouper.
|
|
5
|
+
*/
|
|
6
|
+
export class GroupedContainers
|
|
7
|
+
{
|
|
8
|
+
grouper: number
|
|
9
|
+
merged_container: ContainerRecord | null = null
|
|
10
|
+
private containers = new Map<number, ContainerRecord>()
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param grouper - Grouper id.
|
|
14
|
+
*/
|
|
15
|
+
constructor(grouper: number)
|
|
16
|
+
{
|
|
17
|
+
this.grouper = grouper
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get length(): number
|
|
21
|
+
{
|
|
22
|
+
return this.merged_container!.length
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get container_distance_ahead(): number | null
|
|
26
|
+
{
|
|
27
|
+
return this.merged_container!.container_distance_ahead
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get main_pin_distance(): number | null
|
|
31
|
+
{
|
|
32
|
+
return this.merged_container!.main_pin_distance
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param container - Container to add.
|
|
37
|
+
*/
|
|
38
|
+
add_container(container: ContainerRecord): void
|
|
39
|
+
{
|
|
40
|
+
if (container.grouper === this.grouper)
|
|
41
|
+
{
|
|
42
|
+
this.containers.set(container.sequence_index, container)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Merges segment lengths into first container of grouper.
|
|
48
|
+
*/
|
|
49
|
+
generate_merged_container(): void
|
|
50
|
+
{
|
|
51
|
+
const sequence_indexes = this.list_containers_sequence_indexes()
|
|
52
|
+
const first = this.get_container_by_sequence_index(sequence_indexes[0])
|
|
53
|
+
this.merged_container = clone_container(first)
|
|
54
|
+
for (let index = 1; index < sequence_indexes.length; index++)
|
|
55
|
+
{
|
|
56
|
+
const next = this.get_container_by_sequence_index(sequence_indexes[index])
|
|
57
|
+
this.merged_container.length += next.length
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param sequence_index - Container sequence.
|
|
63
|
+
* @returns Container record.
|
|
64
|
+
*/
|
|
65
|
+
get_container_by_sequence_index(sequence_index: number): ContainerRecord
|
|
66
|
+
{
|
|
67
|
+
const container = this.containers.get(sequence_index)
|
|
68
|
+
if (!container)
|
|
69
|
+
{
|
|
70
|
+
throw new Error(`Missing container ${sequence_index}`)
|
|
71
|
+
}
|
|
72
|
+
return container
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @returns Sorted sequence indexes.
|
|
77
|
+
*/
|
|
78
|
+
list_containers_sequence_indexes(): number[]
|
|
79
|
+
{
|
|
80
|
+
return [...this.containers.keys()].sort((left, right) => left - right)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @param source - Container to clone.
|
|
86
|
+
* @returns Shallow clone with same wire fields.
|
|
87
|
+
*/
|
|
88
|
+
function clone_container(source: ContainerRecord): ContainerRecord
|
|
89
|
+
{
|
|
90
|
+
return new ContainerRecord({ ...source.raw })
|
|
91
|
+
}
|