| Goal
|
|
|
| Fix GitLab issue #47 for the librae project: "factor the produce()", specifically to create good-specific template functions for produce() similar to how perform_trade() was implemented.
|
|
|
| Constraints & Preferences
|
|
|
| - Maintain semantic equivalence with the previous hardcoded farm/sifter logic.
|
| - Use generic functions with trait bounds (EconomicAsset, ProducedGood) to handle different asset types.
|
| - Avoid mutable borrow conflicts when processing multiple assets sequentially on the same planet.
|
| - Ensure tracing dependency uses the specific git branch dm/filter with env-filter feature to resolve build errors.
|
| - Equivalence tests must account for rounding differences between Unit (integer-based) and Rational (exact) arithmetic by filtering input ranges.
|
|
|
| Progress
|
|
|
| ### Done
|
|
|
| - [x] Identified codebase location (/home/pi/pi/librae-47) and fetched issue details.
|
| - [x] Located produce() and perform_trade() in rustorion/src/universe.rs.
|
| - [x] Initial refactored universe.rs to introduce a generic produce_good function.
|
| - [x] Iteratively patched universe.rs to resolve initial type errors regarding trait bounds and return types.
|
| - [x] Refactored produce_good to accept demand and stock as explicit parameters.
|
| - [x] Split produce_good into produce_good (wrapper) and produce_good_inner (core logic).
|
| - [x] Defined a new ProducedGood trait with production_cost and workforce_cost methods.
|
| - [x] Updated EconomicAsset trait to require type Good: ProducedGood.
|
| - [x] Implemented ProducedGood for Food and Fuel.
|
| - [x] Resolved mutable borrow conflicts in produce() by creating produce_good_from_own_stock.
|
| - [x] Added farms_reference function and produce_good_matches_previous_produce_logic (renamed to produce_good_matches_farms_reference) test to verify equivalence for farms.
|
| - [x] Renamed maintenance_cost to production_cost in ProducedGood trait.
|
| - [x] Successfully compiled rustorion and fixed Cargo.toml dependencies.
|
| - [x] Simplified produce() logic using new wrapper functions.
|
| - [x] Added sifters_reference function to model old sifter logic for equivalence testing.
|
|
|
| ### In Progress
|
|
|
| - [ ] Fix produce_good_matches_sifters_reference test failure.
|
| - [ ] Resolve overflow panic in test_galactic_war caused by TryFromIntError(PosOverflow) in units.rs.
|
| - [ ] Fix remaining test failures and compilation warnings in universe.rs.
|
|
|
| ### Blocked
|
|
|
| - Overflow Error: The test test_galactic_war fails with TryFromIntError(PosOverflow) at units.rs:261. This occurs when converting a large Rational value to i128/i64 via try_into().unwrap(). The multiplication Rational::from(need).mul(workforce_cost) or similar operations might
|
| be producing values that exceed the safe range for conversion.
|
| - Sifter Equivalence Test: Currently failing with assertion mismatches (e.g., left: Unit { microunits: 3191506... } right: Unit { microunits: 1524606... }). The logic for filtering "exactly comparable" draws is still being refined to handle rounding differences in Unit vs
|
| Rational arithmetic when workforce/assets are constraints.
|
|
|
| Key Decisions
|
|
|
| - Trait Separation: Created ProducedGood trait to hold production_cost and workforce_cost for the produced unit (Food/Fuel), while EconomicAsset holds costs for the asset itself (Farm/Sifter).
|
| - Parameter Injection: produce_good now takes demand and stock as arguments.
|
| - Borrow Workaround: For FuelSifter production, a dedicated produce_good_from_own_stock function was created.
|
| - Method Renaming: Renamed maintenance_cost to production_cost in ProducedGood.
|
| - Test Scope Restriction: Random inputs are filtered to ensure demand >= stock and resources strictly cover needs to avoid rounding artifacts in the farm test. Similar strict filtering is being applied to the sifter test.
|
| - Dependency Fix: Corrected Cargo.toml to use git = "https://github.com/mladedav/tracing.git" with branch = "dm/filter".
|
| - Simplification Attempt: Removed sifted_fuel copy in produce() to simplify code.
|
| - Rational Casting: In tests, Rational::from requires explicit casting from integers (e.g., Rational::from(i128)) rather than direct .into() for i64/u64 in some contexts, requiring i128 casts for multiplication factors.
|
|
|
| Next Steps
|
|
|
| 1. Debug the produce_good_matches_sifters_reference test failure by analyzing the specific seed mismatch (e.g., seed 11402) and refining the filter conditions to match the exact rounding behavior of Unit::from(Rational) vs Rational operations.
|
| 2. Investigate the TryFromIntError(PosOverflow) in test_galactic_war. Check if the Rational to Unit conversion logic in units.rs needs to handle larger values or if the test inputs are unrealistic.
|
| 3. Update test_galactic_war or the production logic to prevent overflow.
|
| 4. Re-run cargo test to ensure all tests pass.
|
|
|
| Critical Context
|
|
|
| - File: /home/pi/pi/librae-47/rustorion/src/universe.rs is the primary file being modified.
|
| - Traits:
|
| - ProducedGood: UnitType: Methods production_cost, workforce_cost.
|
| - EconomicAsset: UnitType: Associated type Good: ProducedGood.
|
| - Functions: produce_good, produce_good_inner, produce_good_from_own_stock, farms_reference, sifters_reference.
|
| - Tests: produce_good_matches_farms_reference (passing), produce_good_matches_sifters_reference (failing).
|
| - Arithmetic: Unit types use microunits and perform rounding. Rational types are exact. The test logic relies on ensuring that when ratio == 1, the rounding effects are minimized or identical.
|
| - Overflow Issue: Occurs in units.rs line 261: Unit::from_microunits(r.mul(1_000_000).round().to_integer().try_into().unwrap()).
|
| - Sifter Test Logic: The sifter test compares produce_good_from_own_stock logic against sifters_reference. The mismatch suggests that Rational::from(assets).min(...) vs assets.min(...) or the handling of workers_needed vs workforce ratio calculation introduces subtle differences
|
| when not perfectly aligned.
|