Skip to content

Commit ab8137f

Browse files
committed
Make ObjectiveCoefficients Rc to remove need for deep copy
1 parent 2da91a0 commit ab8137f

3 files changed

Lines changed: 20 additions & 18 deletions

File tree

src/fixture.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,11 @@ pub fn appraisal_output(asset: Asset, time_slice: TimeSliceID) -> AppraisalOutpu
386386
AppraisalOutput {
387387
asset: AssetRef::from(asset),
388388
capacity: AssetCapacity::Continuous(Capacity(42.0)),
389-
coefficients: ObjectiveCoefficients {
389+
coefficients: Rc::new(ObjectiveCoefficients {
390390
capacity_coefficient: MoneyPerCapacity(2.14),
391391
activity_coefficients,
392392
unmet_demand_coefficient: MoneyPerFlow(10000.0),
393-
},
393+
}),
394394
activity,
395395
unmet_demand,
396396
metric: Box::new(LCOXMetric::new(MoneyPerActivity(4.14))),

src/simulation/investment/appraisal.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use indexmap::IndexMap;
1414
use serde::Serialize;
1515
use std::any::Any;
1616
use std::cmp::Ordering;
17+
use std::rc::Rc;
1718

1819
pub mod coefficients;
1920
mod constraints;
@@ -60,7 +61,7 @@ pub struct AppraisalOutput {
6061
/// The comparison metric to compare investment decisions
6162
pub metric: Box<dyn MetricTrait>,
6263
/// Capacity and activity coefficients used in the appraisal
63-
pub coefficients: ObjectiveCoefficients,
64+
pub coefficients: Rc<ObjectiveCoefficients>,
6465
}
6566

6667
impl AppraisalOutput {
@@ -223,7 +224,7 @@ fn calculate_lcox(
223224
asset: &AssetRef,
224225
max_capacity: Option<AssetCapacity>,
225226
commodity: &Commodity,
226-
coefficients: &ObjectiveCoefficients,
227+
coefficients: &Rc<ObjectiveCoefficients>,
227228
demand: &DemandMap,
228229
) -> Result<AppraisalOutput> {
229230
let results = perform_optimisation(
@@ -263,7 +264,7 @@ fn calculate_npv(
263264
asset: &AssetRef,
264265
max_capacity: Option<AssetCapacity>,
265266
commodity: &Commodity,
266-
coefficients: &ObjectiveCoefficients,
267+
coefficients: &Rc<ObjectiveCoefficients>,
267268
demand: &DemandMap,
268269
) -> Result<AppraisalOutput> {
269270
let results = perform_optimisation(
@@ -311,7 +312,7 @@ pub fn appraise_investment(
311312
max_capacity: Option<AssetCapacity>,
312313
commodity: &Commodity,
313314
objective_type: &ObjectiveType,
314-
coefficients: &ObjectiveCoefficients,
315+
coefficients: &Rc<ObjectiveCoefficients>,
315316
demand: &DemandMap,
316317
) -> Result<AppraisalOutput> {
317318
let appraisal_method = match objective_type {
@@ -526,6 +527,14 @@ mod tests {
526527
assert!(compare_asset_fallback(&asset2, &asset3).is_gt());
527528
}
528529

530+
fn objective_coeffs() -> Rc<ObjectiveCoefficients> {
531+
Rc::new(ObjectiveCoefficients {
532+
capacity_coefficient: MoneyPerCapacity(0.0),
533+
activity_coefficients: IndexMap::new(),
534+
unmet_demand_coefficient: MoneyPerFlow(0.0),
535+
})
536+
}
537+
529538
/// Creates appraisal from corresponding assets and metrics
530539
///
531540
/// # Panics
@@ -547,11 +556,7 @@ mod tests {
547556
.map(|(asset, metric)| AppraisalOutput {
548557
asset: AssetRef::from(asset),
549558
capacity: AssetCapacity::Continuous(Capacity(10.0)),
550-
coefficients: ObjectiveCoefficients {
551-
capacity_coefficient: MoneyPerCapacity(0.0),
552-
activity_coefficients: IndexMap::new(),
553-
unmet_demand_coefficient: MoneyPerFlow(0.0),
554-
},
559+
coefficients: objective_coeffs(),
555560
activity: IndexMap::new(),
556561
unmet_demand: IndexMap::new(),
557562
metric,
@@ -876,11 +881,7 @@ mod tests {
876881
.map(|metric| AppraisalOutput {
877882
asset: AssetRef::from(asset.clone()),
878883
capacity: AssetCapacity::Continuous(Capacity(0.0)),
879-
coefficients: ObjectiveCoefficients {
880-
capacity_coefficient: MoneyPerCapacity(0.0),
881-
activity_coefficients: IndexMap::new(),
882-
unmet_demand_coefficient: MoneyPerFlow(0.0),
883-
},
884+
coefficients: objective_coeffs(),
884885
activity: IndexMap::new(),
885886
unmet_demand: IndexMap::new(),
886887
metric,

src/simulation/investment/appraisal/coefficients.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::time_slice::{TimeSliceID, TimeSliceInfo};
88
use crate::units::{MoneyPerActivity, MoneyPerCapacity, MoneyPerFlow};
99
use indexmap::IndexMap;
1010
use std::collections::HashMap;
11+
use std::rc::Rc;
1112

1213
/// Map storing cost coefficients for an asset.
1314
///
@@ -31,7 +32,7 @@ pub fn calculate_coefficients_for_assets(
3132
assets: &[AssetRef],
3233
prices: &CommodityPrices,
3334
year: u32,
34-
) -> HashMap<AssetRef, ObjectiveCoefficients> {
35+
) -> HashMap<AssetRef, Rc<ObjectiveCoefficients>> {
3536
assets
3637
.iter()
3738
.map(|asset| {
@@ -47,7 +48,7 @@ pub fn calculate_coefficients_for_assets(
4748
calculate_coefficients_for_npv(asset, &model.time_slice_info, prices, year)
4849
}
4950
};
50-
(asset.clone(), coefficient)
51+
(asset.clone(), Rc::new(coefficient))
5152
})
5253
.collect()
5354
}

0 commit comments

Comments
 (0)