Пример #1
0
 def setUp(self):
     self.rules = voting.ElectionRules()
     self.rules_6c = voting.ElectionRules()
     votes_file = "../data/elections/iceland_2013_landskjorstjorn.csv"
     const_file = "../data/constituencies/constituencies_iceland_2013.csv"
     const_file_6c = "../data/constituencies/iceland_2013_6x6.xlsx"
     self.rules["constituencies"] = const_file
     self.rules_6c["constituencies"] = const_file_6c
     parties, votes = util.load_votes(votes_file, self.rules["constituencies"])
     self.rules["parties"] = parties
     self.rules_6c["parties"] = parties
     self.votes = votes
Пример #2
0
def simulate(votes, constituencies, **kwargs):
    """Simulate elections."""
    e_rules = voting.ElectionRules()
    e_rules["constituencies"] = constituencies
    parties, votes = util.load_votes(votes, e_rules["constituencies"])
    e_rules["parties"] = parties
    s_rules = sim.SimulationRules()

    try:
        for arg, val in kwargs.iteritems():
            s_rules[arg] = val
    except AttributeError:
        for arg, val in kwargs.items():
            s_rules[arg] = val

    e_rules = util.sim_election_rules(e_rules, s_rules["test_method"])

    simulation = sim.Simulation(s_rules, [e_rules], votes)

    simulation.simulate()

    if s_rules["show_details"]:
        util.print_simulation(simulation)
    if s_rules["to_xlsx"]:
        util.simulation_to_xlsx(simulation, s_rules["to_xlsx"])
Пример #3
0
def handle_election():
    data = request.get_json(force=True)
    rules = voting.ElectionRules()

    for k, v in data["rules"].items():
        rules[k] = v

    for x in [
            "constituency_names", "constituency_seats", "parties",
            "constituency_adjustment_seats"
    ]:
        if x in data and data[x]:
            rules[x] = data[x]
        else:
            return {"error": "Missing data ('%s')" % x}

    if not "votes" in data:
        return {"error": "Votes missing."}

    for const in data["votes"]:
        for party in const:
            if type(party) != int:
                return {"error": "Votes must be numbers."}

    try:
        election = voting.Election(rules, data["votes"])
        election.run()
    except ZeroDivisionError:
        return {"error": "Need to have more votes."}
    except AssertionError:
        return {"error": "The data is malformed."}

    return election
Пример #4
0
def apportion(votes, **kwargs):
    """Do regular apportionment based on votes and constituency data."""
    rules = voting.ElectionRules()
    kwargs["primary_divider"] = kwargs["divider"]
    kwargs["adj_determine_divider"] = kwargs[
        "adj_determine_divider"] or kwargs["divider"]
    kwargs["adj_alloc_divider"] = kwargs["adj_alloc_divider"] or kwargs[
        "adj_determine_divider"]
    kwargs["adjustment_threshold"] = kwargs["threshold"] * 0.01
    try:
        for arg, val in kwargs.iteritems():
            rules[arg] = val
    except AttributeError:
        for arg, val in kwargs.items():
            rules[arg] = val

    parties, votes = util.load_votes(votes, rules["constituencies"])
    rules["parties"] = parties
    election = voting.Election(rules, votes)
    election.run()

    if rules["show_details"]:
        util.print_steps_election(election)
    else:
        util.pretty_print_election(election)
    if rules["to_xlsx"]:
        util.election_to_xlsx(election, rules["to_xlsx"])
Пример #5
0
def apportion(votes, **kwargs):
    """Do regular apportionment based on votes and constituency data."""
    rules = voting.ElectionRules()
    kwargs["adjustment_divider"] = kwargs["adjustment_divider"] or kwargs[
        "divider"]
    try:
        for arg, val in kwargs.iteritems():
            rules[arg] = val
    except AttributeError:
        for arg, val in kwargs.items():
            rules[arg] = val

    parties, votes = util.load_votes(votes, rules["constituencies"])
    rules["parties"] = parties
    election = voting.Election(rules, votes)
    election.run()

    if rules['output'] == "simple":
        click.secho(
            "Warning: When loading votes, no attempt is currently "
            "made to guarantee that the vote file lists "
            "constituencies in the same order as they are declared in "
            "the constituency file.\n\n",
            fg="red")

    util.pretty_print_election(rules, election)
Пример #6
0
def generate_one_const_ruleset(ruleset):
    ref_rs = voting.ElectionRules()
    ref_rs.update(ruleset)
    ref_rs["constituency_seats"] = [sum(ruleset["constituency_seats"])]
    ref_rs["constituency_adjustment_seats"] = [sum(ruleset["constituency_adjustment_seats"])]
    ref_rs["constituency_names"] = ["All"]
    return ref_rs
Пример #7
0
 def setUp(self):
     self.e_rules = voting.ElectionRules()
     self.e_rules["constituency_names"] = ["I", "II", "III"]
     self.e_rules["constituency_seats"] = [5, 6, 4]
     self.e_rules["constituency_adjustment_seats"] = [1, 2, 1]
     self.e_rules["parties"] = ["A", "B"]
     self.votes = [[500, 300], [200, 400], [350, 450]]
     self.s_rules = simulate.SimulationRules()
     self.s_rules["simulation_count"] = 100
Пример #8
0
 def setUp(self):
     self.rules = voting.ElectionRules()
     votes_file = "../data/elections/iceland_2013_landskjorstjorn.csv"
     const_file = "../data/constituencies/constituencies_iceland_2013.csv"
     self.rules["constituencies"] = const_file
     parties, votes = util.load_votes(votes_file, self.rules["constituencies"])
     self.rules["parties"] = parties
     self.rules["adjustment_method"] =  "alternating-scaling"
     self.votes = votes
Пример #9
0
def generate_law_ruleset(ruleset):
    ref_rs = voting.ElectionRules()
    ref_rs.update(ruleset)
    ref_rs["adjustment_method"] = "icelandic-law"
    ref_rs["primary_divider"] = "dhondt"
    ref_rs["adj_determine_divider"] = "dhondt"
    ref_rs["adj_alloc_divider"] = "dhondt"
    ref_rs["adjustment_threshold"] = 5
    return ref_rs
Пример #10
0
def generate_ind_const_ruleset(ruleset):
    ref_rs = voting.ElectionRules()
    ref_rs.update(ruleset)
    ref_rs["constituency_seats"] = copy(ruleset["constituency_seats"])
    ref_rs["constituency_adjustment_seats"] = []
    for i in range(len(ruleset["constituency_seats"])):
        ref_rs["constituency_seats"][i] += ruleset["constituency_adjustment_seats"][i]
        ref_rs["constituency_adjustment_seats"].append(0)
    return ref_rs
Пример #11
0
def get_capabilities_dict():
    return {
        "election_rules": voting.ElectionRules(),
        "simulation_rules": sim.SimulationRules(),
        "capabilities": {
            "divider_rules": voting.DIVIDER_RULE_NAMES,
            "adjustment_methods": voting.ADJUSTMENT_METHOD_NAMES,
            "generating_methods": sim.GENERATING_METHOD_NAMES
        },
    }
Пример #12
0
def generate_all_adj_ruleset(ruleset):
    ref_rs = voting.ElectionRules()
    ref_rs.update(ruleset)
    n = len(ruleset["constituency_names"])
    ref_rs["constituency_seats"] = [0 for c in range(n)]
    ref_rs["constituency_adjustment_seats"] \
        = [ruleset["constituency_seats"][c] \
           + ruleset["constituency_adjustment_seats"][c]
           for c in range(n)]
    return ref_rs
Пример #13
0
        def fn(self):
            rules = voting.ElectionRules()

            votes_file = "../data/elections/iceland_2013_landskjorstjorn.csv"
            const_file = "../data/constituencies/constituencies_iceland_2013.csv"
            rules["constituencies"] = const_file
            parties, votes = util.load_votes(votes_file, rules["constituencies"])
            rules["parties"] = parties

            rules["adjustment_method"] = method
            election = voting.Election(rules, votes)
            election.run()
Пример #14
0
def set_up_simulation():
    data = request.get_json(force=True)
    rulesets = []

    for rs in data["election_rules"]:
        election_rules = voting.ElectionRules()

        print(data["election_rules"])
        print(rs)
        for k, v in rs.items():
            print("Setting election_rules[%s] = %s" % (k, v))
            election_rules[k] = v

        for x in [
                "constituency_names", "constituency_seats", "parties",
                "constituency_adjustment_seats"
        ]:
            if x in data and data[x]:
                election_rules[x] = data[x]
            else:
                return False, "Missing data ('%s')" % x

        rulesets.append(election_rules)

    if not "ref_votes" in data:
        return False, "Votes missing."

    for const in data["ref_votes"]:
        for party in const:
            if type(party) != int:
                return False, "Votes must be numbers."

    stability_parameter = 100
    if "stbl_param" in data:
        stability_parameter = data["stbl_param"]
        if stability_parameter <= 1:
            return False, "Stability parameter must be greater than 1."

    simulation_rules = sim.SimulationRules()

    for k, v in data["simulation_rules"].items():
        simulation_rules[k] = v

    try:
        simulation = sim.Simulation(simulation_rules, rulesets,
                                    data["ref_votes"], stability_parameter)
    except ZeroDivisionError:
        return False, "Need to have more votes."

    return True, simulation
Пример #15
0
def run_script_simulation(rules):
    srs = SimulationRules()
    srs.update(rules["simulation_rules"])

    rs = voting.ElectionRules()
    rs.update(rules["election_rules"])

    if not "ref_votes" in rules:
        return {"error": "No reference votes supplied."}

    election = voting.Election(rs, rules["ref_votes"])

    sim = Simulation(srs, election, rules["ref_votes"])
    sim.simulate()

    return sim
Пример #16
0
def generate_opt_ruleset(ruleset):
    ref_rs = voting.ElectionRules()
    ref_rs.update(ruleset)
    ref_rs["adjustment_method"] = "alternating-scaling"
    return ref_rs