pub struct Asset {
state: AssetState,
process: Rc<Process>,
activity_limits: Rc<ActivityLimits>,
flows: Rc<IndexMap<CommodityID, ProcessFlow>>,
process_parameter: Rc<ProcessParameter>,
region_id: RegionID,
capacity: AssetCapacity,
commission_year: u32,
max_decommission_year: u32,
}Expand description
An asset controlled by an agent.
Fields§
§state: AssetStateThe status of the asset
process: Rc<Process>The Process that this asset corresponds to
activity_limits: Rc<ActivityLimits>Activity limits for this asset
flows: Rc<IndexMap<CommodityID, ProcessFlow>>The commodity flows for this asset
process_parameter: Rc<ProcessParameter>The ProcessParameter corresponding to the asset’s region and commission year
region_id: RegionIDThe region in which the asset is located
capacity: AssetCapacityCapacity of asset (for candidates this is a hypothetical capacity which may be altered)
commission_year: u32The year the asset was/will be commissioned
max_decommission_year: u32The maximum year that the asset could be decommissioned
Implementations§
Source§impl Asset
impl Asset
Sourcepub fn new_candidate(
process: Rc<Process>,
region_id: RegionID,
capacity: Capacity,
commission_year: u32,
) -> Result<Self>
pub fn new_candidate( process: Rc<Process>, region_id: RegionID, capacity: Capacity, commission_year: u32, ) -> Result<Self>
Create a new candidate asset
Sourcepub fn new_candidate_for_dispatch(
process: Rc<Process>,
region_id: RegionID,
capacity: Capacity,
commission_year: u32,
) -> Result<Self>
pub fn new_candidate_for_dispatch( process: Rc<Process>, region_id: RegionID, capacity: Capacity, commission_year: u32, ) -> Result<Self>
Create a new candidate for use in dispatch runs
These candidates will have a single continuous capacity specified by the model parameter
candidate_asset_capacity, regardless of whether the underlying process is divisible or
not.
Sourcepub fn new_candidate_from_commissioned(asset: &Asset) -> Self
pub fn new_candidate_from_commissioned(asset: &Asset) -> Self
Create a new candidate asset from a commissioned asset
Sourcefn new_with_state(
state: AssetState,
process: Rc<Process>,
region_id: RegionID,
capacity: AssetCapacity,
commission_year: u32,
max_decommission_year: Option<u32>,
) -> Result<Self>
fn new_with_state( state: AssetState, process: Rc<Process>, region_id: RegionID, capacity: AssetCapacity, commission_year: u32, max_decommission_year: Option<u32>, ) -> Result<Self>
Private helper to create an asset with the given state
Sourcepub fn state(&self) -> &AssetState
pub fn state(&self) -> &AssetState
Get the state of this asset
Sourcepub fn process_parameter(&self) -> &ProcessParameter
pub fn process_parameter(&self) -> &ProcessParameter
The process parameter for this asset
Sourcepub fn max_decommission_year(&self) -> u32
pub fn max_decommission_year(&self) -> u32
The last year in which this asset should be decommissioned
Sourcepub fn get_activity_per_capacity_limits(
&self,
time_slice: &TimeSliceID,
) -> RangeInclusive<ActivityPerCapacity>
pub fn get_activity_per_capacity_limits( &self, time_slice: &TimeSliceID, ) -> RangeInclusive<ActivityPerCapacity>
Get the activity limits per unit of capacity for this asset in a particular time slice
Sourcepub fn get_activity_limits_for_selection(
&self,
time_slice_selection: &TimeSliceSelection,
) -> RangeInclusive<Activity>
pub fn get_activity_limits_for_selection( &self, time_slice_selection: &TimeSliceSelection, ) -> RangeInclusive<Activity>
Get the activity limits for this asset for a given time slice selection
Sourcepub fn get_activity_per_capacity_limits_for_selection(
&self,
time_slice_selection: &TimeSliceSelection,
) -> RangeInclusive<ActivityPerCapacity>
pub fn get_activity_per_capacity_limits_for_selection( &self, time_slice_selection: &TimeSliceSelection, ) -> RangeInclusive<ActivityPerCapacity>
Get the activity limits per unit of capacity for this asset for a given time slice selection
Sourcepub fn iter_activity_limits(
&self,
) -> impl Iterator<Item = (TimeSliceSelection, RangeInclusive<Activity>)> + '_
pub fn iter_activity_limits( &self, ) -> impl Iterator<Item = (TimeSliceSelection, RangeInclusive<Activity>)> + '_
Iterate over activity limits for this asset
Sourcepub fn iter_activity_per_capacity_limits(
&self,
) -> impl Iterator<Item = (TimeSliceSelection, RangeInclusive<ActivityPerCapacity>)> + '_
pub fn iter_activity_per_capacity_limits( &self, ) -> impl Iterator<Item = (TimeSliceSelection, RangeInclusive<ActivityPerCapacity>)> + '_
Iterate over activity per capacity limits for this asset
Sourcepub fn get_total_output_per_activity(&self) -> FlowPerActivity
pub fn get_total_output_per_activity(&self) -> FlowPerActivity
Gets the total SED/SVD output per unit of activity for this asset
Note: Since we are summing coefficients from different commodities, this ONLY makes sense if these commodities have the same units (e.g., all in PJ). Users are currently not made to give units for commodities, so we cannot possibly enforce this. Something to potentially address in future.
Sourcepub fn get_operating_cost(
&self,
year: u32,
time_slice: &TimeSliceID,
) -> MoneyPerActivity
pub fn get_operating_cost( &self, year: u32, time_slice: &TimeSliceID, ) -> MoneyPerActivity
Get the operating cost for this asset in a given year and time slice
Sourcepub fn get_revenue_from_flows(
&self,
prices: &PriceMap,
time_slice: &TimeSliceID,
) -> MoneyPerActivity
pub fn get_revenue_from_flows( &self, prices: &PriceMap, time_slice: &TimeSliceID, ) -> MoneyPerActivity
Get the total revenue from all flows for this asset.
If a price is missing, it is assumed to be zero.
Sourcepub fn get_revenue_from_flows_excluding_primary(
&self,
prices: &PriceMap,
time_slice: &TimeSliceID,
) -> MoneyPerActivity
pub fn get_revenue_from_flows_excluding_primary( &self, prices: &PriceMap, time_slice: &TimeSliceID, ) -> MoneyPerActivity
Get the total revenue from all flows excluding the primary output.
If a price is missing, it is assumed to be zero.
Sourcepub fn get_input_cost_from_prices(
&self,
prices: &PriceMap,
time_slice: &TimeSliceID,
) -> MoneyPerActivity
pub fn get_input_cost_from_prices( &self, prices: &PriceMap, time_slice: &TimeSliceID, ) -> MoneyPerActivity
Get the total cost of purchasing input commodities per unit of activity for this asset.
If a price is missing, there is assumed to be no cost.
Sourcefn get_revenue_from_flows_with_filter<F>(
&self,
prices: &PriceMap,
time_slice: &TimeSliceID,
filter_for_flows: F,
) -> MoneyPerActivity
fn get_revenue_from_flows_with_filter<F>( &self, prices: &PriceMap, time_slice: &TimeSliceID, filter_for_flows: F, ) -> MoneyPerActivity
Get the total revenue from a subset of flows.
Takes a function as an argument to filter the flows. If a price is missing, it is assumed to be zero.
Sourcefn get_generic_activity_cost(
&self,
prices: &PriceMap,
year: u32,
time_slice: &TimeSliceID,
) -> MoneyPerActivity
fn get_generic_activity_cost( &self, prices: &PriceMap, year: u32, time_slice: &TimeSliceID, ) -> MoneyPerActivity
Get the generic activity cost per unit of activity for this asset.
These are all activity-related costs that are not associated with specific SED/SVD outputs. Includes levies, flow costs, costs of inputs and variable operating costs
Sourcepub fn iter_marginal_costs_with_filter<'a>(
&'a self,
prices: &'a PriceMap,
year: u32,
time_slice: &'a TimeSliceID,
filter: impl Fn(&CommodityID) -> bool + 'a,
) -> Box<dyn Iterator<Item = (CommodityID, MoneyPerFlow)> + 'a>
pub fn iter_marginal_costs_with_filter<'a>( &'a self, prices: &'a PriceMap, year: u32, time_slice: &'a TimeSliceID, filter: impl Fn(&CommodityID) -> bool + 'a, ) -> Box<dyn Iterator<Item = (CommodityID, MoneyPerFlow)> + 'a>
Iterate over marginal costs for a filtered set of SED/SVD output commodities for this asset
For each SED/SVD output commodity, the marginal cost is calculated as the sum of:
- Generic activity costs (variable operating costs, cost of purchasing inputs, plus all levies and flow costs not associated with specific SED/SVD outputs), which are shared equally over all SED/SVD outputs
- Production levies and flow costs for the specific SED/SVD output commodity
Sourcepub fn iter_marginal_costs<'a>(
&'a self,
prices: &'a PriceMap,
year: u32,
time_slice: &'a TimeSliceID,
) -> Box<dyn Iterator<Item = (CommodityID, MoneyPerFlow)> + 'a>
pub fn iter_marginal_costs<'a>( &'a self, prices: &'a PriceMap, year: u32, time_slice: &'a TimeSliceID, ) -> Box<dyn Iterator<Item = (CommodityID, MoneyPerFlow)> + 'a>
Iterate over marginal costs for all SED/SVD output commodities for this asset
See iter_marginal_costs_with_filter for details.
Sourcepub fn get_annual_capital_cost_per_capacity(&self) -> MoneyPerCapacity
pub fn get_annual_capital_cost_per_capacity(&self) -> MoneyPerCapacity
Get the annual capital cost per unit of capacity for this asset
Sourcepub fn get_annual_fixed_costs_per_activity(
&self,
annual_activity: Activity,
) -> MoneyPerActivity
pub fn get_annual_fixed_costs_per_activity( &self, annual_activity: Activity, ) -> MoneyPerActivity
Get the annual fixed costs (AFC) per unit of activity for this asset
Total capital costs and fixed opex are shared equally over the year in accordance with the annual activity.
Sourcepub fn get_annual_fixed_costs_per_flow(
&self,
annual_activity: Activity,
) -> MoneyPerFlow
pub fn get_annual_fixed_costs_per_flow( &self, annual_activity: Activity, ) -> MoneyPerFlow
Get the annual fixed costs (AFC) per unit of output flow for this asset
Total capital costs and fixed opex are shared equally across all output flows in accordance with the annual activity and total output per unit of activity.
Sourcepub fn max_activity(&self) -> Activity
pub fn max_activity(&self) -> Activity
Maximum activity for this asset
Sourcepub fn get_flow(&self, commodity_id: &CommodityID) -> Option<&ProcessFlow>
pub fn get_flow(&self, commodity_id: &CommodityID) -> Option<&ProcessFlow>
Get a specific process flow
Sourcepub fn iter_flows(&self) -> impl Iterator<Item = &ProcessFlow>
pub fn iter_flows(&self) -> impl Iterator<Item = &ProcessFlow>
Iterate over the asset’s flows
Sourcepub fn iter_output_flows(&self) -> impl Iterator<Item = &ProcessFlow>
pub fn iter_output_flows(&self) -> impl Iterator<Item = &ProcessFlow>
Iterate over the asset’s output SED/SVD flows
Sourcepub fn primary_output(&self) -> Option<&ProcessFlow>
pub fn primary_output(&self) -> Option<&ProcessFlow>
Get the primary output flow (if any) for this asset
Sourcepub fn primary_output_commodity(&self) -> Option<&CommodityID>
pub fn primary_output_commodity(&self) -> Option<&CommodityID>
Get the primary output commodity (if any) for this asset
Sourcepub fn is_commissioned(&self) -> bool
pub fn is_commissioned(&self) -> bool
Whether this asset has been commissioned
Sourcepub fn is_candidate(&self) -> bool
pub fn is_candidate(&self) -> bool
Whether this asset is a candidate
Sourcepub fn commission_year(&self) -> u32
pub fn commission_year(&self) -> u32
Get the commission year for this asset
Sourcepub fn process_id(&self) -> &ProcessID
pub fn process_id(&self) -> &ProcessID
Get the process ID for this asset
Sourcepub fn is_divisible(&self) -> bool
pub fn is_divisible(&self) -> bool
Whether this asset is divisible
Sourcepub fn capacity(&self) -> AssetCapacity
pub fn capacity(&self) -> AssetCapacity
Get the capacity for this asset
Sourcepub fn total_capacity(&self) -> Capacity
pub fn total_capacity(&self) -> Capacity
Get the total capacity for this asset
Sourcepub fn set_capacity(&mut self, capacity: AssetCapacity)
pub fn set_capacity(&mut self, capacity: AssetCapacity)
Set the capacity of this asset.
Note that this should be done with care!
Sourcepub fn increase_capacity(&mut self, capacity: AssetCapacity)
pub fn increase_capacity(&mut self, capacity: AssetCapacity)
Increase the capacity for this asset
Sourcefn commission(&mut self, id: AssetID)
fn commission(&mut self, id: AssetID)
Commission the asset.
Only assets with an AssetState of Ready can be commissioned. If the asset’s state is
something else, this function will panic.
§Arguments
id- The ID to give the newly commissioned asset
Sourcepub fn select_candidate_for_investment(&mut self, agent_id: AgentID)
pub fn select_candidate_for_investment(&mut self, agent_id: AgentID)
Select a Candidate asset for investment, converting it to a Ready state
Sourcefn get_mothball_events(&self) -> Option<&VecDeque<MothballEvent>>
fn get_mothball_events(&self) -> Option<&VecDeque<MothballEvent>>
Get the mothball events for this asset, if commissioned
Sourcefn get_mothball_events_mut(&mut self) -> Option<&mut VecDeque<MothballEvent>>
fn get_mothball_events_mut(&mut self) -> Option<&mut VecDeque<MothballEvent>>
Get the mothball events (mutably) for this asset, if commissioned
Sourcepub fn has_any_mothballed_units(&self) -> bool
pub fn has_any_mothballed_units(&self) -> bool
Whether this asset has any units mothballed
Sourcepub fn get_num_mothballed_units(&self) -> u32
pub fn get_num_mothballed_units(&self) -> u32
Get the number of units which are mothballed.
For non-commissioned assets, this always returns zero.
Sourcepub fn get_num_nonmothballed_units(&self) -> u32
pub fn get_num_nonmothballed_units(&self) -> u32
Get the remaining number of units that are not mothballed.
For non-commissioned assets, this always returns the total number of units.
Sourcepub fn num_units(&self) -> u32
pub fn num_units(&self) -> u32
The number of units this asset represents
If divisible, returns the total number of units, otherwise returns one.
Sourcepub fn unit_size(&self) -> Option<Capacity>
pub fn unit_size(&self) -> Option<Capacity>
Get the unit size for this asset’s capacity (if any)
Sourcepub fn max_installable_capacity(
&self,
commodity_portion: Dimensionless,
) -> Option<AssetCapacity>
pub fn max_installable_capacity( &self, commodity_portion: Dimensionless, ) -> Option<AssetCapacity>
For non-commissioned assets, get the maximum capacity permitted to be installed based on the investment constraints for the asset’s process.
The limit is taken from the process’s investment constraints for the asset’s region and commission year, and the portion of the commodity demand being considered.
For divisible assets, the returned capacity will be rounded down to the nearest multiple of the asset’s unit size.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Asset
impl RefUnwindSafe for Asset
impl !Send for Asset
impl !Sync for Asset
impl Unpin for Asset
impl UnsafeUnpin for Asset
impl UnwindSafe for Asset
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more