Source code for bw2calc.mc_vector

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, division
from eight import *
from future.utils import implements_iterator

from .monte_carlo import IterativeMonteCarlo
from .utils import extract_uncertainty_fields as euf
from stats_arrays.random import MCRandomNumberGenerator
import numpy as np


@implements_iterator
[docs] class ParameterVectorLCA(IterativeMonteCarlo): """A Monte Carlo class where all uncertain parameters are stored in a single large array. Useful for sensitivity analysis and easy manipulation."""
[docs] def load_data(self): self.load_lci_data() positions = { "tech": (0, self.tech_params.shape[0]), "bio": ( self.tech_params.shape[0], self.tech_params.shape[0] + self.bio_params.shape[0] ) } # `euf` is extract_uncertainty_fields; needed because we are # "gluing" together arrays with different column numbers and labels params = (euf(self.tech_params), euf(self.bio_params)) if self.lcia: self.load_lcia_data() positions["cf"] = ( positions["bio"][1], positions["bio"][1] + self.cf_params.shape[0] ) params = params + (euf(self.cf_params),) if self.weighting: self.load_weighting_data() positions["weighting"] = ( positions["bio"][1], positions["bio"][1] + self.cf_params.shape[0] ) params = params + (euf(self.weighting_params),) self.positions = positions self.params = np.hstack(params) self.rng = MCRandomNumberGenerator(self.params, seed=self.seed)
[docs] def rebuild_all(self, vector=None): """Rebuild the LCI/LCIA matrices from a new Monte Carlo sample or provided vector.""" if not hasattr(self, "positions"): self.load_data() if vector is not None and not isinstance(vector, np.ndarray): raise ValueError("`vector` must be a 1-d numpy array") if vector is not None: assert vector.shape == self.params.shape, \ "Incorrect `vector` shape. Is {}, but should be {}".format( vector.shape, self.params.shape ) # Copy to break references and avoid later manipulation by RNG self.sample = (self.rng.next() if vector is None else vector).copy() self.rebuild_technosphere_matrix(self.tech_sample) self.rebuild_biosphere_matrix(self.bio_sample) if self.lcia: self.rebuild_characterization_matrix(self.cf_sample) if self.weighting: self.weighting_value = self.weighting_sample if self.presamples: self.presamples.update_matrices()
def __next__(self): """Generate a new Monte Carlo iteration.""" self.rebuild_all() if not hasattr(self, "demand_array"): self.build_demand_array() self.lci_calculation() if self.lcia: self.lcia_calculation() if self.weighting: self.weighting_calculation() return self.score else: return self.supply_array @property
[docs] def tech_sample(self): return self.sample[self.positions["tech"][0]:self.positions["tech"][1]]
@property
[docs] def bio_sample(self): return self.sample[self.positions["bio"][0]:self.positions["bio"][1]]
@property
[docs] def cf_sample(self): return self.sample[self.positions["cf"][0]:self.positions["cf"][1]]
@property
[docs] def weighting_sample(self): return self.sample[self.positions["weighting"][0]:self.positions["weighting"][1]]