#include ../data/case141.txt
#include ../lib/idx_gen.txt
#include ../lib/idx_bus.txt
#include ../lib/idx_brch.txt
#include ../lib/dsbus_dv.txt
#include ../lib/make_sdzip.txt
#include ../lib/make_sbus.txt
#include ../lib/make_y_bus.txt
#include ../lib/make_jac.txt
#include ../lib/newtonpf.txt
#include ../lib/runpf.txt
// ----------------- test make sbus ---------------
info(`Running make_sbus on case141 2000 times...`);
for i in 0..2000 {
    make_sbus(baseMVA, bus, gen);
}
info(`Run make_sbus case141 end`);
// ----------------- test make_y_bus ---------------
info(`Running make_y_bus on case141 2000 times...`);
for i in 0..2000 {
    make_y_bus(baseMVA, bus, branch);
}
info(`Run make_y_bus case141 end`);
// ----------------- test make_jac ---------------
info(`Running make_jac on case141 10000 times...`);
for i in 0..10000 {
    make_jac(baseMVA, bus, branch, gen, 1);
}
info(`Run make_jac case141 end`);
// ----------------- test prepare ---------------
info(`Running prepare on case141 2000 times...`);
for i in 0..2000 {
    nb = size(bus, 0);
    ng = size(gen, 0);
    g_i = slice(gen, [0], [GEN_BUS-1,GEN_BUS]) - 1; // generator bus indices
    Cg = full(sparse(g_i, range(0, ng), slice(gen, [0], [GEN_STATUS-1,GEN_STATUS]) > 0, nb, ng));  // gen connection matrix
                                            // element i, j is 1 if, generator j at bus i is ON
    bus_gen_status = Cg * ones(ng, 1);      // number of generators at each bus that are ON

    // form index lists for slack, PV, and PQ buses
    bus_type = slice(bus, [0], [BUS_TYPE-1,BUS_TYPE]); // bus type column
    ref = find(bus_type == REF && bus_gen_status);   // reference bus index
    pv  = find(bus_type == PV  && bus_gen_status);   // PV bus indices
    pq  = find(bus_type == PQ || ~~bus_gen_status);   // PQ bus indices

    // generator info
    on = find(slice(gen, [0], [GEN_STATUS-1, GEN_STATUS]) > 0);  // which generators are on?
    gbus = get_multi(slice(gen, [0], [GEN_BUS-1, GEN_BUS]), on) - 1; // what buses are they at?

    // initial state
    //V0    = ones(nb, 1);            // flat start
    V0  = slice(bus, [0], [VM-1,VM]) .* exp(c(0,1) * pi/180 * slice(bus, [0], [VA-1,VA]));
    vcb = set(ones(size(V0)), pq, zeros(size(pq)));   // create mask of voltage-controlled buses
    k = find(get_multi(vcb, gbus));            // in-service gens at v-c buses
    gbus_index = get_multi(gbus, k);            // indices of in-service generators at v-c buses
    on_k = get_multi(on, k);
    gen_vg = get_multi(slice(gen, [0], [VG-1,VG]), on_k);
    gbus_k = get_multi(gbus, k);
    voltage_g = get_multi(V0, gbus_k);
    V_init = set(V0, gbus_k, gen_vg ./ abs(voltage_g) .* voltage_g);

    // build admittance matrices
    Ybus = make_y_bus(baseMVA, bus, branch);
}
info(`Run prepare case141 end`);
// ----------------- test runpf ---------------
info(`Running 2000 times power flow case141...`);
for i in 0..2000 {
    r = runpf();
}
info(`Run power flow on case141 end`);