qualia_core_db/domains/financial/economics/
resilience.rs1pub fn resilience_resource_pricing(
5 stock: &[f64],
6 survival_demand: &[f64],
7 production_cost: &[f64],
8 survival_premium: f64,
9 n: usize,
10 price_out: &mut [f64],
11 tradeable_surplus_out: &mut [f64],
12) -> usize {
13 let count = n
14 .min(stock.len())
15 .min(survival_demand.len())
16 .min(production_cost.len())
17 .min(price_out.len())
18 .min(tradeable_surplus_out.len());
19 for i in 0..count {
20 let demand = survival_demand[i];
21 let cost = production_cost[i];
22 if demand <= 0.0 {
23 price_out[i] = cost;
24 tradeable_surplus_out[i] = stock[i].max(0.0);
25 continue;
26 }
27 let coverage = stock[i] / demand;
28 if coverage < 1.0 {
29 let c = coverage.clamp(0.0, 1.0);
30 price_out[i] = cost * (1.0 + (survival_premium - 1.0).max(0.0) * (1.0 - c));
31 tradeable_surplus_out[i] = 0.0;
32 } else {
33 price_out[i] = cost;
34 tradeable_surplus_out[i] = stock[i] - demand;
35 }
36 }
37 count
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn resilience_pricing_prioritizes_survival() {
46 let stock = [5.0, 20.0];
47 let demand = [10.0, 10.0];
48 let cost = [2.0, 2.0];
49 let mut price = [0.0f64; 2];
50 let mut surplus = [0.0f64; 2];
51 let n =
52 resilience_resource_pricing(&stock, &demand, &cost, 3.0, 2, &mut price, &mut surplus);
53 assert_eq!(n, 2);
54 assert!((price[0] - 4.0).abs() < 1e-9);
55 assert_eq!(surplus[0], 0.0);
56 assert!((price[1] - 2.0).abs() < 1e-9);
57 assert!((surplus[1] - 10.0).abs() < 1e-9);
58 }
59}