Exemple #1
0
 def plot_coefficients(self, submodel=-2, exclude_constant=True, eqidx=0, plot=True, 
                       store_values_to_file=None):
     """ Plot a barchart of coefficient values. This can be used in a regression model, 
     when coefficients are standardized 
     (i.e. using the estimation module opus_core.estimate_linear_regression_standardized).
     store_values_to_file can be a file name where the values are stored.
     """
     coef = self.get_coefficients(submodel)
     values = coef.get_coefficient_values()
     names = coef.get_coefficient_names()
     sd = coef.get_standard_errors()
     idx=ones(names.shape[1], dtype="bool")
     if exclude_constant:
         pos = coef.get_constants_positions()
         if pos.size > 0:               
             idx[pos]=0
     if store_values_to_file is not None:
         n = idx.sum()
         result = concatenate((reshape(names[eqidx, idx], (n,1)), 
                              reshape(values[eqidx, idx], (n,1)),
                              reshape(sd[eqidx, idx], (n,1))), axis=1)
         write_to_text_file(store_values_to_file, array(['coefficient_name', 'estimate', 'standard_error']), 
                            delimiter='\t')
         write_table_to_text_file(store_values_to_file, result, delimiter='\t', mode='a')
     if plot:
         plot_barchart(values[eqidx, idx], labels = names[eqidx, idx], errors=sd[eqidx, idx])
     else:
         return {'names': names[eqidx, idx], 'values': values[eqidx, idx], 'errors': sd[eqidx, idx]}
 def estimate_variance(self):
     mode="wb"
     for l in self.mu.keys():
         self.v[l] = zeros(self.number_of_runs, dtype=float32)
         for i in range(self.number_of_runs):
             self.v[l][i] = ((self.y[l] - self.ahat[l] - self.mu[l][:,i])**2.0).mean()
         if l > 0:
             mode="ab" # add to existing file
         write_to_text_file(os.path.join(self.output_directory, self.variance_file_name),
                        self.v[l], mode=mode, delimiter=" ")
 def estimate_bias(self):
     mode="wb"
     for l in self.mu.keys():
         self.ahat[l] = (reshape(self.y[l], (self.y[l].size,1)) - self.mu[l]).mean()
         # for zone-specific bias
         #self.ahat[l] = mean(reshape(self.y[l], (self.y[l].size,1)) - self.mu[l], axis=1)
         if l > 0:
             mode="ab" # add to existing file
         write_to_text_file(os.path.join(self.output_directory, self.bias_file_name),
                        array([self.ahat[l]]), mode=mode)
def create_file_cache_directories(directory, prefix='', file_name='cache_directories'):
    logger.start_block('Creating file %s in %s' % (file_name, directory))
    all_dirs = os.listdir(directory)
    all_dirs = [x for x in all_dirs if x.startswith(prefix)]
    if not prefix.startswith('.'):
        all_dirs = [x for x in all_dirs if not x.startswith('.')]

    for i in range(len(all_dirs)):
        all_dirs[i] = os.path.join(directory, all_dirs[i])
        
    write_to_text_file(os.path.join(directory, file_name), all_dirs)
    logger.end_block()
 def export_bm_parameters_of_one_quantity(self, quantity_of_interest, filepath, add_to_file=True, run_index=None):
     variable_list = self.get_variable_names()
     quantity_index = variable_list.index(quantity_of_interest)
     mode = 'a'
     if not add_to_file:
         mode = 'w'
     if run_index is None:
         idx = argsort(self.get_weight_components()[quantity_index])[-1]
     else: 
         idx = run_index
     write_to_text_file(filepath, array([variable_list[quantity_index]]), mode=mode)
     write_to_text_file(filepath, array([self.get_bias()[quantity_index], self.get_variance()[quantity_index][idx]]), 
                        mode='a', delimiter=' ')
 def export_bm_parameters(self, directory, filename=None, quantities=None, run_index=None):
     """Writes BM parameters (bias and variance) for each quantity to a file. The variance parameter is either 
     the one computed for a run given by run_index, or (if it is not given) for the run with the highest weight.
     
     """
     if filename is None:
         filename = 'bm_parameters_' + str(self.get_calibration_year())
     if run_index is not None:
         filename = '%s_run_%s' % (filename, run_index) 
     file = os.path.join(directory, filename)
     if quantities is None:
         variable_list = self.get_variable_names()
     else:
         variable_list = quantities
     write_to_text_file(file, array([self.get_base_year(), self.get_calibration_year()]), delimiter=' ')
     for quant in variable_list:
         self.export_bm_parameters_of_one_quantity(quant, file, add_to_file=True, run_index=run_index)
 def compute_weights(self, procedure="opus_core.bm_normal_weights", **kwargs):
     """ Launches the run method of the given 'procedure'. This should return the actual BM weights.
     The method passes self as first argument into the run method.
     If 'procedure' is not given, the method returns equal weights.
     """
     self.compute_y()
     self.estimate_mu()
     self.estimate_bias()
     self.estimate_variance()
     if procedure is not None:
         procedure_class = ModelComponentCreator().get_model_component(procedure)
         self.weights, self.weight_components = procedure_class.run(self, **kwargs)
     else:
         self.weights = 1.0/self.number_of_runs * ones(self.number_of_runs)
     write_to_text_file(os.path.join(self.output_directory, self.weights_file_name),
                        self.weights)
     return self.weights
 def export_weights_posterior_mean_and_variance(self, years, quantity_of_interest, directory, filename=None, 
                                                  use_bias_and_variance_from=None, ids = None, **kwargs):
     for year in years:
         self.set_posterior(year, quantity_of_interest, use_bias_and_variance_from, **kwargs)
         if filename is None:
             filename = quantity_of_interest
         file = os.path.join(directory, str(year) + '_' + filename)
         write_to_text_file(file, concatenate((array([0.]), self.get_weights())), delimiter=' ')
         write_to_text_file(file, concatenate((array([0.]), self.get_posterior_component_variance())), mode='a', delimiter=' ')
         variable_list = self.get_variable_names()
         quantity_index = variable_list.index(quantity_of_interest)
         if ids is None:
             ids = self.m_ids
         means = zeros((ids.size, self.number_of_runs+1))
         means[:,0] = ids
         means[:,1:means.shape[1]] = self.get_posterior_component_mean()
         write_table_to_text_file(file, means, mode='a')            
Exemple #9
0
 def test_get_node_data_into_node_travel_data_set(self):
     temp_dir = tempfile.mkdtemp(prefix='opus_tmp')
     file1 = 'report1'
     temp_file1 = os.path.join(temp_dir, file1)
     write_to_text_file(temp_file1, array(['inode', 'jnode', 'timau', '@corr', 'len', 'result']), delimiter=' ')
     write_table_to_text_file(temp_file1, array([[1,2, 35.6, 4, 1.2, 0], 
                                                 [2,1, 23.5, 3, 0.3,100], 
                                                 [4,10, 2.1, 3, 0.5, 10],
                                                 [3,1, 15.8, 4, 1.1, 5] ]), delimiter = ' ', mode='a')
     file2 = 'report2'
     temp_file2 = os.path.join(temp_dir, file2)
     write_to_text_file(temp_file2, array(['inode', 'jnode', 'volau', 'result']), delimiter=' ')
     write_table_to_text_file(temp_file2, array([[1,2, 110, 0], 
                                                [3,1, 350, 400], 
                                                [5,4, 200, 200]]), delimiter = ' ', mode='a')
     
     node_matrix_attribute_map = {file1: {
                                          'timau':'travel_time',
                                          'len':'distance',
                                          '@corr': 'corridor'
                                          },
                                  file2: {
                                          'volau': 'travel_volume'
                                          }
                                  }
     tm_output = TravelModelOutput()
     node_travel_data_set = tm_output.get_node_travel_data_set(node_matrix_attribute_map, temp_dir)
     # size should be 5, since there are 5 unique combinations of from_node, to_node
     self.assertEqual(node_travel_data_set.size(), 5)
     # the dataset should have 6 attributes
     self.assertEqual(len(node_travel_data_set.get_known_attribute_names()), 6)
     self.assertEqual('travel_time' in node_travel_data_set.get_known_attribute_names(), True)
     self.assertEqual('distance' in node_travel_data_set.get_known_attribute_names(), True)
     self.assertEqual('corridor' in node_travel_data_set.get_known_attribute_names(), True)
     self.assertEqual('travel_volume' in node_travel_data_set.get_known_attribute_names(), True)
     self.assertEqual('from_node_id' in node_travel_data_set.get_known_attribute_names(), True)
     self.assertEqual('to_node_id' in node_travel_data_set.get_known_attribute_names(), True)
     # check values of one node
     node = node_travel_data_set.get_data_element_by_id((3,1))
     self.assertEqual(node.corridor, 4)
     self.assertEqual(node.travel_volume, 350)
     shutil.rmtree(temp_dir) 
    def run(self, data, coefficients, resources=None):
        """
        Like linear_utilities, but in addition it runs linear utilities for
        modified data and stores utilities when each variable is set to its 5%, 95% quantiles,
        keeping the other variables at their median. Last row in the resulting file is the difference in
        utilities between these two.
        The file name can be passed in resources - entry 'utilities_diagnose_file'.
        """
        if data.ndim < 3:
            raise StandardError, "Argument 'data' must be a 3D numpy array."

        if not isinstance(resources, Resources):
            resources= Resources(resources)
        nobs, neqs, nvar = data.shape
        medians = zeros(nvar, dtype=float32)
        quant = zeros((2,nvar), dtype=float32)
        data_with_medians = array(data[0,:,:])
        for ivar in range(nvar): # compute medain and quantiles for each variable
            medians[ivar], quant[0,ivar], quant[1,ivar] = quantile(data[:,:,ivar].ravel(), array([0.5, 0.05, 0.95]))
            data_with_medians[:,ivar] = medians[ivar]


        file_name = resources.get("utilities_diagnose_file", "util")
        if resources.get("submodel", None) is not None:
            file_name = "%s_submodel_%s" % (file_name, resources.get("submodel", 1))
        diagnose_utilities = zeros((3, nvar), dtype=float32)
        argcor = ()
        for ivar in range(nvar): # iterate over variables
            for iquant in [0,1]: # 0 for 5% quantile, 1 for 95% quantile
                mod_data = array(data_with_medians).reshape(1,neqs, nvar) # copy original data
                mod_data[0,:,ivar] = quant[iquant, ivar]
                utility = linear_utilities.run(self, mod_data, coefficients, resources)
                diagnose_utilities[iquant, ivar] = utility[0,0]
            argcor = argcor + (data[:,:,ivar].ravel(),)
        diagnose_utilities[2,:] = diagnose_utilities[1,:] - diagnose_utilities[0,:]
        coef_names = resources.get("coefficient_names", map(lambda x: 'x%s' % x, arange(nvar)+1))
        write_to_text_file(file_name, coef_names, delimiter=' ')
        write_table_to_text_file( file_name, diagnose_utilities, mode='ab')
        logger.log_status("Diagnosed utilities written into %s." % file_name)
        return linear_utilities.run(self, data, coefficients, resources)
 def export_confidence_intervals(self, confidence_levels, filename, delimiter='\t'):
     """Export confidence intervals into a file. 
     confidence_levels is a list of desired confidence levels. 
     The resulting file has a id column, 'mean' column and for each level 
     its lower bound and upper bound columns.
     The method generate_posterior_distribution should be called prior to this method.
     """
     if not isinstance(confidence_levels, list):
         confidence_levels = [confidence_levels]
     lcl = len(confidence_levels)
     result = zeros((self.simulated_values_ids.size, 2+2*lcl), dtype='float32')
     result[:,0] = self.simulated_values_ids
     result[:,1] = self.get_quantity_from_simulated_values("mean")
     clheader = []
     for cl in confidence_levels:
         clheader = clheader + ['lower_%s' % cl, 'upper_%s' % cl]
     write_to_text_file(filename, ['id', 'mean'] + clheader, delimiter=delimiter)
     i = 2
     for cl in confidence_levels:
         ci = self.get_probability_interval(cl/100.0)
         result[:,i:(i+2)] = transpose(ci)
         i = i+2
     write_table_to_text_file(filename, result, mode='a', delimiter=delimiter)
Exemple #12
0
 def write_observed_data(self, filename, index, transformed_back=True):
     write_to_text_file(filename,
                        self.get_observed_data_by_index(
                            index, transformed_back),
                        delimiter=' ')
 def write_posterior_mean_and_variance(self, mean_filename=None, variance_filename=None):
     if mean_filename is not None:
         write_table_to_text_file(mean_filename, self.get_posterior_component_mean())
     if variance_filename is not None:
         write_to_text_file(variance_filename, self.get_posterior_component_variance(), delimiter=' ')
 def write_observed_data_for_quantity(self, quantity_of_interest, filename):
     data = self.observed_data.get_values_for_quantity(quantity_of_interest)
     write_to_text_file(filename, data, delimiter=' ')
 def write_observed_data(self, filename, index, transformed_back=True):
     write_to_text_file(filename, self.get_observed_data_by_index(index, transformed_back), delimiter=' ')
# Opus/UrbanSim urban simulation software.
# Copyright (C) 2010-2011 University of California, Berkeley, 2005-2009 University of Washington
# See opus_core/LICENSE

from opus_core.services.run_server.generic_option_group import GenericOptionGroup
import os
from numpy import array
from opus_core.misc import write_to_text_file

if __name__ == "__main__":                                                                 
    option_group = GenericOptionGroup()
    parser = option_group.parser
    parser.add_option("-d", "--cache-directory", dest="cache_directory", action="store", type="string",
                      help="Cache directory")
    parser.add_option("-o", "--output-file", dest="output_file", action="store", type="string",
                      help="Output file")
    (options, args) = parser.parse_args()

    files = os.listdir(options.cache_directory)
    years = []
    for file in files:
        try:
            year = int(file)
        except:
            continue
        years.append(year)
    result = array(years).max()
    write_to_text_file(options.output_file, array([result]))
    
    
    root_seed = config.get("seed", None)
    seed(root_seed)
    # generate different seed for each run (each seed contains 1 number)
    seed_array = randint(1,2**30, number_of_runs)
    list_of_cache_directories = []
    for irun in range(number_of_runs):
        config['seed']= (seed_array[irun],)
        this_config = config.copy()
        if ((irun + 1) % number_of_runs_in_parallel) == 0:
            run_in_background = False
        else:
            run_in_background = True
        run_manager.setup_new_run(cache_directory = this_config['cache_directory'],
                                  configuration = this_config)
        run_manager.run_run(this_config, run_as_multiprocess=False,
                            run_in_background=run_in_background)
        if irun == 0:
            # log file for the multiple runs will be located in the first cache
            first_cache_directory = this_config['cache_directory']
            log_file = os.path.join(first_cache_directory, 'multiple_runs.log')
            logger.enable_file_logging(log_file)
            logger.log_status("Multiple runs: %s replications" % number_of_runs)
            logger.log_status("root random seed = %s" % str(root_seed))
        else:
            logger.enable_file_logging(log_file, verbose=False)

        logger.log_status("Run %s: %s" % (irun+1, this_config['cache_directory']))
        logger.disable_file_logging(log_file)
        list_of_cache_directories.append(this_config['cache_directory'])
        write_to_text_file(os.path.join(first_cache_directory,"cache_directories"),
                                list_of_cache_directories)
Exemple #18
0
    for irun in range(number_of_runs):
        config['seed'] = (seed_array[irun], )
        this_config = config.copy()
        if ((irun + 1) % number_of_runs_in_parallel) == 0:
            run_in_background = False
        else:
            run_in_background = True
        run_manager.setup_new_run(
            cache_directory=this_config['cache_directory'],
            configuration=this_config)
        run_manager.run_run(this_config,
                            run_as_multiprocess=False,
                            run_in_background=run_in_background)
        if irun == 0:
            # log file for the multiple runs will be located in the first cache
            first_cache_directory = this_config['cache_directory']
            log_file = os.path.join(first_cache_directory, 'multiple_runs.log')
            logger.enable_file_logging(log_file)
            logger.log_status("Multiple runs: %s replications" %
                              number_of_runs)
            logger.log_status("root random seed = %s" % str(root_seed))
        else:
            logger.enable_file_logging(log_file, verbose=False)

        logger.log_status("Run %s: %s" %
                          (irun + 1, this_config['cache_directory']))
        logger.disable_file_logging(log_file)
        list_of_cache_directories.append(this_config['cache_directory'])
        write_to_text_file(
            os.path.join(first_cache_directory, "cache_directories"),
            list_of_cache_directories)