@jetta/cargo-stabilizer 0.1.0-10 → 0.1.0-11
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/build/core/adapters/axle_adapter.d.ts.map +1 -1
- package/build/core/adapters/axle_adapter.js +5 -1
- package/build/core/adapters/coordinate_mapper.d.ts +1 -1
- package/build/core/adapters/coordinate_mapper.js +1 -1
- package/build/core/geometry/has_penetrating_overlap.d.ts +9 -0
- package/build/core/geometry/has_penetrating_overlap.d.ts.map +1 -0
- package/build/core/geometry/has_penetrating_overlap.js +27 -0
- package/build/core/strategies/reorder/BeamSearchReorder.d.ts.map +1 -1
- package/build/core/strategies/reorder/BeamSearchReorder.js +2 -2
- package/build/core/strategies/reorder/select_surviving_beam.d.ts +10 -0
- package/build/core/strategies/reorder/select_surviving_beam.d.ts.map +1 -0
- package/build/core/strategies/reorder/select_surviving_beam.js +12 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axle_adapter.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/axle_adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"axle_adapter.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/axle_adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAA;AAEvF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAGT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAejF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { run_axle_calculator } from './run_axle_calculator.js';
|
|
2
|
+
import { has_penetrating_overlap } from '../geometry/has_penetrating_overlap.js';
|
|
2
3
|
/**
|
|
3
4
|
* @param final_kg - Loaded weight including tare.
|
|
4
5
|
* @param max_kg - Axle supported max.
|
|
@@ -20,11 +21,14 @@ export function is_axle_load_valid(env, folga_pct) {
|
|
|
20
21
|
}
|
|
21
22
|
const result = run_axle_calculator(env);
|
|
22
23
|
if (!result.calculated) {
|
|
23
|
-
return
|
|
24
|
+
return is_false_positive_overlap(env, result.reason);
|
|
24
25
|
}
|
|
25
26
|
const containers = (result.env.containers ?? []);
|
|
26
27
|
return containers.every(container => container_axles_within_folga(container, folga_pct));
|
|
27
28
|
}
|
|
29
|
+
function is_false_positive_overlap(env, reason) {
|
|
30
|
+
return reason.includes('Item overlap error') && !has_penetrating_overlap(env.containers);
|
|
31
|
+
}
|
|
28
32
|
function container_axles_within_folga(container, folga_pct) {
|
|
29
33
|
const axles = (container.pesoEixos ?? []);
|
|
30
34
|
return axles.every(axle => {
|
|
@@ -15,7 +15,7 @@ export interface StabilityContainerPayload {
|
|
|
15
15
|
item_list: StabilityItemPayload[];
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* Maps contract coordinates
|
|
18
|
+
* Maps contract CM coordinates onto cargo-stability axes (y = height, z = length).
|
|
19
19
|
* @param item - Stabilizer item record.
|
|
20
20
|
* @returns Stability item payload entry.
|
|
21
21
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { item_to_box } from '../geometry/box_geometry.js';
|
|
2
2
|
/**
|
|
3
|
-
* Maps contract coordinates
|
|
3
|
+
* Maps contract CM coordinates onto cargo-stability axes (y = height, z = length).
|
|
4
4
|
* @param item - Stabilizer item record.
|
|
5
5
|
* @returns Stability item payload entry.
|
|
6
6
|
*/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StabilizerContainer } from '../validation/contract/stabilizer_domain_schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* True when any two items penetrate in the axle-calculator CM frame
|
|
4
|
+
* (x + width, y + depth, z + height) by more than a face-touch epsilon.
|
|
5
|
+
* @param containers - Layout to inspect.
|
|
6
|
+
* @returns True when a pair occupies the same volume beyond float error.
|
|
7
|
+
*/
|
|
8
|
+
export declare function has_penetrating_overlap(containers: StabilizerContainer[]): boolean;
|
|
9
|
+
//# sourceMappingURL=has_penetrating_overlap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has_penetrating_overlap.d.ts","sourceRoot":"","sources":["../../../src/core/geometry/has_penetrating_overlap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,oDAAoD,CAAA;AAI7G;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAGlF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const PENETRATION_EPSILON = 1e-6;
|
|
2
|
+
/**
|
|
3
|
+
* True when any two items penetrate in the axle-calculator CM frame
|
|
4
|
+
* (x + width, y + depth, z + height) by more than a face-touch epsilon.
|
|
5
|
+
* @param containers - Layout to inspect.
|
|
6
|
+
* @returns True when a pair occupies the same volume beyond float error.
|
|
7
|
+
*/
|
|
8
|
+
export function has_penetrating_overlap(containers) {
|
|
9
|
+
return containers.some(container => container_has_penetrating_overlap(container));
|
|
10
|
+
}
|
|
11
|
+
function container_has_penetrating_overlap(container) {
|
|
12
|
+
const items = container.items;
|
|
13
|
+
for (let i = 0; i < items.length; i++) {
|
|
14
|
+
for (let j = i + 1; j < items.length; j++) {
|
|
15
|
+
if (items_penetrate(items[i], items[j])) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
function items_penetrate(left, right) {
|
|
23
|
+
return interval_penetration({ min: left.x, max: left.x + left.width }, { min: right.x, max: right.x + right.width }) && interval_penetration({ min: left.y, max: left.y + left.depth }, { min: right.y, max: right.y + right.depth }) && interval_penetration({ min: left.z, max: left.z + left.height }, { min: right.z, max: right.z + right.height });
|
|
24
|
+
}
|
|
25
|
+
function interval_penetration(left, right) {
|
|
26
|
+
return Math.min(left.max, right.max) - Math.max(left.min, right.min) > PENETRATION_EPSILON;
|
|
27
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BeamSearchReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/BeamSearchReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;
|
|
1
|
+
{"version":3,"file":"BeamSearchReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/BeamSearchReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;AAchG;;GAEG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IAErD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE;CAkBtD"}
|
|
@@ -4,6 +4,7 @@ import { select_beam_expansion_candidates } from './select_beam_expansion_candid
|
|
|
4
4
|
import { apply_move, clone_containers } from '../../move/apply_move.js';
|
|
5
5
|
import { evaluate_trial_layout, evaluation_context_from_reorder } from '../../evaluation/state_evaluator.js';
|
|
6
6
|
import { read_item_score } from '../../adapters/stability_adapter.js';
|
|
7
|
+
import { select_surviving_beam } from './select_surviving_beam.js';
|
|
7
8
|
/**
|
|
8
9
|
* Beam search reorder with configurable width and top-K expansion.
|
|
9
10
|
*/
|
|
@@ -34,8 +35,7 @@ function expand_beam(request) {
|
|
|
34
35
|
loose: request.loose
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
|
-
expanded
|
|
38
|
-
return expanded.slice(0, request.reorder.config.beam_width);
|
|
38
|
+
return select_surviving_beam(expanded, request.beam, request.reorder.config.beam_width);
|
|
39
39
|
}
|
|
40
40
|
function append_beam_branches(beam_context) {
|
|
41
41
|
const { reorder, evaluation, expanded, state, loose } = beam_context;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BeamState } from './beam_context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Keeps ranked expansions, or the parent beam when every trial failed the gates.
|
|
4
|
+
* @param expanded - Trial states that passed gates.
|
|
5
|
+
* @param parent_beam - Beam states before this item's expansion.
|
|
6
|
+
* @param beam_width - Maximum states to keep.
|
|
7
|
+
* @returns Next beam, never empty when the parent beam had states.
|
|
8
|
+
*/
|
|
9
|
+
export declare function select_surviving_beam(expanded: BeamState[], parent_beam: BeamState[], beam_width: number): BeamState[];
|
|
10
|
+
//# sourceMappingURL=select_surviving_beam.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select_surviving_beam.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/select_surviving_beam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,SAAS,EAAE,EACrB,WAAW,EAAE,SAAS,EAAE,EACxB,UAAU,EAAE,MAAM,GACnB,SAAS,EAAE,CAKb"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps ranked expansions, or the parent beam when every trial failed the gates.
|
|
3
|
+
* @param expanded - Trial states that passed gates.
|
|
4
|
+
* @param parent_beam - Beam states before this item's expansion.
|
|
5
|
+
* @param beam_width - Maximum states to keep.
|
|
6
|
+
* @returns Next beam, never empty when the parent beam had states.
|
|
7
|
+
*/
|
|
8
|
+
export function select_surviving_beam(expanded, parent_beam, beam_width) {
|
|
9
|
+
const ranked = [...parent_beam, ...expanded]
|
|
10
|
+
.sort((left, right) => right.objective - left.objective);
|
|
11
|
+
return ranked.slice(0, beam_width);
|
|
12
|
+
}
|