def t_off2case(quiet=False): """Tests for code in C{off2case}. @author: Ray Zimmerman (PSERC Cornell) """ n_tests = 35 t_begin(n_tests, quiet) ## generator data # bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf gen0 = array([[ 1, 10, 0, 60, -15, 1, 100, 1, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 2, 10, 0, 60, -15, 1, 100, 1, 60, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 7, -30, -15, 0, -15, 1, 100, 1, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 13, 10, 0, 60, -15, 1, 100, 1, 60, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 30, -30, 7.5, 7.5, 0, 1, 100, 1, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]], float) ## generator cost data # 1 startup shutdown n x1 y1 ... xn yn # 2 startup shutdown n c(n-1) ... c0 gencost0 = array([[1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 100, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 0, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 50, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000]], float) try: from pypower.extras.smartmarket import off2case except ImportError: t_skip(n_tests, 'smartmarket code not available') return t = 'isload()' t_is(isload(gen0), array([0, 0, 1, 0, 1], bool), 8, t) G = find(~isload(gen0)) L = find(isload(gen0)) nGL = len(G) + len(L) t = 'P offers only' offers = {'P': {}} offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'].flatten() gen1[L, GEN_STATUS] = 0 t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700], ]), zeros((3, 4))] t_is(gencost, gencost1, 8, [t, ' - gencost']) offers['P']['qty'] = array([[25], [26], [0], [27], [0]], float) offers['P']['prc'] = array([[10], [50], [0], [100], [0]], float) gen, gencost = off2case(gen0, gencost0, offers) t_is(gen, gen1, 8, [t, ' (all rows in offer) - gen']) t_is(gencost, gencost1, 8, [t, ' (all rows in offer) - gencost']) t = 'P offers only (GEN_STATUS=0 for 0 qty offer)' offers['P']['qty'] = array([[0], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G[1:3], PMAX] = offers['P']['qty'].flatten()[1:3] gen1[G[0], GEN_STATUS] = 0 gen1[L, GEN_STATUS] = 0 t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G[1:3], range( NCOST, NCOST + 9))] = c_[array([[2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700]]), zeros((2, 4))] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers, lim[\'P\'][\'max_offer\']' offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) lim = {'P': {'max_offer': 75}} gen, gencost = off2case(gen0, gencost0, offers, lim=lim) gen1 = gen0.copy() gen1[G[:2], PMAX] = offers['P']['qty'].flatten()[:2, :] gen1[r_[G[2], L], GEN_STATUS] = 0 t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G[:2], range( NCOST, NCOST + 9))] = c_[array([[2, 0, 0, 25, 250], [2, 0, 0, 26, 1300]]), zeros((2, 4))] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids' bids = { 'P': { 'qty': array([[20], [28]], float), 'prc': array([[100], [10]], float) } } gen, gencost = off2case(gen0, gencost0, offers, bids) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([[-20, -10, 0], [-28, 0, 7]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :8].copy() gencost1[ix_(G, range(NCOST, NCOST + 4))] = array([[2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700]]) gencost1[ix_(L, range(NCOST, NCOST + 4))] = array([[2, -20, -2000, 0, 0], [2, -28, -280, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids (all rows in bid)' bids['P']['qty'] = array([[0], [0], [20], [0], [28]], float) bids['P']['prc'] = array([[0], [0], [100], [0], [10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids) t_is(gen, gen1, 8, [t, ' - gen']) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids (GEN_STATUS=0 for 0 qty bid)' bids['P']['qty'] = array([[0], [28]], float) bids['P']['prc'] = array([[100], [10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[L[0], GEN_STATUS] = 0 gen1[L[1], [PMIN, QMIN, QMAX]] = array([-28, 0, 7]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[ array([[2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700]]), zeros((3, 4))] gencost1[L[1], NCOST:NCOST + 8] = c_[array([[2, -28, -280, 0, 0]]), zeros((1, 4))] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids (1 gen with both)' gen2 = gen0.copy() gen2[1, PMIN] = -5 bids['P']['qty'] = array([[0], [3], [20], [0], [28]], float) bids['P']['prc'] = array([[0], [50], [100], [0], [10]], float) gen, gencost = off2case(gen2, gencost0, offers, bids) gen1 = gen2.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[1, PMIN] = -sum(bids['P']['qty'][1, :]) gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([[-20, -10, 0], [-28, 0, 7]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :10].copy() gencost1[ix_(G, range(NCOST, NCOST + 7))] = array([[2, 0, 0, 25, 250, 0, 0], [3, -3, -150, 0, 0, 26, 1300], [2, 0, 0, 27, 2700, 0, 0]]) gencost1[ix_(L, range( NCOST, NCOST + 7))] = c_[array([[2, -20, -2000, 0, 0], [2, -28, -280, 0, 0]]), zeros((2, 2))] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids, lim[\'P\'][\'max_offer\']/[\'min_bid\']' bids['P']['qty'] = array([[20], [28]], float) bids['P']['prc'] = array([[100], [10]], float) lim['P']['min_bid'] = 50.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[G[:2], PMAX] = offers['P']['qty'][:2, :] gen1[r_[G[2], L[1]], GEN_STATUS] = 0 gen1[L[0], [PMIN, QMIN, QMAX]] = array([-20, -10, 0]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G[:2], range( NCOST, NCOST + 9))] = c_[array([[2, 0, 0, 25, 250], [2, 0, 0, 26, 1300]]), zeros((2, 4))] gencost1[L[0], NCOST:NCOST + 9] = array([2, -20, -2000, 0, 0, 0, 0, 0, 0]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'P offers & P bids, lim[\'P\'][\'max_offer\']/[\'min_bid\'], multi-block' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[20, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[G, PMAX] = array([10, 50, 25]) gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([[-30, -15, 0], [-12, 0, 3]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :10].copy() gencost1[ix_(G, range(NCOST, NCOST + 7))] = array([[2, 0, 0, 10, 100, 0, 0], [3, 0, 0, 20, 500, 50, 2450], [2, 0, 0, 25, 1250, 0, 0]]) gencost1[ix_(L, range(NCOST, NCOST + 7))] = array([[3, -30, -2600, -20, -2000, 0, 0], [2, -12, -840, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) ##----- reactive ----- ## generator cost data # 1 startup shutdown n x1 y1 ... xn yn # 2 startup shutdown n c(n-1) ... c0 gencost0 = array([[1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 100, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 0, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 50, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, -15, -150, 0, 0, 30, 150, 60, 450], [1, 100, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 3, -20, -15, -10, -10, 0, 0, 0, 0], [1, 0, 0, 3, 0, 0, 40, 80, 60, 180, 0, 0], [1, 0, 50, 2, 0, 0, 0, 0, 0, 0, 0, 0]], float) t = 'PQ offers only' offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) offers['Q']['qty'] = array([[10], [20], [30]], float) offers['Q']['prc'] = array([[10], [5], [1]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[G, QMAX] = offers['Q']['qty'] gen1[G, QMIN] = 0 gen1[L, GEN_STATUS] = 0 t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[ array([[2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700]]), zeros((3, 4))] gencost1[ix_(G + nGL - 1, range(NCOST, NCOST + 9))] = c_[ array([[2, 0, 0, 10, 100], [2, 0, 0, 20, 100], [2, 0, 0, 30, 30]]), zeros((3, 4))] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, lim.P/Q.max_offer/min_bid, multi-block' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[20, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) offers['Q']['qty'] = array([[5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [5, 60], [1, 10]], float) bids['Q']['qty'] = array([15, 10, 15, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([[1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [1, -10, 0, -5, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array( [[2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [3, -30, -2600, -20, -2000, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -15, -75, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, for gen, no P, no shutdown' gen2 = gen0.copy() gen2[0, PMIN] = 0 offers['P']['qty'] = array([[0, 40], [20, 30], [25, 25]], float) gen, gencost = off2case(gen2, gencost0, offers, bids, lim) gen1[0, [PMIN, PMAX, QMIN, QMAX]] = array([0, 0, -15, 10]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1[0, NCOST:NCOST + 9] = gencost0[0, NCOST:NCOST + 9] t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, for gen, no Q, no shutdown' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['Q']['qty'] = array([[5, 5], [0, 10], [15, 15]], float) bids['Q']['qty'] = array([15, 0, 15, 15, 0], float) gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1[0, [PMIN, PMAX, QMIN, QMAX]] = array([10, 10, -15, 10]) ## restore original gen1[1, [PMIN, PMAX, QMIN, QMAX]] = array([12, 50, 0, 0]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1[ix_([0, 1, 6], range(NCOST, NCOST + 9))] = array( [[2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, lim.P/Q.max_offer/min_bid, multi-block' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[10, 0], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) offers['Q']['qty'] = array([[5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [5, 60], [1, 10]], float) bids['Q']['qty'] = array([15, 10, 10, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([[1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [1, -10, 0, -5, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST:NCOST + 9] = array( [[2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, -10, -1000, 0, 0, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -10, -50, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, zero Q load w/P bid, shutdown bugfix' gen1 = gen0.copy() gen1[4, [QG, QMIN, QMAX]] = 0 gen, gencost = off2case(gen1, gencost0, offers, bids, lim) gen1[:, [PMIN, PMAX, QMIN, QMAX]] = array([[10, 10, -15, 10], [12, 50, -10, 10], [-10, 0, -5, 0], [12, 25, 0, 30], [-12, 0, 0, 0]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array([[2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, -10, -1000, 0, 0, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [2, -12, -840, 0, 0, 0, 0, 0, 0], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -10, -50, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t = 'PQ offers & PQ bids, non-zero Q load w/no P bid, shutdown bugfix' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[0, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 40], [70, 10]], float) offers['Q']['qty'] = array([[5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [5, 60], [1, 10]], float) bids['Q']['qty'] = array([15, 10, 15, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([[1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [0, -30, 0, -15, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5]]) t_is(gen, gen1, 8, [t, ' - gen']) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array( [[2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [3, -20, -15, -10, -10, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0]]) t_is(gencost, gencost1, 8, [t, ' - gencost']) t_end()
def t_runmarket(quiet=False): """Tests for code in C{runmkt}, C{smartmkt} and C{auction}. @author: Ray Zimmerman (PSERC Cornell) """ n_tests = 20 t_begin(n_tests, quiet) try: from pypower.extras.smartmarket import runmarket except ImportError: t_skip(n_tests, 'smartmarket code not available') t_end return ppc = loadcase('t_auction_case') ppopt = ppoption(OPF_ALG=560, OUT_ALL_LIM=1, OUT_BRANCH=0, OUT_SYS_SUM=0) ppopt = ppoption(ppopt, OUT_ALL=0, VERBOSE=1) #ppopt = ppoption(ppopt, OUT_GEN=1, OUT_BRANCH=0, OUT_SYS_SUM=0) offers = {'P': {}, 'Q': {}} bids = {'P': {}, 'Q': {}} offers['P']['qty'] = array([[12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24]]) offers['P']['prc'] = array([[20, 50, 60], [20, 40, 70], [20, 42, 80], [20, 44, 90], [20, 46, 75], [20, 48, 60]]) bids['P']['qty'] = array([[10, 10, 10], [10, 10, 10], [10, 10, 10]]) bids['P']['prc'] = array([ [100, 70, 60], # [100, 64.3, 20], # [100, 30.64545, 0], [100, 50, 20], [100, 60, 50] ]) offers['Q']['qty'] = [60, 60, 60, 60, 60, 60, 0, 0, 0] offers['Q']['prc'] = [0, 0, 0, 0, 0, 3, 0, 0, 0] bids.Q['qty'] = [15, 15, 15, 15, 15, 15, 15, 12, 7.5] # bids.Q['prc'] = [ 0, 0, 0, 0, 0, 0, 0, 83.9056, 0 ] bids.Q['prc'] = [0, 0, 0, 0, 0, 0, 0, 20, 0] t = 'marginal Q offer, marginal PQ bid, auction_type = 5' mkt = {'auction_type': 5, 't': [], 'u0': [], 'lim': []} r, co, cb, _, _, _, _ = runmarket(ppc, offers, bids, mkt, ppopt) co5 = co.copy() cb5 = cb.copy() # [ co['P']['qty'] co['P']['prc'] ] # [ cb['P']['qty'] cb['P']['prc'] ] # [ co['Q']['qty'] co['Q']['prc'] ] # [ cb['Q']['qty'] cb['Q']['prc'] ] i2e = r['bus'][:, BUS_I] e2i = sparse((max(i2e), 1)) e2i[i2e] = list(range(r['bus'].size)) G = find(isload(r['gen']) == 0) ## real generators L = find(isload(r['gen'])) ## dispatchable loads Gbus = e2i[r['gen'][G, GEN_BUS]] Lbus = e2i[r['gen'][L, GEN_BUS]] t_is(co['P']['qty'], ones((6, 1)) * [12, 24, 0], 2, [t, ' : gen P quantities']) t_is(co['P']['prc'][0, :], 50.1578, 3, [t, ' : gen 1 P prices']) t_is(cb['P']['qty'], [[10, 10, 10], [10, 0.196, 0], [10, 10, 0]], 2, [t, ' : load P quantities']) t_is(cb['P']['prc'][1, :], 56.9853, 4, [t, ' : load 2 P price']) t_is(co['P']['prc'][:, 0], r['bus'][Gbus, LAM_P], 8, [t, ' : gen P prices']) t_is(cb['P']['prc'][:, 0], r['bus'][Lbus, LAM_P], 8, [t, ' : load P prices']) t_is(co['Q']['qty'], [4.2722, 11.3723, 14.1472, 22.8939, 36.7886, 12.3375, 0, 0, 0], 2, [t, ' : Q offer quantities']) t_is(co['Q']['prc'], [0, 0, 0, 0, 0, 3, 0.4861, 2.5367, 1.3763], 4, [t, ' : Q offer prices']) t_is(cb['Q']['qty'], [0, 0, 0, 0, 0, 0, 15, 4.0785, 5], 2, [t, ' : Q bid quantities']) t_is(cb['Q']['prc'], [0, 0, 0, 0, 0, 3, 0.4861, 2.5367, 1.3763], 4, [t, ' : Q bid prices']) t_is(co['Q']['prc'], r['bus'][[Gbus, Lbus], LAM_Q], 8, [t, ' : Q offer prices']) t_is(cb['Q']['prc'], co['Q']['prc'], 8, [t, ' : Q bid prices']) t = 'marginal Q offer, marginal PQ bid, auction_type = 0' mkt['auction_type'] = 0 r, co, cb, _, _, _, _ = runmarket(ppc, offers, bids, mkt, ppopt) t_is(co['P']['qty'], co5['P']['qty'], 8, [t, ' : gen P quantities']) t_is(cb['P']['qty'], cb5['P']['qty'], 8, [t, ' : load P quantities']) t_is(co['P']['prc'], offers['P']['prc'], 8, [t, ' : gen P prices']) t_is(cb['P']['prc'], bids['P']['prc'], 8, [t, ' : load P prices']) t_is(co['Q']['qty'], co5['Q']['qty'], 8, [t, ' : gen Q quantities']) t_is(cb['Q']['qty'], cb5['Q']['qty'], 8, [t, ' : load Q quantities']) t_is(co['Q']['prc'], offers['Q']['prc'], 8, [t, ' : gen Q prices']) t_is(cb['Q']['prc'], bids['Q']['prc'], 8, [t, ' : load Q prices']) t_end
def t_qps_pypower(quiet=False): """Tests of C{qps_pypower} QP solvers. @author: Ray Zimmerman (PSERC Cornell) """ algs = [200, 250, 400, 500, 600, 700] names = ['PIPS', 'sc-PIPS', 'IPOPT', 'CPLEX', 'MOSEK', 'Gurobi'] check = [None, None, 'ipopt', 'cplex', 'mosek', 'gurobipy'] n = 36 t_begin(n * len(algs), quiet) for k in range(len(algs)): if check[k] is not None and not have_fcn(check[k]): t_skip(n, '%s not installed' % names[k]) else: opt = {'verbose': 0, 'alg': algs[k]} if names[k] == 'PIPS' or names[k] == 'sc-PIPS': opt['pips_opt'] = {} opt['pips_opt']['comptol'] = 1e-8 if names[k] == 'CPLEX': # alg = 0 ## default uses barrier method with NaN bug in lower lim multipliers alg = 2 ## use dual simplex ppopt = ppoption(CPLEX_LPMETHOD = alg, CPLEX_QPMETHOD = min([4, alg])) opt['cplex_opt'] = cplex_options([], ppopt) if names[k] == 'MOSEK': # alg = 5 ## use dual simplex ppopt = ppoption() # ppopt = ppoption(ppopt, MOSEK_LP_ALG = alg) ppopt = ppoption(ppopt, MOSEK_GAP_TOL=1e-9) opt['mosek_opt'] = mosek_options([], ppopt) t = '%s - 3-d LP : ' % names[k] ## example from 'doc linprog' c = array([-5, -4, -6], float) A = sparse([[1, -1, 1], [3, 2, 4], [3, 2, 0]], dtype=float) l = None u = array([20, 42, 30], float) xmin = array([0, 0, 0], float) x0 = None x, f, s, _, lam = qps_pypower(None, c, A, l, u, xmin, None, None, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, [0, 15, 3], 6, [t, 'x']) t_is(f, -78, 6, [t, 'f']) t_is(lam['mu_l'], [0, 0, 0], 13, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 1.5, 0.5], 9, [t, 'lam.mu_u']) t_is(lam['lower'], [1, 0, 0], 9, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - unconstrained 3-d quadratic : ' % names[k] ## from http://www.akiti.ca/QuadProgEx0Constr.html H = sparse([ [ 5, -2, -1], [-2, 4, 3], [-1, 3, 5] ], dtype=float) c = array([2, -35, -47], float) x0 = array([0, 0, 0], float) x, f, s, _, lam = qps_pypower(H, c, opt=opt) t_is(s, 1, 12, [t, 'success']) t_is(x, [3, 5, 7], 8, [t, 'x']) t_is(f, -249, 13, [t, 'f']) t_ok(len(lam['mu_l']) == 0, [t, 'lam.mu_l']) t_ok(len(lam['mu_u']) == 0, [t, 'lam.mu_u']) t_is(lam['lower'], zeros(shape(x)), 13, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - constrained 2-d QP : ' % names[k] ## example from 'doc quadprog' H = sparse([[ 1, -1], [-1, 2]], dtype=float) c = array([-2, -6], float) A = sparse([[ 1, 1], [-1, 2], [ 2, 1]], dtype=float) l = None u = array([2, 2, 3], float) xmin = array([0, 0]) x0 = None x, f, s, _, lam = qps_pypower(H, c, A, l, u, xmin, None, x0, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, array([2., 4.]) / 3, 7, [t, 'x']) t_is(f, -74. / 9, 6, [t, 'f']) t_is(lam['mu_l'], [0., 0., 0.], 13, [t, 'lam.mu_l']) t_is(lam['mu_u'], array([28., 4., 0.]) / 9, 7, [t, 'lam.mu_u']) t_is(lam['lower'], zeros(shape(x)), 8, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - constrained 4-d QP : ' % names[k] ## from http://www.jmu.edu/docs/sasdoc/sashtml/iml/chap8/sect12.htm H = sparse([[1003.1, 4.3, 6.3, 5.9], [4.3, 2.2, 2.1, 3.9], [6.3, 2.1, 3.5, 4.8], [5.9, 3.9, 4.8, 10.0]]) c = zeros(4) A = sparse([[ 1, 1, 1, 1], [0.17, 0.11, 0.10, 0.18]]) l = array([1, 0.10]) u = array([1, Inf]) xmin = zeros(4) x0 = array([1, 0, 0, 1], float) x, f, s, _, lam = qps_pypower(H, c, A, l, u, xmin, None, x0, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, array([0, 2.8, 0.2, 0]) / 3, 5, [t, 'x']) t_is(f, 3.29 / 3, 6, [t, 'f']) t_is(lam['mu_l'], array([6.58, 0]) / 3, 6, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 0], 13, [t, 'lam.mu_u']) t_is(lam['lower'], [2.24, 0, 0, 1.7667], 4, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - (dict) constrained 4-d QP : ' % names[k] p = {'H': H, 'A': A, 'l': l, 'u': u, 'xmin': xmin, 'x0': x0, 'opt': opt} x, f, s, _, lam = qps_pypower(p) t_is(s, 1, 12, [t, 'success']) t_is(x, array([0, 2.8, 0.2, 0]) / 3, 5, [t, 'x']) t_is(f, 3.29 / 3, 6, [t, 'f']) t_is(lam['mu_l'], array([6.58, 0]) / 3, 6, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 0], 13, [t, 'lam.mu_u']) t_is(lam['lower'], [2.24, 0, 0, 1.7667], 4, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - infeasible LP : ' % names[k] p = {'A': sparse([1, 1]), 'c': array([1, 1]), 'u': array([-1]), 'xmin': array([0, 0]), 'opt': opt} x, f, s, _, lam = qps_pypower(p) t_ok(s <= 0, [t, 'no success']) t_end()
def t_off2case(quiet=False): """Tests for code in C{off2case}. @author: Ray Zimmerman (PSERC Cornell) @author: Richard Lincoln """ n_tests = 35 t_begin(n_tests, quiet) ## generator data # bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf gen0 = array([ [1, 10, 0, 60, -15, 1, 100, 1, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 10, 0, 60, -15, 1, 100, 1, 60, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7, -30, -15, 0, -15, 1, 100, 1, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13, 10, 0, 60, -15, 1, 100, 1, 60, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, -30, 7.5, 7.5, 0, 1, 100, 1, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], float) ## generator cost data # 1 startup shutdown n x1 y1 ... xn yn # 2 startup shutdown n c(n-1) ... c0 gencost0 = array([ [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 100, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 0, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 50, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000] ], float) try: from pypower.extras.smartmarket import off2case except ImportError: t_skip(n_tests, 'smartmarket code not available') return t = 'isload()' t_is(isload(gen0), array([0, 0, 1, 0, 1], bool), 8, t) G = find( ~isload(gen0) ) L = find( isload(gen0) ) nGL = len(G) + len(L) t = 'P offers only'; offers = {'P': {}} offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'].flatten() gen1[L, GEN_STATUS] = 0 t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700], ]), zeros((3, 4))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) offers['P']['qty'] = array([[25], [26], [0], [27], [0]], float) offers['P']['prc'] = array([[10], [50], [0], [100], [0]], float) gen, gencost = off2case(gen0, gencost0, offers) t_is( gen, gen1, 8, [t, ' (all rows in offer) - gen'] ) t_is( gencost, gencost1, 8, [t, ' (all rows in offer) - gencost'] ) t = 'P offers only (GEN_STATUS=0 for 0 qty offer)'; offers['P']['qty'] = array([ [0], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G[1:3], PMAX] = offers['P']['qty'].flatten()[1:3] gen1[G[0], GEN_STATUS] = 0 gen1[L, GEN_STATUS] = 0 t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G[1:3], range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700] ]), zeros((2, 4))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers, lim[\'P\'][\'max_offer\']'; offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) lim = {'P': {'max_offer': 75}} gen, gencost = off2case(gen0, gencost0, offers, lim=lim) gen1 = gen0.copy() gen1[G[:2], PMAX] = offers['P']['qty'].flatten()[:2, :] gen1[r_[G[2], L], GEN_STATUS] = 0 t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G[:2], range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300] ]), zeros((2, 4))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids'; bids = {'P': {'qty': array([ [20], [28]], float), 'prc': array([[100], [10]], float)}} gen, gencost = off2case(gen0, gencost0, offers, bids) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([ [-20, -10, 0], [-28, 0, 7] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :8].copy() gencost1[ix_(G, range(NCOST, NCOST + 4))] = array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700] ]) gencost1[ix_(L, range(NCOST, NCOST + 4))] = array([ [2, -20, -2000, 0, 0], [2, -28, -280, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids (all rows in bid)'; bids['P']['qty'] = array([[0], [0], [20], [0], [28]], float) bids['P']['prc'] = array([[0], [0], [100], [0], [10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids) t_is( gen, gen1, 8, [t, ' - gen'] ) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids (GEN_STATUS=0 for 0 qty bid)'; bids['P']['qty'] = array([ [0], [28]], float) bids['P']['prc'] = array([[100], [10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[L[0], GEN_STATUS] = 0 gen1[L[1], [PMIN, QMIN, QMAX]] = array([-28, 0, 7]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700] ]), zeros((3, 4))] gencost1[L[1], NCOST:NCOST + 8] = c_[array([ [2, -28, -280, 0, 0] ]), zeros((1, 4))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids (1 gen with both)'; gen2 = gen0.copy() gen2[1, PMIN] = -5 bids['P']['qty'] = array([[0], [3], [20], [0], [28]], float) bids['P']['prc'] = array([[0], [50], [100], [0], [10]], float) gen, gencost = off2case(gen2, gencost0, offers, bids) gen1 = gen2.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[1, PMIN] = -sum( bids['P']['qty'][1, :] ) gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([ [-20, -10, 0], [-28, 0, 7] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :10].copy() gencost1[ix_(G, range(NCOST, NCOST + 7))] = array([ [2, 0, 0, 25, 250, 0, 0], [3, -3, -150, 0, 0, 26, 1300], [2, 0, 0, 27, 2700, 0, 0] ]) gencost1[ix_(L, range(NCOST, NCOST + 7))] = c_[array([ [2, -20, -2000, 0, 0], [2, -28, -280, 0, 0] ]), zeros((2, 2))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids, lim[\'P\'][\'max_offer\']/[\'min_bid\']' bids['P']['qty'] = array([[20], [28]], float) bids['P']['prc'] = array([[100], [10]], float) lim['P']['min_bid'] = 50.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[G[:2], PMAX] = offers['P']['qty'][:2, :] gen1[r_[G[2], L[1]], GEN_STATUS] = 0 gen1[L[0], [PMIN, QMIN, QMAX]] = array([-20, -10, 0]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G[:2], range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300] ]), zeros((2, 4))] gencost1[L[0], NCOST:NCOST + 9] = array([2, -20, -2000, 0, 0, 0, 0, 0, 0]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'P offers & P bids, lim[\'P\'][\'max_offer\']/[\'min_bid\'], multi-block' offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[ 20, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[G, PMAX] = array([10, 50, 25]) gen1[ix_(L, [PMIN, QMIN, QMAX])] = array([ [-30, -15, 0], [-12, 0, 3] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :10].copy() gencost1[ix_(G, range(NCOST, NCOST + 7))] = array([ [2, 0, 0, 10, 100, 0, 0], [3, 0, 0, 20, 500, 50, 2450], [2, 0, 0, 25, 1250, 0, 0] ]) gencost1[ix_(L, range(NCOST, NCOST + 7))] = array([ [3, -30, -2600, -20, -2000, 0, 0], [2, -12, -840, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) ##----- reactive ----- ## generator cost data # 1 startup shutdown n x1 y1 ... xn yn # 2 startup shutdown n c(n-1) ... c0 gencost0 = array([ [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 100, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 0, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, 0, 0, 12, 240, 36, 1200, 60, 2400], [1, 0, 50, 4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [1, 0, 0, 4, -15, -150, 0, 0, 30, 150, 60, 450], [1, 100, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 3, -20, -15, -10, -10, 0, 0, 0, 0], [1, 0, 0, 3, 0, 0, 40, 80, 60, 180, 0, 0], [1, 0, 50, 2, 0, 0, 0, 0, 0, 0, 0, 0] ], float) t = 'PQ offers only'; offers['P']['qty'] = array([[25], [26], [27]], float) offers['P']['prc'] = array([[10], [50], [100]], float) offers['Q']['qty'] = array([[10], [20], [30]], float) offers['Q']['prc'] = array([[10], [5], [1]], float) gen, gencost = off2case(gen0, gencost0, offers) gen1 = gen0.copy() gen1[G, PMAX] = offers['P']['qty'] gen1[G, QMAX] = offers['Q']['qty'] gen1[G, QMIN] = 0 gen1[L, GEN_STATUS] = 0 t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0.copy() gencost1[ix_(G, range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 25, 250], [2, 0, 0, 26, 1300], [2, 0, 0, 27, 2700] ]), zeros((3, 4))] gencost1[ix_(G + nGL - 1, range(NCOST, NCOST + 9))] = c_[array([ [2, 0, 0, 10, 100], [2, 0, 0, 20, 100], [2, 0, 0, 30, 30] ]), zeros((3, 4))] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, lim.P/Q.max_offer/min_bid, multi-block'; offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[ 20, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) offers['Q']['qty'] = array([[ 5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [ 5, 60], [ 1, 10]], float) bids['Q']['qty'] = array([ 15, 10, 15, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([ [1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [1, -10, 0, -5, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array([ [2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [3, -30, -2600, -20, -2000, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -15, -75, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, for gen, no P, no shutdown'; gen2 = gen0.copy() gen2[0, PMIN] = 0 offers['P']['qty'] = array([[0, 40], [20, 30], [25, 25]], float) gen, gencost = off2case(gen2, gencost0, offers, bids, lim) gen1[0, [PMIN, PMAX, QMIN, QMAX]] = array([0, 0, -15, 10]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1[0, NCOST:NCOST + 9] = gencost0[0, NCOST:NCOST + 9] t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, for gen, no Q, no shutdown'; offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['Q']['qty'] = array([[ 5, 5], [ 0, 10], [15, 15]], float) bids['Q']['qty'] = array([15, 0, 15, 15, 0], float) gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1[0, [PMIN, PMAX, QMIN, QMAX]] = array([10, 10, -15, 10]) ## restore original gen1[1, [PMIN, PMAX, QMIN, QMAX]] = array([12, 50, 0, 0]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1[ix_([0, 1, 6], range(NCOST, NCOST + 9))] = array([ [2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, lim.P/Q.max_offer/min_bid, multi-block'; offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[10, 0], [12, 18]], float) bids['P']['prc'] = array([[100, 60], [70, 10]], float) offers['Q']['qty'] = array([[5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [5, 60], [1, 10]], float) bids['Q']['qty'] = array([15, 10, 10, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([ [1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [1, -10, 0, -5, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST:NCOST + 9] = array([ [2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, -10, -1000, 0, 0, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -10, -50, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, zero Q load w/P bid, shutdown bugfix'; gen1 = gen0.copy() gen1[4, [QG, QMIN, QMAX]] = 0 gen, gencost = off2case(gen1, gencost0, offers, bids, lim) gen1[:, [PMIN, PMAX, QMIN, QMAX]] = array([ [ 10, 10, -15, 10], [ 12, 50, -10, 10], [-10, 0, -5, 0], [ 12, 25, 0, 30], [-12, 0, 0, 0] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array([ [2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [2, -10, -1000, 0, 0, 0, 0, 0, 0], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [2, -12, -840, 0, 0, 0, 0, 0, 0], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [2, -10, -50, 0, 0, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t = 'PQ offers & PQ bids, non-zero Q load w/no P bid, shutdown bugfix'; offers['P']['qty'] = array([[10, 40], [20, 30], [25, 25]], float) offers['P']['prc'] = array([[10, 100], [25, 65], [50, 90]], float) bids['P']['qty'] = array([[0, 10], [12, 18]], float) bids['P']['prc'] = array([[100, 40], [70, 10]], float) offers['Q']['qty'] = array([[ 5, 5], [10, 10], [15, 15]], float) offers['Q']['prc'] = array([[10, 20], [ 5, 60], [ 1, 10]], float) bids['Q']['qty'] = array([ 15, 10, 15, 15, 0], float) bids['Q']['prc'] = array([-10, 0, 5, -20, 10], float) lim['Q']['max_offer'] = 50.0 lim['Q']['min_bid'] = -15.0 gen, gencost = off2case(gen0, gencost0, offers, bids, lim) gen1 = gen0.copy() gen1[:, [GEN_STATUS, PMIN, PMAX, QMIN, QMAX]] = array([ [1, 10, 10, -15, 10], [1, 12, 50, -10, 10], [0, -30, 0, -15, 0], [1, 12, 25, 0, 30], [0, -30, 0, 0, 7.5] ]) t_is( gen, gen1, 8, [t, ' - gen'] ) gencost1 = gencost0[:, :12].copy() gencost1[:, NCOST - 1:NCOST + 9] = array([ [2, 0, 0, 10, 100, 0, 0, 0, 0], [3, 0, 0, 20, 500, 50, 2450, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [2, 0, 0, 25, 1250, 0, 0, 0, 0], [4, -30, 0, -20, 1000, -10, 2000, 0, 3000], [4, -15, 150, 0, 0, 5, 50, 10, 150], [3, -10, 0, 0, 0, 10, 50, 0, 0], [3, -20, -15, -10, -10, 0, 0, 0, 0], [3, 0, 0, 15, 15, 30, 165, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0] ]) t_is( gencost, gencost1, 8, [t, ' - gencost'] ) t_end()
def t_opf_dc_gurobi(quiet=False): """Tests for DC optimal power flow using Gurobi solver. """ algs = [0, 1, 2, 3, 4] num_tests = 23 * len(algs) t_begin(num_tests, quiet) tdir = dirname(__file__) casefile = join(tdir, 't_case9_opf') if quiet: verbose = False else: verbose = False ppopt = ppoption('OUT_ALL', 0, 'VERBOSE', verbose) ppopt = ppoption(ppopt, 'OPF_ALG_DC', 700) ## run DC OPF if have_fcn('gurobipy'): for k in range(len(algs)): ppopt = ppoption(ppopt, 'GRB_METHOD', algs[k]) methods = [ 'automatic', 'primal simplex', 'dual simplex', 'barrier', 'concurrent', 'deterministic concurrent', ] t0 = 'DC OPF (Gurobi %s): ' % methods[k] ## set up indices ib_data = r_[arange(BUS_AREA + 1), arange(BASE_KV, VMIN + 1)] ib_voltage = arange(VM, VA + 1) ib_lam = arange(LAM_P, LAM_Q + 1) ib_mu = arange(MU_VMAX, MU_VMIN + 1) ig_data = r_[[GEN_BUS, QMAX, QMIN], arange(MBASE, APF + 1)] ig_disp = array([PG, QG, VG]) ig_mu = arange(MU_PMAX, MU_QMIN + 1) ibr_data = arange(ANGMAX + 1) ibr_flow = arange(PF, QT + 1) ibr_mu = array([MU_SF, MU_ST]) #ibr_angmu = array([MU_ANGMIN, MU_ANGMAX]) ## get solved DC power flow case from MAT-file ## defines bus_soln, gen_soln, branch_soln, f_soln soln9_dcopf = loadmat(join(tdir, 'soln9_dcopf.mat'), struct_as_record=True) bus_soln, gen_soln, branch_soln, f_soln = \ soln9_dcopf['bus_soln'], soln9_dcopf['gen_soln'], \ soln9_dcopf['branch_soln'], soln9_dcopf['f_soln'] ## run OPF t = t0 r = rundcopf(casefile, ppopt) bus, gen, branch, f, success = \ r['bus'], r['gen'], r['branch'], r['f'], r['success'] t_ok(success, [t, 'success']) t_is(f, f_soln, 3, [t, 'f']) t_is(bus[:, ib_data], bus_soln[:, ib_data], 10, [t, 'bus data']) t_is(bus[:, ib_voltage], bus_soln[:, ib_voltage], 3, [t, 'bus voltage']) t_is(bus[:, ib_lam], bus_soln[:, ib_lam], 3, [t, 'bus lambda']) t_is(bus[:, ib_mu], bus_soln[:, ib_mu], 2, [t, 'bus mu']) t_is(gen[:, ig_data], gen_soln[:, ig_data], 10, [t, 'gen data']) t_is(gen[:, ig_disp], gen_soln[:, ig_disp], 3, [t, 'gen dispatch']) t_is(gen[:, ig_mu], gen_soln[:, ig_mu], 3, [t, 'gen mu']) t_is(branch[:, ibr_data], branch_soln[:, ibr_data], 10, [t, 'branch data']) t_is(branch[:, ibr_flow], branch_soln[:, ibr_flow], 3, [t, 'branch flow']) t_is(branch[:, ibr_mu], branch_soln[:, ibr_mu], 2, [t, 'branch mu']) ##----- run OPF with extra linear user constraints & costs ----- ## two new z variables ## 0 <= z1, P2 - P1 <= z1 ## 0 <= z2, P2 - P3 <= z2 ## with A and N sized for DC opf ppc = loadcase(casefile) row = [0, 0, 0, 1, 1, 1] col = [9, 10, 12, 10, 11, 13] ppc['A'] = sparse(([-1, 1, -1, 1, -1, -1], (row, col)), (2, 14)) ppc['u'] = array([0, 0]) ppc['l'] = array([-Inf, -Inf]) ppc['zl'] = array([0, 0]) ppc['N'] = sparse(([1, 1], ([0, 1], [12, 13])), (2, 14)) ## new z variables only ppc['fparm'] = ones((2, 1)) * array([[1, 0, 0, 1]]) ## w = r = z ppc['H'] = sparse((2, 2)) ## no quadratic term ppc['Cw'] = array([1000, 1]) t = ''.join([t0, 'w/extra constraints & costs 1 : ']) r = rundcopf(ppc, ppopt) t_ok(r['success'], [t, 'success']) t_is(r['gen'][0, PG], 116.15974, 4, [t, 'Pg1 = 116.15974']) t_is(r['gen'][1, PG], 116.15974, 4, [t, 'Pg2 = 116.15974']) t_is(r['var']['val']['z'], [0, 0.3348], 4, [t, 'user vars']) t_is(r['cost']['usr'], 0.3348, 3, [t, 'user costs']) ## with A and N sized for AC opf ppc = loadcase(casefile) row = [0, 0, 0, 1, 1, 1] col = [18, 19, 24, 19, 20, 25] ppc['A'] = sparse(([-1, 1, -1, 1, -1, -1], (row, col)), (2, 26)) ppc['u'] = array([0, 0]) ppc['l'] = array([-Inf, -Inf]) ppc['zl'] = array([0, 0]) ppc['N'] = sparse(([1, 1], ([0, 1], [24, 25])), (2, 26)) ## new z variables only ppc['fparm'] = ones((2, 1)) * array([[1, 0, 0, 1]]) ## w = r = z ppc['H'] = sparse((2, 2)) ## no quadratic term ppc['Cw'] = array([1000, 1]) t = ''.join([t0, 'w/extra constraints & costs 2 : ']) r = rundcopf(ppc, ppopt) t_ok(r['success'], [t, 'success']) t_is(r['gen'][0, PG], 116.15974, 4, [t, 'Pg1 = 116.15974']) t_is(r['gen'][1, PG], 116.15974, 4, [t, 'Pg2 = 116.15974']) t_is(r['var']['val']['z'], [0, 0.3348], 4, [t, 'user vars']) t_is(r['cost']['usr'], 0.3348, 3, [t, 'user costs']) t = ''.join([t0, 'infeasible : ']) ## with A and N sized for DC opf ppc = loadcase(casefile) ppc['A'] = sparse(([1, 1], ([0, 0], [9, 10])), (1, 14)) ## Pg1 + Pg2 ppc['u'] = array([Inf]) ppc['l'] = array([600]) r = rundcopf(ppc, ppopt) t_ok(not r['success'], [t, 'no success']) else: t_skip(num_tests, 'Gurobi not available') t_end()
def t_runmarket(quiet=False): """Tests for code in C{runmkt}, C{smartmkt} and C{auction}. @author: Ray Zimmerman (PSERC Cornell) """ n_tests = 20 t_begin(n_tests, quiet) try: from pypower.extras.smartmarket import runmarket except ImportError: t_skip(n_tests, 'smartmarket code not available') t_end; return ppc = loadcase('t_auction_case') ppopt = ppoption(OPF_ALG=560, OUT_ALL_LIM=1, OUT_BRANCH=0, OUT_SYS_SUM=0) ppopt = ppoption(ppopt, OUT_ALL=0, VERBOSE=1) #ppopt = ppoption(ppopt, OUT_GEN=1, OUT_BRANCH=0, OUT_SYS_SUM=0) offers = {'P': {}, 'Q': {}} bids = {'P': {}, 'Q': {}} offers['P']['qty'] = array([ [12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24], [12, 24, 24] ]) offers['P']['prc'] = array([ [20, 50, 60], [20, 40, 70], [20, 42, 80], [20, 44, 90], [20, 46, 75], [20, 48, 60] ]) bids['P']['qty'] = array([ [10, 10, 10], [10, 10, 10], [10, 10, 10] ]) bids['P']['prc'] = array([ [100, 70, 60], # [100, 64.3, 20], # [100, 30.64545, 0], [100, 50, 20], [100, 60, 50] ]) offers['Q']['qty'] = [ 60, 60, 60, 60, 60, 60, 0, 0, 0 ] offers['Q']['prc'] = [ 0, 0, 0, 0, 0, 3, 0, 0, 0 ] bids.Q['qty'] = [ 15, 15, 15, 15, 15, 15, 15, 12, 7.5 ] # bids.Q['prc'] = [ 0, 0, 0, 0, 0, 0, 0, 83.9056, 0 ] bids.Q['prc'] = [ 0, 0, 0, 0, 0, 0, 0, 20, 0 ] t = 'marginal Q offer, marginal PQ bid, auction_type = 5' mkt = {'auction_type': 5, 't': [], 'u0': [], 'lim': []} r, co, cb, _, _, _, _ = runmarket(ppc, offers, bids, mkt, ppopt) co5 = co.copy() cb5 = cb.copy() # [ co['P']['qty'] co['P']['prc'] ] # [ cb['P']['qty'] cb['P']['prc'] ] # [ co['Q']['qty'] co['Q']['prc'] ] # [ cb['Q']['qty'] cb['Q']['prc'] ] i2e = r['bus'][:, BUS_I] e2i = sparse((max(i2e), 1)) e2i[i2e] = range(r['bus'].size) G = find( isload(r['gen']) == 0 ) ## real generators L = find( isload(r['gen']) ) ## dispatchable loads Gbus = e2i[r['gen'][G, GEN_BUS]] Lbus = e2i[r['gen'][L, GEN_BUS]] t_is( co['P']['qty'], ones((6, 1)) * [12, 24, 0], 2, [t, ' : gen P quantities'] ) t_is( co['P']['prc'][0, :], 50.1578, 3, [t, ' : gen 1 P prices'] ) t_is( cb['P']['qty'], [[10, 10, 10], [10, 0.196, 0], [10, 10, 0]], 2, [t, ' : load P quantities'] ) t_is( cb['P']['prc'][1, :], 56.9853, 4, [t, ' : load 2 P price'] ) t_is( co['P']['prc'][:, 0], r['bus'][Gbus, LAM_P], 8, [t, ' : gen P prices'] ) t_is( cb['P']['prc'][:, 0], r['bus'][Lbus, LAM_P], 8, [t, ' : load P prices'] ) t_is( co['Q']['qty'], [4.2722, 11.3723, 14.1472, 22.8939, 36.7886, 12.3375, 0, 0, 0], 2, [t, ' : Q offer quantities'] ) t_is( co['Q']['prc'], [0, 0, 0, 0, 0, 3, 0.4861, 2.5367, 1.3763], 4, [t, ' : Q offer prices'] ) t_is( cb['Q']['qty'], [0, 0, 0, 0, 0, 0, 15, 4.0785, 5], 2, [t, ' : Q bid quantities'] ) t_is( cb['Q']['prc'], [0, 0, 0, 0, 0, 3, 0.4861, 2.5367, 1.3763], 4, [t, ' : Q bid prices'] ) t_is( co['Q']['prc'], r['bus'][[Gbus, Lbus], LAM_Q], 8, [t, ' : Q offer prices'] ) t_is( cb['Q']['prc'], co['Q']['prc'], 8, [t, ' : Q bid prices'] ) t = 'marginal Q offer, marginal PQ bid, auction_type = 0' mkt['auction_type'] = 0 r, co, cb, _, _, _, _ = runmarket(ppc, offers, bids, mkt, ppopt) t_is( co['P']['qty'], co5['P']['qty'], 8, [t, ' : gen P quantities'] ) t_is( cb['P']['qty'], cb5['P']['qty'], 8, [t, ' : load P quantities'] ) t_is( co['P']['prc'], offers['P']['prc'], 8, [t, ' : gen P prices'] ) t_is( cb['P']['prc'], bids['P']['prc'], 8, [t, ' : load P prices'] ) t_is( co['Q']['qty'], co5['Q']['qty'], 8, [t, ' : gen Q quantities'] ) t_is( cb['Q']['qty'], cb5['Q']['qty'], 8, [t, ' : load Q quantities'] ) t_is( co['Q']['prc'], offers['Q']['prc'], 8, [t, ' : gen Q prices'] ) t_is( cb['Q']['prc'], bids['Q']['prc'], 8, [t, ' : load Q prices'] ) t_end
def t_opf_dc_gurobi(quiet=False): """Tests for DC optimal power flow using Gurobi solver. """ algs = [0, 1, 2, 3, 4] num_tests = 23 * len(algs) t_begin(num_tests, quiet) tdir = dirname(__file__) casefile = join(tdir, 't_case9_opf') if quiet: verbose = False else: verbose = False ppopt = ppoption('OUT_ALL', 0, 'VERBOSE', verbose); ppopt = ppoption(ppopt, 'OPF_ALG_DC', 700); ## run DC OPF if have_fcn('gurobipy'): for k in range(len(algs)): ppopt = ppoption(ppopt, 'GRB_METHOD', algs[k]) methods = [ 'automatic', 'primal simplex', 'dual simplex', 'barrier', 'concurrent', 'deterministic concurrent', ] t0 = 'DC OPF (Gurobi %s): ' % methods[k] ## set up indices ib_data = r_[arange(BUS_AREA + 1), arange(BASE_KV, VMIN + 1)] ib_voltage = arange(VM, VA + 1) ib_lam = arange(LAM_P, LAM_Q + 1) ib_mu = arange(MU_VMAX, MU_VMIN + 1) ig_data = r_[[GEN_BUS, QMAX, QMIN], arange(MBASE, APF + 1)] ig_disp = array([PG, QG, VG]) ig_mu = arange(MU_PMAX, MU_QMIN + 1) ibr_data = arange(ANGMAX + 1) ibr_flow = arange(PF, QT + 1) ibr_mu = array([MU_SF, MU_ST]) #ibr_angmu = array([MU_ANGMIN, MU_ANGMAX]) ## get solved DC power flow case from MAT-file ## defines bus_soln, gen_soln, branch_soln, f_soln soln9_dcopf = loadmat(join(tdir, 'soln9_dcopf.mat'), struct_as_record=True) bus_soln, gen_soln, branch_soln, f_soln = \ soln9_dcopf['bus_soln'], soln9_dcopf['gen_soln'], \ soln9_dcopf['branch_soln'], soln9_dcopf['f_soln'] ## run OPF t = t0 r = rundcopf(casefile, ppopt) bus, gen, branch, f, success = \ r['bus'], r['gen'], r['branch'], r['f'], r['success'] t_ok(success, [t, 'success']) t_is(f, f_soln, 3, [t, 'f']) t_is( bus[:, ib_data ], bus_soln[:, ib_data ], 10, [t, 'bus data']) t_is( bus[:, ib_voltage], bus_soln[:, ib_voltage], 3, [t, 'bus voltage']) t_is( bus[:, ib_lam ], bus_soln[:, ib_lam ], 3, [t, 'bus lambda']) t_is( bus[:, ib_mu ], bus_soln[:, ib_mu ], 2, [t, 'bus mu']) t_is( gen[:, ig_data ], gen_soln[:, ig_data ], 10, [t, 'gen data']) t_is( gen[:, ig_disp ], gen_soln[:, ig_disp ], 3, [t, 'gen dispatch']) t_is( gen[:, ig_mu ], gen_soln[:, ig_mu ], 3, [t, 'gen mu']) t_is(branch[:, ibr_data ], branch_soln[:, ibr_data ], 10, [t, 'branch data']) t_is(branch[:, ibr_flow ], branch_soln[:, ibr_flow ], 3, [t, 'branch flow']) t_is(branch[:, ibr_mu ], branch_soln[:, ibr_mu ], 2, [t, 'branch mu']) ##----- run OPF with extra linear user constraints & costs ----- ## two new z variables ## 0 <= z1, P2 - P1 <= z1 ## 0 <= z2, P2 - P3 <= z2 ## with A and N sized for DC opf ppc = loadcase(casefile) row = [0, 0, 0, 1, 1, 1] col = [9, 10, 12, 10, 11, 13] ppc['A'] = sparse(([-1, 1, -1, 1, -1, -1], (row, col)), (2, 14)) ppc['u'] = array([0, 0]) ppc['l'] = array([-Inf, -Inf]) ppc['zl'] = array([0, 0]) ppc['N'] = sparse(([1, 1], ([0, 1], [12, 13])), (2, 14)) ## new z variables only ppc['fparm'] = ones((2, 1)) * array([[1, 0, 0, 1]]) ## w = r = z ppc['H'] = sparse((2, 2)) ## no quadratic term ppc['Cw'] = array([1000, 1]) t = ''.join([t0, 'w/extra constraints & costs 1 : ']) r = rundcopf(ppc, ppopt) t_ok(r['success'], [t, 'success']) t_is(r['gen'][0, PG], 116.15974, 4, [t, 'Pg1 = 116.15974']) t_is(r['gen'][1, PG], 116.15974, 4, [t, 'Pg2 = 116.15974']) t_is(r['var']['val']['z'], [0, 0.3348], 4, [t, 'user vars']) t_is(r['cost']['usr'], 0.3348, 3, [t, 'user costs']) ## with A and N sized for AC opf ppc = loadcase(casefile) row = [0, 0, 0, 1, 1, 1] col = [18, 19, 24, 19, 20, 25] ppc['A'] = sparse(([-1, 1, -1, 1, -1, -1], (row, col)), (2, 26)) ppc['u'] = array([0, 0]) ppc['l'] = array([-Inf, -Inf]) ppc['zl'] = array([0, 0]) ppc['N'] = sparse(([1, 1], ([0, 1], [24, 25])), (2, 26)) ## new z variables only ppc['fparm'] = ones((2, 1)) * array([[1, 0, 0, 1]]) ## w = r = z ppc['H'] = sparse((2, 2)) ## no quadratic term ppc['Cw'] = array([1000, 1]) t = ''.join([t0, 'w/extra constraints & costs 2 : ']) r = rundcopf(ppc, ppopt) t_ok(r['success'], [t, 'success']) t_is(r['gen'][0, PG], 116.15974, 4, [t, 'Pg1 = 116.15974']) t_is(r['gen'][1, PG], 116.15974, 4, [t, 'Pg2 = 116.15974']) t_is(r['var']['val']['z'], [0, 0.3348], 4, [t, 'user vars']) t_is(r['cost']['usr'], 0.3348, 3, [t, 'user costs']) t = ''.join([t0, 'infeasible : ']) ## with A and N sized for DC opf ppc = loadcase(casefile) ppc['A'] = sparse(([1, 1], ([0, 0], [9, 10])), (1, 14)) ## Pg1 + Pg2 ppc['u'] = array([Inf]) ppc['l'] = array([600]) r = rundcopf(ppc, ppopt) t_ok(not r['success'], [t, 'no success']) else: t_skip(num_tests, 'Gurobi not available') t_end()
def t_qps_pypower(quiet=False): """Tests of C{qps_pypower} QP solvers. @author: Ray Zimmerman (PSERC Cornell) @author: Richard Lincoln """ algs = [200, 250, 400, 500, 600, 700] names = ['PIPS', 'sc-PIPS', 'IPOPT', 'CPLEX', 'MOSEK', 'Gurobi'] check = [None, None, 'ipopt', 'cplex', 'mosek', 'gurobipy'] n = 36 t_begin(n * len(algs), quiet) for k in range(len(algs)): if check[k] is not None and not have_fcn(check[k]): t_skip(n, '%s not installed' % names[k]) else: opt = {'verbose': 0, 'alg': algs[k]} if names[k] == 'PIPS' or names[k] == 'sc-PIPS': opt['pips_opt'] = {} opt['pips_opt']['comptol'] = 1e-8 if names[k] == 'CPLEX': # alg = 0 ## default uses barrier method with NaN bug in lower lim multipliers alg = 2 ## use dual simplex ppopt = ppoption(CPLEX_LPMETHOD=alg, CPLEX_QPMETHOD=min([4, alg])) opt['cplex_opt'] = cplex_options([], ppopt) if names[k] == 'MOSEK': # alg = 5 ## use dual simplex ppopt = ppoption() # ppopt = ppoption(ppopt, MOSEK_LP_ALG = alg) ppopt = ppoption(ppopt, MOSEK_GAP_TOL=1e-9) opt['mosek_opt'] = mosek_options([], ppopt) t = '%s - 3-d LP : ' % names[k] ## example from 'doc linprog' c = array([-5, -4, -6], float) A = sparse([[1, -1, 1], [3, 2, 4], [3, 2, 0]], dtype=float) l = None u = array([20, 42, 30], float) xmin = array([0, 0, 0], float) x0 = None x, f, s, _, lam = qps_pypower(None, c, A, l, u, xmin, None, None, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, [0, 15, 3], 6, [t, 'x']) t_is(f, -78, 6, [t, 'f']) t_is(lam['mu_l'], [0, 0, 0], 13, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 1.5, 0.5], 9, [t, 'lam.mu_u']) t_is(lam['lower'], [1, 0, 0], 9, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - unconstrained 3-d quadratic : ' % names[k] ## from http://www.akiti.ca/QuadProgEx0Constr.html H = sparse([[5, -2, -1], [-2, 4, 3], [-1, 3, 5]], dtype=float) c = array([2, -35, -47], float) x0 = array([0, 0, 0], float) x, f, s, _, lam = qps_pypower(H, c, opt=opt) t_is(s, 1, 12, [t, 'success']) t_is(x, [3, 5, 7], 8, [t, 'x']) t_is(f, -249, 13, [t, 'f']) t_ok(len(lam['mu_l']) == 0, [t, 'lam.mu_l']) t_ok(len(lam['mu_u']) == 0, [t, 'lam.mu_u']) t_is(lam['lower'], zeros(shape(x)), 13, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - constrained 2-d QP : ' % names[k] ## example from 'doc quadprog' H = sparse([[1, -1], [-1, 2]], dtype=float) c = array([-2, -6], float) A = sparse([[1, 1], [-1, 2], [2, 1]], dtype=float) l = None u = array([2, 2, 3], float) xmin = array([0, 0]) x0 = None x, f, s, _, lam = qps_pypower(H, c, A, l, u, xmin, None, x0, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, array([2., 4.]) / 3, 7, [t, 'x']) t_is(f, -74. / 9, 6, [t, 'f']) t_is(lam['mu_l'], [0., 0., 0.], 13, [t, 'lam.mu_l']) t_is(lam['mu_u'], array([28., 4., 0.]) / 9, 7, [t, 'lam.mu_u']) t_is(lam['lower'], zeros(shape(x)), 8, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - constrained 4-d QP : ' % names[k] ## from http://www.jmu.edu/docs/sasdoc/sashtml/iml/chap8/sect12.htm H = sparse([[1003.1, 4.3, 6.3, 5.9], [4.3, 2.2, 2.1, 3.9], [6.3, 2.1, 3.5, 4.8], [5.9, 3.9, 4.8, 10.0]]) c = zeros(4) A = sparse([[1, 1, 1, 1], [0.17, 0.11, 0.10, 0.18]]) l = array([1, 0.10]) u = array([1, Inf]) xmin = zeros(4) x0 = array([1, 0, 0, 1], float) x, f, s, _, lam = qps_pypower(H, c, A, l, u, xmin, None, x0, opt) t_is(s, 1, 12, [t, 'success']) t_is(x, array([0, 2.8, 0.2, 0]) / 3, 5, [t, 'x']) t_is(f, 3.29 / 3, 6, [t, 'f']) t_is(lam['mu_l'], array([6.58, 0]) / 3, 6, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 0], 13, [t, 'lam.mu_u']) t_is(lam['lower'], [2.24, 0, 0, 1.7667], 4, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - (dict) constrained 4-d QP : ' % names[k] p = { 'H': H, 'A': A, 'l': l, 'u': u, 'xmin': xmin, 'x0': x0, 'opt': opt } x, f, s, _, lam = qps_pypower(p) t_is(s, 1, 12, [t, 'success']) t_is(x, array([0, 2.8, 0.2, 0]) / 3, 5, [t, 'x']) t_is(f, 3.29 / 3, 6, [t, 'f']) t_is(lam['mu_l'], array([6.58, 0]) / 3, 6, [t, 'lam.mu_l']) t_is(lam['mu_u'], [0, 0], 13, [t, 'lam.mu_u']) t_is(lam['lower'], [2.24, 0, 0, 1.7667], 4, [t, 'lam.lower']) t_is(lam['upper'], zeros(shape(x)), 13, [t, 'lam.upper']) t = '%s - infeasible LP : ' % names[k] p = { 'A': sparse([1, 1]), 'c': array([1, 1]), 'u': array([-1]), 'xmin': array([0, 0]), 'opt': opt } x, f, s, _, lam = qps_pypower(p) t_ok(s <= 0, [t, 'no success']) t_end()