Beispiel #1
0
    def __init__(self, inputs_directory):

        # List of "periods" for allocation of large pumped storage across year and for each dispatch optimization
        self.periods = list()
        with open(os.path.join(inputs_directory, "periods.csv"), "Ur") as periods_file:
            periods_reader = csv.reader(periods_file)
            periods_reader.next()
            for row in periods_reader:
                self.periods.append(int(row[0]))

        # List of regions
        self.regions = list()
        with open(os.path.join(inputs_directory, "regions.csv"), "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:
                self.regions.append(str(row[0]))

        # ### Inputs for year to period allocation ### #

        # Average load across all periods
        # Data structure: dictionary with regions as keys
        self.average_net_load = util.recursivedict()
        with open(os.path.join(inputs_directory, "alloc_average_net_load.csv"), "Ur") as avg_net_load_file:
            average_net_load_reader = csv.reader(avg_net_load_file)
            average_net_load_reader.next()
            for row in average_net_load_reader:
                self.average_net_load[str(row[0])] = float(row[1])

        # Total load in each period
        # Dictionary with two indices: period and region
        self.period_net_load = dict()
        with open(os.path.join(inputs_directory, "alloc_period_net_load.csv"), "Ur") as period_net_load_file:
            period_total_net_load_reader = csv.reader(period_net_load_file)
            period_total_net_load_reader.next()
            for row in period_total_net_load_reader:
                self.period_net_load[(str(row[0]), int(row[1]))] = float(row[2])

        # List of resources
        self.alloc_resources = list()

        # Resource params: region, technology, power capacity, energy capacity
        # Data structrue: dictionaries with the resource names as keys
        self.alloc_region = dict()
        self.alloc_technology = dict()
        self.alloc_power_capacity = dict()
        self.alloc_energy_capacity = dict()
        with open(os.path.join(inputs_directory, "alloc_resources.csv"), "Ur") as alloc_resources_file:
            alloc_resources_reader = csv.reader(alloc_resources_file)
            alloc_resources_reader.next()
            for row in alloc_resources_reader:
                self.alloc_resources.append(str(row[0]))
                self.alloc_region[str(row[0])] = str(row[1])
                self.alloc_technology[str(row[0])] = str(row[2])
                self.alloc_power_capacity[str(row[0])] = float(row[3])
                self.alloc_energy_capacity[str(row[0])] = float(row[4])

        # Penalties; these are all single values
        # TODO: define outside of class
        self.upward_imbalance_penalty = 1000.0
        self.downward_imbalance_penalty = 100.0
Beispiel #2
0
    def __init__(self, inputs_directory):

        # List of "periods" for allocation of large pumped storage across year and for each dispatch optimization
        self.periods = list()
        with open(os.path.join(inputs_directory, "periods.csv"),
                  "Ur") as periods_file:
            periods_reader = csv.reader(periods_file)
            periods_reader.next()
            for row in periods_reader:
                self.periods.append(int(row[0]))

        # List of regions
        self.regions = list()
        with open(os.path.join(inputs_directory, "regions.csv"),
                  "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:
                self.regions.append(str(row[0]))

        # ### Inputs for year to period allocation ### #

        # Average load across all periods
        # Data structure: dictionary with regions as keys
        self.average_net_load = util.recursivedict()
        with open(os.path.join(inputs_directory, "alloc_average_net_load.csv"),
                  "Ur") as avg_net_load_file:
            average_net_load_reader = csv.reader(avg_net_load_file)
            average_net_load_reader.next()
            for row in average_net_load_reader:
                self.average_net_load[str(row[0])] = float(row[1])

        # Total load in each period
        # Dictionary with two indices: period and region
        self.period_net_load = dict()
        with open(os.path.join(inputs_directory, "alloc_period_net_load.csv"),
                  "Ur") as period_net_load_file:
            period_total_net_load_reader = csv.reader(period_net_load_file)
            period_total_net_load_reader.next()
            for row in period_total_net_load_reader:
                self.period_net_load[(str(row[0]),
                                      int(row[1]))] = float(row[2])

        # List of resources
        self.alloc_resources = list()

        # Resource params: region, technology, power capacity, energy capacity
        # Data structrue: dictionaries with the resource names as keys
        self.alloc_region = dict()
        self.alloc_technology = dict()
        self.alloc_power_capacity = dict()
        self.alloc_energy_capacity = dict()
        with open(os.path.join(inputs_directory, "alloc_resources.csv"),
                  "Ur") as alloc_resources_file:
            alloc_resources_reader = csv.reader(alloc_resources_file)
            alloc_resources_reader.next()
            for row in alloc_resources_reader:
                self.alloc_resources.append(str(row[0]))
                self.alloc_region[str(row[0])] = str(row[1])
                self.alloc_technology[str(row[0])] = str(row[2])
                self.alloc_power_capacity[str(row[0])] = float(row[3])
                self.alloc_energy_capacity[str(row[0])] = float(row[4])

        # Penalties; these are all single values
        # TODO: define outside of class
        self.upward_imbalance_penalty = 1000.0
        self.downward_imbalance_penalty = 100.0
Beispiel #3
0
    def __init__(self, inputs_directory):

        # List of "periods" to optimize (can be optimized in parallel)
        self.periods = list()
        with open(os.path.join(inputs_directory, "periods.csv"), "Ur") as periods_file:
            periods_reader = csv.reader(periods_file)
            periods_reader.next()
            for row in periods_reader:
                self.periods.append(int(row[0]))

        # List of regions
        # Also importing the penalty thresholds for the distribution and bulk systems
        self.regions = list()
        self.dist_net_load_threshold = dict()
        self.bulk_net_load_threshold = dict()
        with open(os.path.join(inputs_directory, "regions_dist.csv"), "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:
                self.dist_net_load_threshold[(str(row[0]),int(row[1]))] = float(row[2])
        with open(os.path.join(inputs_directory, "regions_bulk.csv"), "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:       
                self.regions.append(str(row[0]))     
                self.bulk_net_load_threshold[str(row[0])] = float(row[1])

        # Dictionary with period as key and the list of timepoints for each period as values
        self.period_timepoints = dict()
        # List of timepoints in each period (e.g. 1-24 for days, 1-168 for weeks, etc.)
        self.timepoints = list()
        # Dictionary with the order in which the cumulative flexible load constraint is enforced,
        # e.g. if starting it on timepoint 7, flex_load_timepoint 1 is assigned to timepoint 7
        # {7: 1, 8: 2, 9: 3 ...}
        self.flex_load_timepoints = dict()
#        self.ev_load_timepoints = dict()
        self.period_flex_load_timepoints = dict()
#        self.period_ev_load_timepoints = dict()
        with open(os.path.join(inputs_directory, "timepoints.csv"), "Ur") as timepoints_file:
            timepoints_reader = csv.reader(timepoints_file)
            timepoints_reader.next()
            for row in timepoints_reader:
                self.timepoints.append(int(row[1]))
                self.flex_load_timepoints[int(row[1])] = int(row[2])
#                self.ev_load_timepoints[int(row[1])] = int(row[3])
                if int(row[1]) == 168:
                    self.period_timepoints[int(row[0])] = self.timepoints
                    self.timepoints = list()
                    self.period_flex_load_timepoints[int(row[0])] = self.flex_load_timepoints
                    self.flex_load_timepoints = dict()
#                    self.period_ev_load_timepoints[int(row[0])] = self.ev_load_timepoints
#                    self.ev_load_timepoints = dict()

        # List of storage technologies
        self.storage_technologies = list()
        # Dictionaries with technology params (storage technologies as keys): large-storage boolean flag,
        # charging efficiency, discharging efficiency
        self.large_storage = dict()
        self.charging_efficiency = dict()
        self.discharging_efficiency = dict()
        with open(os.path.join(inputs_directory, "storage_technologies.csv"), "Ur") as storage_technologies_file:
            storage_technologies_reader = csv.reader(storage_technologies_file)
            storage_technologies_reader.next()
            for row in storage_technologies_reader:
                self.storage_technologies.append(str(row[0]))
                self.large_storage[str(row[0])] = int(row[1])
                self.charging_efficiency[str(row[0])] = float(row[2])
                self.discharging_efficiency[str(row[0])] = float(row[3])

        # List of generation technologies; this doesn't vary by period, so no period dictionary needed
        self.generation_technologies = list()
        # Dictionary of variable cost by generation technologies (generation technologies as keys)
        self.variable_cost = dict()
        with open(os.path.join(inputs_directory, "generation_technologies.csv"), "Ur") as generation_technologies_file:
            generation_technologies_reader = csv.reader(generation_technologies_file)
            generation_technologies_reader.next()
            for row in generation_technologies_reader:
                self.generation_technologies.append(str(row[0]))
                self.variable_cost[str(row[0])] = float(row[1])

        # Dictionary with periods as keys, list of resources in each period as values
        self.period_resources = dict()
        # List of resources to populate values in period_resources dictionary
        self.resources = list()

        # Dictionaries by period, which in turn contain dictionaries by resource with the following parameters:
        # region, technology, a boolean for distributed resources, and capacity
        self.period_region = dict()
        self.region = dict()
        self.period_technology = dict()
        self.technology = dict()
        self.period_feeder = dict()
        self.feeder = dict()
        self.period_capacity = dict()
        self.capacity = dict()

        # Dictionary with duration for storage resources only
        self.period_duration = dict()
        self.duration = dict()
        with open(os.path.join(inputs_directory, "resources.csv"), "Ur") as resources_file:
            resources_reader = csv.reader(resources_file)
            resources_reader.next()
            last_period = 1
            for row in resources_reader:
                if int(row[0]) == last_period:
                    self.resources.append(str(row[1]))
                    self.region[str(row[1])] = str(row[2])
                    self.technology[str(row[1])] = str(row[3])
                    self.feeder[str(row[1])] = int(row[4])
                    if row[5] == "":
                        pass
                    else:
                        self.capacity[str(row[1])] = float(row[5])
                    if row[6] == "":
                        pass
                    else:
                        self.duration[str(row[1])] = float(row[6])
                else:
                    # Assign to period dictionary
                    self.period_resources[last_period] = self.resources
                    self.period_region[last_period] = self.region
                    self.period_technology[last_period] = self.technology
                    self.period_feeder[last_period] = self.feeder
                    self.period_capacity[last_period] = self.capacity
                    self.period_duration[last_period] = self.duration

                    # Clean up
                    self.resources = list()
                    self.region = dict()
                    self.technology = dict()
                    self.feeder= dict()
                    self.capacity = dict()
                    self.duration = dict()

                    # Correct last row
                    last_period = int(row[0])

                    # Start over
                    self.resources.append(str(row[1]))
                    self.region[str(row[1])] = str(row[2])
                    self.technology[str(row[1])] = str(row[3])
                    self.feeder[str(row[1])] = int(row[4])
                    if row[5] == "":
                        pass
                    else:
                        self.capacity[str(row[1])] = float(row[5])
                    if row[6] == "":
                        pass
                    else:
                        self.duration[str(row[1])] = float(row[6])

        # List of transmission lines
        self.transmission_lines = list()
        # Dictionaries with transmission lines as keys; values are:
        # Region where transmission line starts
        self.transmission_from = dict()
        # Region where transmission line ends
        self.transmission_to = dict()
        # Transmission capacity
        self.transmission_capacity = dict()
        with open(os.path.join(inputs_directory, "transmission.csv"), "Ur") as transmission_file:
            transmission_reader = csv.reader(transmission_file)
            transmission_reader.next()
            for row in transmission_reader:
                self.transmission_lines.append(str(row[0]))
                self.transmission_from[str(row[0])] = str(row[1])
                self.transmission_to[str(row[0])] = str(row[2])
                self.transmission_capacity[str(row[0])] = int(row[3])

        # Loads
        # Dictionary with period as keys, containing dictionary with timepoints as keys and load as values
        self.period_net_distributed_load = util.recursivedict()
        self.net_distributed_load = util.recursivedict()
        # Same as above but for minimum cumulative flexible load,
        self.period_min_cum_flex_load = util.recursivedict()
        self.min_cumulative_flex_load = util.recursivedict()
        # maximum cumulative net load,
        self.period_max_cum_flex_load = util.recursivedict()
        self.max_cumulative_flex_load = util.recursivedict()
        # minimum cumulative EV load,
#        self.period_min_cum_ev_load = util.recursivedict()
#        self.min_cumulative_ev_load = util.recursivedict()
#        # maximum cumulative EV load,
#        self.period_max_cum_ev_load = util.recursivedict()
#        self.max_cumulative_ev_load = util.recursivedict()
        # renewable output.
        self.period_bulk_renewables = util.recursivedict()
        self.bulk_renewables = util.recursivedict()

        with open(os.path.join(inputs_directory, "net_load.csv"), "Ur") as net_load_file:
            net_load_reader = csv.reader(net_load_file)
            net_load_reader.next()
            for row in net_load_reader:
                self.net_distributed_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] = float(row[4])   
                self.min_cumulative_flex_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] = float(row[5])
                self.max_cumulative_flex_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] = float(row[6])
#                self.min_cum_ev_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] = float(row[7])
#                self.max_cum_ev_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] =  float(row[8])
                self.bulk_renewables[int(row[0])][(row[1], int(row[2]),int(row[3]))] =  float(row[9])

                
        
#                self.period_bulk_renewables[row[1], int(row[3], int(row[2]))] = float(row[4])
#                if int(row[2]) == 168:  # TODO: remove hardcoding; this is super ugly, but works for testing purposes
#                    region_num += 1
#                    if region_num == 3:
#                        self.net_distributed_load[int(row[0])] = self.period_net_distributed_load
#                        self.period_net_distributed_load = dict()
#                        self.min_cumulative_flex_load[int(row[0])] = self.period_min_cum_flex_load
#                        self.period_min_cum_flex_load = dict()
#                        self.max_cumulative_flex_load[int(row[0])] = self.period_max_cum_flex_load
#                        self.period_max_cum_flex_load = dict()
#                        self.min_cumulative_ev_load[int(row[0])] = self.period_min_cum_ev_load
#                        self.period_min_cum_ev_load = dict()
#                        self.max_cumulative_ev_load[int(row[0])] = self.period_max_cum_ev_load
#                        self.period_max_cum_ev_load = dict()
#                        self.bulk_renewables[int(row[0])] = self.period_bulk_renewables
#                        self.period_bulk_renewables = dict()
#                        region_num = 0
#                    else:
#                        pass
#                else:
#                    pass

        # Dictionary with period as key containing a dictionary with regions as keys and maximum flexible load as values
        self.period_max_flex_load = util.recursivedict()
        with open(os.path.join(inputs_directory, "max_flex_load.csv"), "Ur") as max_flex_load_file:
            max_flex_load_reader = csv.reader(max_flex_load_file)
            max_flex_load_reader.next()
            for row in max_flex_load_reader:
                self.period_max_flex_load[int(row[0])][(row[1],int(row[2]))] = float(row[3])

#        # Dictionary with period as key containing a dictionary with regions as keys and maximum EV load as values
#        self.max_ev_load = dict()
#        self.period_max_ev_load = dict()
#        with open(os.path.join(inputs_directory, "max_ev_load.csv"), "Ur") as max_ev_load_file:
#            max_ev_load_reader = csv.reader(max_ev_load_file)
#            max_ev_load_reader.next()
#            last_period = 1
#            for row in max_ev_load_reader:
#                if int(row[0]) == last_period:
#                    self.max_ev_load[str(row[1])] = float(row[2])
#                else:
#                    self.period_max_ev_load[int(last_period)] = self.max_ev_load
#                    self.max_ev_load = dict()
#                    last_period = int(row[0])
#                    self.max_ev_load[str(row[1])] = float(row[2])

        # These are all single values and inelegantly instantiated inside the class here because it was easy
        # TODO: define outside of this class
        self.t_and_d_losses = 0
        self.curtailment_cost = 10**2
        self.unserved_energy_cost = 10**5
        self.dist_net_load_penalty = 1.0
        self.bulk_net_load_penalty = 1.0
        self.feeders = [0,1,2,3]
Beispiel #4
0
    def __init__(self, inputs_directory):

        # List of "periods" to optimize (can be optimized in parallel)
        self.periods = list()
        with open(os.path.join(inputs_directory, "periods.csv"),
                  "Ur") as periods_file:
            periods_reader = csv.reader(periods_file)
            periods_reader.next()
            for row in periods_reader:
                self.periods.append(int(row[0]))

        # List of regions
        # Also importing the penalty thresholds for the distribution and bulk systems
        self.regions = list()
        self.dist_net_load_threshold = dict()
        self.bulk_net_load_threshold = dict()
        with open(os.path.join(inputs_directory, "regions_dist.csv"),
                  "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:
                self.dist_net_load_threshold[(str(row[0]),
                                              int(row[1]))] = float(row[2])
        with open(os.path.join(inputs_directory, "regions_bulk.csv"),
                  "Ur") as regions_file:
            regions_reader = csv.reader(regions_file)
            regions_reader.next()
            for row in regions_reader:
                self.regions.append(str(row[0]))
                self.bulk_net_load_threshold[str(row[0])] = float(row[1])

        # Dictionary with period as key and the list of timepoints for each period as values
        self.period_timepoints = dict()
        # List of timepoints in each period (e.g. 1-24 for days, 1-168 for weeks, etc.)
        self.timepoints = list()
        # Dictionary with the order in which the cumulative flexible load constraint is enforced,
        # e.g. if starting it on timepoint 7, flex_load_timepoint 1 is assigned to timepoint 7
        # {7: 1, 8: 2, 9: 3 ...}
        self.flex_load_timepoints = dict()
        #        self.ev_load_timepoints = dict()
        self.period_flex_load_timepoints = dict()
        #        self.period_ev_load_timepoints = dict()
        with open(os.path.join(inputs_directory, "timepoints.csv"),
                  "Ur") as timepoints_file:
            timepoints_reader = csv.reader(timepoints_file)
            timepoints_reader.next()
            for row in timepoints_reader:
                self.timepoints.append(int(row[1]))
                self.flex_load_timepoints[int(row[1])] = int(row[2])
                #                self.ev_load_timepoints[int(row[1])] = int(row[3])
                if int(row[1]) == 168:
                    self.period_timepoints[int(row[0])] = self.timepoints
                    self.timepoints = list()
                    self.period_flex_load_timepoints[int(
                        row[0])] = self.flex_load_timepoints
                    self.flex_load_timepoints = dict()
#                    self.period_ev_load_timepoints[int(row[0])] = self.ev_load_timepoints
#                    self.ev_load_timepoints = dict()

# List of storage technologies
        self.storage_technologies = list()
        # Dictionaries with technology params (storage technologies as keys): large-storage boolean flag,
        # charging efficiency, discharging efficiency
        self.large_storage = dict()
        self.charging_efficiency = dict()
        self.discharging_efficiency = dict()
        with open(os.path.join(inputs_directory, "storage_technologies.csv"),
                  "Ur") as storage_technologies_file:
            storage_technologies_reader = csv.reader(storage_technologies_file)
            storage_technologies_reader.next()
            for row in storage_technologies_reader:
                self.storage_technologies.append(str(row[0]))
                self.large_storage[str(row[0])] = int(row[1])
                self.charging_efficiency[str(row[0])] = float(row[2])
                self.discharging_efficiency[str(row[0])] = float(row[3])

        # List of generation technologies; this doesn't vary by period, so no period dictionary needed
        self.generation_technologies = list()
        # Dictionary of variable cost by generation technologies (generation technologies as keys)
        self.variable_cost = dict()
        with open(
                os.path.join(inputs_directory, "generation_technologies.csv"),
                "Ur") as generation_technologies_file:
            generation_technologies_reader = csv.reader(
                generation_technologies_file)
            generation_technologies_reader.next()
            for row in generation_technologies_reader:
                self.generation_technologies.append(str(row[0]))
                self.variable_cost[str(row[0])] = float(row[1])

        # Dictionary with periods as keys, list of resources in each period as values
        self.period_resources = dict()
        # List of resources to populate values in period_resources dictionary
        self.resources = list()

        # Dictionaries by period, which in turn contain dictionaries by resource with the following parameters:
        # region, technology, a boolean for distributed resources, and capacity
        self.period_region = dict()
        self.region = dict()
        self.period_technology = dict()
        self.technology = dict()
        self.period_feeder = dict()
        self.feeder = dict()
        self.period_capacity = dict()
        self.capacity = dict()

        # Dictionary with duration for storage resources only
        self.period_duration = dict()
        self.duration = dict()
        with open(os.path.join(inputs_directory, "resources.csv"),
                  "Ur") as resources_file:
            resources_reader = csv.reader(resources_file)
            resources_reader.next()
            last_period = 1
            for row in resources_reader:
                if int(row[0]) == last_period:
                    self.resources.append(str(row[1]))
                    self.region[str(row[1])] = str(row[2])
                    self.technology[str(row[1])] = str(row[3])
                    self.feeder[str(row[1])] = int(row[4])
                    if row[5] == "":
                        pass
                    else:
                        self.capacity[str(row[1])] = float(row[5])
                    if row[6] == "":
                        pass
                    else:
                        self.duration[str(row[1])] = float(row[6])
                else:
                    # Assign to period dictionary
                    self.period_resources[last_period] = self.resources
                    self.period_region[last_period] = self.region
                    self.period_technology[last_period] = self.technology
                    self.period_feeder[last_period] = self.feeder
                    self.period_capacity[last_period] = self.capacity
                    self.period_duration[last_period] = self.duration

                    # Clean up
                    self.resources = list()
                    self.region = dict()
                    self.technology = dict()
                    self.feeder = dict()
                    self.capacity = dict()
                    self.duration = dict()

                    # Correct last row
                    last_period = int(row[0])

                    # Start over
                    self.resources.append(str(row[1]))
                    self.region[str(row[1])] = str(row[2])
                    self.technology[str(row[1])] = str(row[3])
                    self.feeder[str(row[1])] = int(row[4])
                    if row[5] == "":
                        pass
                    else:
                        self.capacity[str(row[1])] = float(row[5])
                    if row[6] == "":
                        pass
                    else:
                        self.duration[str(row[1])] = float(row[6])

        # List of transmission lines
        self.transmission_lines = list()
        # Dictionaries with transmission lines as keys; values are:
        # Region where transmission line starts
        self.transmission_from = dict()
        # Region where transmission line ends
        self.transmission_to = dict()
        # Transmission capacity
        self.transmission_capacity = dict()
        with open(os.path.join(inputs_directory, "transmission.csv"),
                  "Ur") as transmission_file:
            transmission_reader = csv.reader(transmission_file)
            transmission_reader.next()
            for row in transmission_reader:
                self.transmission_lines.append(str(row[0]))
                self.transmission_from[str(row[0])] = str(row[1])
                self.transmission_to[str(row[0])] = str(row[2])
                self.transmission_capacity[str(row[0])] = int(row[3])

        # Loads
        # Dictionary with period as keys, containing dictionary with timepoints as keys and load as values
        self.period_net_distributed_load = util.recursivedict()
        self.net_distributed_load = util.recursivedict()
        # Same as above but for minimum cumulative flexible load,
        self.period_min_cum_flex_load = util.recursivedict()
        self.min_cumulative_flex_load = util.recursivedict()
        # maximum cumulative net load,
        self.period_max_cum_flex_load = util.recursivedict()
        self.max_cumulative_flex_load = util.recursivedict()
        # minimum cumulative EV load,
        #        self.period_min_cum_ev_load = util.recursivedict()
        #        self.min_cumulative_ev_load = util.recursivedict()
        #        # maximum cumulative EV load,
        #        self.period_max_cum_ev_load = util.recursivedict()
        #        self.max_cumulative_ev_load = util.recursivedict()
        # renewable output.
        self.period_bulk_renewables = util.recursivedict()
        self.bulk_renewables = util.recursivedict()

        with open(os.path.join(inputs_directory, "net_load.csv"),
                  "Ur") as net_load_file:
            net_load_reader = csv.reader(net_load_file)
            net_load_reader.next()
            for row in net_load_reader:
                self.net_distributed_load[int(row[0])][(row[1], int(
                    row[2]), int(row[3]))] = float(row[4])
                self.min_cumulative_flex_load[int(row[0])][(row[1], int(
                    row[2]), int(row[3]))] = float(row[5])
                self.max_cumulative_flex_load[int(row[0])][(row[1], int(
                    row[2]), int(row[3]))] = float(row[6])
                #                self.min_cum_ev_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] = float(row[7])
                #                self.max_cum_ev_load[int(row[0])][(row[1], int(row[2]),int(row[3]))] =  float(row[8])
                self.bulk_renewables[int(row[0])][(row[1], int(
                    row[2]), int(row[3]))] = float(row[9])

#                self.period_bulk_renewables[row[1], int(row[3], int(row[2]))] = float(row[4])
#                if int(row[2]) == 168:  # TODO: remove hardcoding; this is super ugly, but works for testing purposes
#                    region_num += 1
#                    if region_num == 3:
#                        self.net_distributed_load[int(row[0])] = self.period_net_distributed_load
#                        self.period_net_distributed_load = dict()
#                        self.min_cumulative_flex_load[int(row[0])] = self.period_min_cum_flex_load
#                        self.period_min_cum_flex_load = dict()
#                        self.max_cumulative_flex_load[int(row[0])] = self.period_max_cum_flex_load
#                        self.period_max_cum_flex_load = dict()
#                        self.min_cumulative_ev_load[int(row[0])] = self.period_min_cum_ev_load
#                        self.period_min_cum_ev_load = dict()
#                        self.max_cumulative_ev_load[int(row[0])] = self.period_max_cum_ev_load
#                        self.period_max_cum_ev_load = dict()
#                        self.bulk_renewables[int(row[0])] = self.period_bulk_renewables
#                        self.period_bulk_renewables = dict()
#                        region_num = 0
#                    else:
#                        pass
#                else:
#                    pass

# Dictionary with period as key containing a dictionary with regions as keys and maximum flexible load as values
        self.period_max_flex_load = util.recursivedict()
        with open(os.path.join(inputs_directory, "max_flex_load.csv"),
                  "Ur") as max_flex_load_file:
            max_flex_load_reader = csv.reader(max_flex_load_file)
            max_flex_load_reader.next()
            for row in max_flex_load_reader:
                self.period_max_flex_load[int(row[0])][(row[1], int(
                    row[2]))] = float(row[3])


#        # Dictionary with period as key containing a dictionary with regions as keys and maximum EV load as values
#        self.max_ev_load = dict()
#        self.period_max_ev_load = dict()
#        with open(os.path.join(inputs_directory, "max_ev_load.csv"), "Ur") as max_ev_load_file:
#            max_ev_load_reader = csv.reader(max_ev_load_file)
#            max_ev_load_reader.next()
#            last_period = 1
#            for row in max_ev_load_reader:
#                if int(row[0]) == last_period:
#                    self.max_ev_load[str(row[1])] = float(row[2])
#                else:
#                    self.period_max_ev_load[int(last_period)] = self.max_ev_load
#                    self.max_ev_load = dict()
#                    last_period = int(row[0])
#                    self.max_ev_load[str(row[1])] = float(row[2])

# These are all single values and inelegantly instantiated inside the class here because it was easy
# TODO: define outside of this class
        self.t_and_d_losses = 0
        self.curtailment_cost = 10**2
        self.unserved_energy_cost = 10**5
        self.dist_net_load_penalty = 1.0
        self.bulk_net_load_penalty = 1.0
        self.feeders = [0, 1, 2, 3]