예제 #1
0
def main(solver=config.user_config.solver):
    logging.basicConfig(level=logging.CRITICAL, format='%(levelname)s: %(message)s')
    from minpower import solve
    
    dirNm=splitFilename(__file__)[0]
    if dirNm=='': dirNm='.'
    excludeL=[]
    for fileNm in os.listdir(dirNm):
        if fileNm in excludeL: continue
        testDir = joindir(dirNm, fileNm)
        if not os.path.isdir(testDir): continue
        print 'testing: ',fileNm
        wipeTestSlate(testDir)
        fResults=open(joindir(testDir,'results.txt'),'w+')
        fError=open(joindir(testDir,'error.txt'),'w+')
        sys.stdout=fResults #switch output to results file 
        if hasPyscript(testDir):
            sys.stdout = sys.__stdout__ #switch back to standard outputting
            os.system('python {s}'.format(s=hasPyscript(testDir)[0]))
        else:
            try: 
                user_config.scenarios = 2
                solve.solve_problem(testDir)
                sys.stdout = sys.__stdout__ #switch back to standard outputting
                fError.close()
                os.remove(joindir(testDir,'error.txt'))
            except: #write the error to file
                exc_type, exc_value, exc_traceback = sys.exc_info()
                traceback.print_tb(exc_traceback, file=fError )
                traceback.print_exception(exc_type, exc_value, exc_traceback, file=fError)
                sys.stdout = sys.__stdout__ #switch back to standard outputting
                print '\t had error' #note that this dir produced error
    else: 
        sys.stdout = sys.__stdout__ #switch back to standard outputting
예제 #2
0
def main(args):
    generators, loads, _, times, _, data = parsedir()
    generators = [gen for gen in generators if gen.is_controllable]

    gen_data = data["generators"]
    if args["min"] == 0:
        args["min"] = 1.1 * gen_data.pmin.sum()

    if args["max"] == 0:
        args["max"] = 0.99 * gen_data.pmax.sum()

    load_values = np.arange(args["min"], args["max"], args["interval"])
    results = DataFrame(columns=["prices", "committed", "last_committed"],
                        index=load_values)

    committed_gen_names = Index([])

    for load_val in load_values:
        print(load_val)
        loads_times = make_loads_times(Pd=load_val)
        power_system, times = solve_problem(generators,
                                            do_reset_config=False,
                                            **loads_times)
        t = times[0]
        results.loc[load_val, "prices"] = power_system.buses[0].price(t)
        statuses = Series(
            dict([(gen.name, gen.status(t).value)
                  for gen in power_system.generators()]))

        results.loc[load_val, "committed"] = statuses.sum()
        results.loc[load_val, "last_committed"] = statuses[
            statuses == 1].index.difference(committed_gen_names)
        committed_gen_names = statuses[statuses == 1].index

    if (load_values[-1] == 0.99 *
            gen_data.pmax.sum()) and (statuses.sum() != len(generators)):
        print("warning: uncommitted generation:")
        print((gen_data.set_index("name").loc[statuses[statuses == 0].index]))

    results.to_csv(joindir(user_config.directory, "ed_sweep.csv"))

    if args["hide_units_committed"]:
        ax = results.prices.plot(drawstyle="steps")
    else:
        ax = results[["prices", "committed"]].plot(drawstyle="steps",
                                                   secondary_y=["committed"])
        ax.right_ax.set_ylabel("Units committed")

    ax.set_xlabel("System Load (MW)")
    ax.set_ylabel("Estimated System Price ($/MWh)")

    plt.savefig(joindir(user_config.directory, "ed_sweep.png"))
예제 #3
0
def main(args):
    generators, loads, _, times, _, data = parsedir()
    generators = filter(lambda gen: gen.is_controllable, generators)

    gen_data = data['generators']
    if args['min'] == 0:
        args['min'] = 1.1 * gen_data.pmin.sum()

    if args['max'] == 0:
        args['max'] = 0.99 * gen_data.pmax.sum()

    load_values = np.arange(args['min'], args['max'], args['interval'])
    results = DataFrame(columns=['prices', 'committed', 'last_committed'],
                        index=load_values)

    committed_gen_names = Index([])

    for load_val in load_values:
        print load_val
        loads_times = make_loads_times(Pd=load_val)
        power_system, times = solve_problem(generators,
                                            do_reset_config=False,
                                            **loads_times)
        t = times[0]
        results.ix[load_val, 'prices'] = power_system.buses[0].price(t)
        statuses = Series(
            dict([(gen.name, gen.status(t).value)
                  for gen in power_system.generators()]))

        results.ix[load_val, 'committed'] = statuses.sum()
        results.ix[load_val, 'last_committed'] = \
            statuses[statuses == 1].index.diff(committed_gen_names)
        committed_gen_names = statuses[statuses == 1].index

    if (load_values[-1] == 0.99 * gen_data.pmax.sum()) and \
        (statuses.sum() != len(generators)):
        print('warning: uncommitted generation:')
        print(gen_data.set_index('name').ix[statuses[statuses == 0].index])

    results.to_csv(joindir(user_config.directory, 'ed_sweep.csv'))

    if args['hide_units_committed']:
        ax = results.prices.plot(drawstyle='steps')
    else:
        ax = results[['prices', 'committed']].plot(drawstyle='steps',
                                                   secondary_y=['committed'])
        ax.right_ax.set_ylabel('Units committed')

    ax.set_xlabel('System Load (MW)')
    ax.set_ylabel('Estimated System Price ($/MWh)')

    plt.savefig(joindir(user_config.directory, 'ed_sweep.png'))
예제 #4
0
파일: ed_sweep.py 프로젝트: ZiiCee/minpower
def main(args):
    generators, loads, _, times, _, data = parsedir()
    generators = filter(lambda gen: gen.is_controllable, generators)

    gen_data = data['generators']
    if args['min'] == 0:
        args['min'] = 1.1 * gen_data.pmin.sum()

    if args['max'] == 0:
        args['max'] = 0.99 * gen_data.pmax.sum()

    load_values = np.arange(args['min'], args['max'], args['interval'])
    results = DataFrame(columns=['prices', 'committed', 'last_committed'], index=load_values)

    committed_gen_names = Index([])

    for load_val in load_values:
        print load_val
        loads_times = make_loads_times(Pd=load_val)
        power_system, times = solve_problem(generators,
                                            do_reset_config=False, **loads_times)
        t = times[0]
        results.ix[load_val, 'prices'] = power_system.buses[0].price(t)
        statuses = Series(dict([(gen.name, gen.status(t).value)
                                for gen in power_system.generators()]))

        results.ix[load_val, 'committed'] = statuses.sum()
        results.ix[load_val, 'last_committed'] = \
            statuses[statuses == 1].index.difference(committed_gen_names)
        committed_gen_names = statuses[statuses == 1].index

    if (load_values[-1] == 0.99 * gen_data.pmax.sum()) and \
            (statuses.sum() != len(generators)):
        print('warning: uncommitted generation:')
        print(gen_data.set_index('name').ix[statuses[statuses == 0].index])

    results.to_csv(joindir(user_config.directory, 'ed_sweep.csv'))

    if args['hide_units_committed']:
        ax = results.prices.plot(drawstyle='steps')
    else:
        ax = results[['prices', 'committed']].plot(drawstyle='steps', secondary_y=['committed'])
        ax.right_ax.set_ylabel('Units committed')

    ax.set_xlabel('System Load (MW)')
    ax.set_ylabel('Estimated System Price ($/MWh)')

    plt.savefig(joindir(user_config.directory, 'ed_sweep.png'))
예제 #5
0
def initial_dispatch(directory=".", output_filename="initial.csv"):
    user_config.directory = directory
    user_config.dispatch_decommit_allowed = True

    generators_data, loads_data, lines_data, init_data = _load_raw_data()

    init_data = pd.DataFrame()

    timeseries, times, generators_data, loads_data = setup_times(
        generators_data, loads_data)

    # get rid of a bunch of stuff to make this an ED problem
    generators_data["power"] = None
    loads_data["power"] = None
    for i, snm in generators_data.pop("schedulename").dropna().iterkv():
        generators_data.loc[i, "power"] = timeseries[snm].values[0]

    for i, snm in loads_data.pop("schedulename").dropna().iterkv():
        loads_data.loc[i, "power"] = timeseries[snm].values[0]

    for i, snm in generators_data.pop("observedname").dropna().iterkv():
        generators_data.loc[i, "power"] = timeseries[snm].values[0]

    valid_columns = pd.Index([
        "name",
        "pmin",
        "pmax",
        "fuelcost",
        "heatrateequation",
        "costcurveequation",
        "sheddingallowed",
        "power",
    ])

    generators_data = generators_data[generators_data.columns & valid_columns]

    generators, loads, lines, times, scenario_values, data = _parse_raw_data(
        generators_data, loads_data, lines_data, init_data)

    power_system = PowerSystem(generators, loads, lines)
    sln = create_solve_problem(power_system, times)

    # save a csv of the dispatch
    dispatch = pd.DataFrame(
        {
            "power": sln.generators_power.loc[0].values,
            "status": sln.generators_status.loc[0].values,
        },
        index=[gen.name for gen in sln.generators],
    )
    dispatch.loc[dispatch.status == 0, "power"] = 0
    dispatch.index.name = "name"
    dispatch.to_csv(joindir(user_config.directory, output_filename))

    print(dispatch)
예제 #6
0
def initial_dispatch(directory='.', output_filename='initial.csv'):
    user_config.directory = directory
    user_config.dispatch_decommit_allowed = True

    generators_data, loads_data, lines_data, init_data = _load_raw_data()

    init_data = pd.DataFrame()

    timeseries, times, generators_data, loads_data = \
        setup_times(generators_data, loads_data)

    # get rid of a bunch of stuff to make this an ED problem
    generators_data['power'] = None
    loads_data['power'] = None
    for i, snm in generators_data.pop('schedulename').dropna().iterkv():
        generators_data.ix[i, 'power'] = timeseries[snm].values[0]

    for i, snm in loads_data.pop('schedulename').dropna().iterkv():
        loads_data.ix[i, 'power'] = timeseries[snm].values[0]

    for i, snm in generators_data.pop('observedname').dropna().iterkv():
        generators_data.ix[i, 'power'] = timeseries[snm].values[0]

    valid_columns = pd.Index([
        'name', 'pmin', 'pmax', 'fuelcost', 'heatrateequation',
        'costcurveequation', 'sheddingallowed', 'power'
    ])

    generators_data = generators_data[generators_data.columns & valid_columns]

    generators, loads, lines, times, scenario_values, data = \
        _parse_raw_data(generators_data, loads_data,
            lines_data, init_data)

    power_system = PowerSystem(generators, loads, lines)
    sln = create_solve_problem(power_system, times)

    # save a csv of the dispatch
    dispatch = pd.DataFrame(
        {
            'power': sln.generators_power.ix[0].values,
            'status': sln.generators_status.ix[0].values
        },
        index=[gen.name for gen in sln.generators])
    dispatch.ix[dispatch.status == 0, 'power'] = 0
    dispatch.index.name = 'name'
    dispatch.to_csv(joindir(user_config.directory, output_filename))

    print(dispatch)
예제 #7
0
def initial_dispatch(directory='.', output_filename='initial.csv'):
    user_config.directory = directory
    user_config.dispatch_decommit_allowed = True
    
    generators_data, loads_data, lines_data, init_data = _load_raw_data()
    
    init_data = pd.DataFrame()
    
    timeseries, times, generators_data, loads_data = \
        setup_times(generators_data, loads_data)

    # get rid of a bunch of stuff to make this an ED problem    
    generators_data['power'] = None
    loads_data['power'] = None
    for i, snm in generators_data.pop('schedulename').dropna().iterkv():
        generators_data.ix[i, 'power'] = timeseries[snm].values[0]

    for i, snm in loads_data.pop('schedulename').dropna().iterkv():
        loads_data.ix[i, 'power'] = timeseries[snm].values[0]
                
    for i, snm in generators_data.pop('observedname').dropna().iterkv():
        generators_data.ix[i, 'power'] = timeseries[snm].values[0]
    
    valid_columns = pd.Index([
        'name', 'pmin', 'pmax',
        'fuelcost', 'heatrateequation', 'costcurveequation',
        'sheddingallowed',
        'power'])
    
    generators_data = generators_data[generators_data.columns & valid_columns]
        
    generators, loads, lines, times, scenario_values, data = \
        _parse_raw_data(generators_data, loads_data, 
            lines_data, init_data)

    power_system = PowerSystem(generators, loads, lines)
    sln = create_solve_problem(power_system, times)

    # save a csv of the dispatch
    dispatch = pd.DataFrame({
        'power': sln.generators_power.ix[0].values, 
        'status': sln.generators_status.ix[0].values},
        index=[gen.name for gen in sln.generators])
    dispatch.ix[dispatch.status==0, 'power'] = 0
    dispatch.index.name = 'name'
    dispatch.to_csv(joindir(user_config.directory, output_filename))
    
    print(dispatch)
예제 #8
0
def hasPyscript(dir): return glob.glob(joindir(dir,'*.py'))

def main(solver=config.user_config.solver):
예제 #9
0
def wipeTestSlate(dir):
    patterns=['*.png','*.lp','commitment.csv','dispatch.csv','error.txt']
    for pat in patterns:
        for f in glob.glob(joindir(dir,pat)): os.remove(f)
예제 #10
0
def hasPyscript(dir):
    return glob.glob(joindir(dir, "*.py"))
예제 #11
0
def wipeTestSlate(dir):
    patterns = ["*.png", "*.lp", "commitment.csv", "dispatch.csv", "error.txt"]
    for pat in patterns:
        for f in glob.glob(joindir(dir, pat)):
            os.remove(f)
예제 #12
0
def hasPyscript(dir):
    return glob.glob(joindir(dir, '*.py'))