Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
mahi97 committed Aug 29, 2021
0 parents commit 651bc1d
Show file tree
Hide file tree
Showing 8 changed files with 763 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*/__pycache__/**
Empty file added README.md
Empty file.
Empty file added pz_risk/__init__.py
Empty file.
45 changes: 45 additions & 0 deletions pz_risk/board.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import json
import random

BOARDS = {}


class Board:
def __init__(self, graph: nx.Graph, pos=None):
self.g = graph
self.pos = pos
def reset(self, n_agent, n_unit_per_agent, n_cell_per_agent):
n_cells = self.g.number_of_nodes()
assert n_cell_per_agent * n_agent == n_cells
remaining_cells = [i for i in self.g.nodes()]
for i in range(n_agent):
cells = random.sample(remaining_cells, n_cell_per_agent)
remaining_cells = [c for c in remaining_cells if c not in cells]
nx.set_node_attributes(self.g, {c: 1 for c in cells}, 'units')
nx.set_node_attributes(self.g, {c: i for c in cells}, 'player')
t = n_unit_per_agent - n_cell_per_agent
left_unit = t
for j, cell in enumerate(cells):
if left_unit <= 0:
break
x = left_unit if j + 1 == len(cells) else random.randint(1, min(left_unit, t // 3))
print(x)
left_unit -= x
nx.set_node_attributes(self.g, {cell: x+1}, 'units')


def register_map(name, filepath):
global BOARDS
f = open(filepath)
m = json.load(f)
g = nx.Graph()
g.add_nodes_from([(cell['id'], cell) for cell in m['cells']])
g.add_edges_from([e for e in m['edges']])
assert min([d[1] for d in g.degree()]) > 0
BOARDS[name] = Board(g, m['pos'])


register_map('world', 'maps/world.json')
130 changes: 130 additions & 0 deletions pz_risk/demo.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import random\n",
"\n",
"import risk_env\n",
"\n",
"env = risk_env.env()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"outputs": [],
"source": [
"env.reset()"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 7,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[(1, {'name': 'Alaska', 'group': 'North America', 'id': 1, 'gid': 1}), (2, {'name': 'NW Territory', 'group': 'North America', 'id': 2, 'gid': 1, 'units': 1, 'player': 5}), (3, {'name': 'Green Land', 'group': 'North America', 'id': 3, 'gid': 1, 'units': 1, 'player': 2}), (4, {'name': 'Alberta', 'group': 'North America', 'id': 4, 'gid': 1, 'units': 1, 'player': 5}), (5, {'name': 'Ontario', 'group': 'North America', 'id': 5, 'gid': 1, 'units': 1, 'player': 0}), (6, {'name': 'Quebec', 'group': 'North America', 'id': 6, 'gid': 1, 'units': 1, 'player': 4}), (7, {'name': 'Central America', 'group': 'North America', 'id': 7, 'gid': 1, 'units': 1, 'player': 1}), (8, {'name': 'W USA', 'group': 'North America', 'id': 8, 'gid': 1, 'units': 1, 'player': 3}), (9, {'name': 'E USA', 'group': 'North America', 'id': 9, 'gid': 1, 'units': 1, 'player': 1}), (10, {'name': 'Venezuela', 'group': 'South America', 'id': 10, 'gid': 2, 'units': 1, 'player': 5}), (11, {'name': 'Peru', 'group': 'South America', 'id': 11, 'gid': 2}), (12, {'name': 'Brazil', 'group': 'South America', 'id': 12, 'gid': 2, 'units': 12, 'player': 3}), (13, {'name': 'Argentina', 'group': 'South America', 'id': 13, 'gid': 2, 'units': 1, 'player': 4}), (14, {'name': 'Egypt', 'group': 'Africa', 'id': 14, 'gid': 3, 'units': 1, 'player': 1}), (15, {'name': 'N Africa', 'group': 'Africa', 'id': 15, 'gid': 3, 'units': 1, 'player': 2}), (16, {'name': 'E Africa', 'group': 'Africa', 'id': 16, 'gid': 3, 'units': 3, 'player': 0}), (17, {'name': 'Congo', 'group': 'Africa', 'id': 17, 'gid': 3, 'units': 1, 'player': 2}), (18, {'name': 'S Africa', 'group': 'Africa', 'id': 18, 'gid': 3, 'units': 1, 'player': 4}), (19, {'name': 'Madagascar', 'group': 'Africa', 'id': 19, 'gid': 3, 'units': 1, 'player': 2}), (20, {'name': 'Iceland', 'group': 'Europe', 'id': 20, 'gid': 4, 'units': 1, 'player': 5}), (21, {'name': 'Scandinavia', 'group': 'Europe', 'id': 21, 'gid': 4, 'units': 5, 'player': 5}), (22, {'name': 'N Europe', 'group': 'Europe', 'id': 22, 'gid': 4, 'units': 13, 'player': 2}), (23, {'name': 'W Europe', 'group': 'Europe', 'id': 23, 'gid': 4, 'units': 1, 'player': 1}), (24, {'name': 'S Europe', 'group': 'Europe', 'id': 24, 'gid': 4, 'units': 3, 'player': 3}), (25, {'name': 'Ukraine', 'group': 'Europe', 'id': 25, 'gid': 4, 'units': 1, 'player': 5}), (26, {'name': 'Britain', 'group': 'Europe', 'id': 26, 'gid': 4, 'units': 1, 'player': 3}), (27, {'name': 'Ural', 'group': 'Asia', 'id': 27, 'gid': 5, 'units': 3, 'player': 4}), (28, {'name': 'Middle East', 'group': 'Asia', 'id': 28, 'gid': 5, 'units': 1, 'player': 3}), (29, {'name': 'Afghanistan', 'group': 'Asia', 'id': 29, 'gid': 5, 'units': 1, 'player': 4}), (30, {'name': 'India', 'group': 'Asia', 'id': 30, 'gid': 5, 'units': 10, 'player': 1}), (31, {'name': 'Siam', 'group': 'Asia', 'id': 31, 'gid': 5}), (32, {'name': 'China', 'group': 'Asia', 'id': 32, 'gid': 5, 'units': 1, 'player': 2}), (33, {'name': 'Japan', 'group': 'Asia', 'id': 33, 'gid': 5, 'units': 4, 'player': 4}), (34, {'name': 'Mongolia', 'group': 'Asia', 'id': 34, 'gid': 5, 'units': 2, 'player': 0}), (35, {'name': 'Irkutsk', 'group': 'Asia', 'id': 35, 'gid': 5}), (36, {'name': 'Yakutsk', 'group': 'Asia', 'id': 36, 'gid': 5, 'units': 1, 'player': 5}), (37, {'name': 'Siberia', 'group': 'Asia', 'id': 37, 'gid': 5, 'units': 1, 'player': 3}), (38, {'name': 'Kamchatka', 'group': 'Asia', 'id': 38, 'gid': 5, 'units': 8, 'player': 1}), (39, {'name': 'W Australia', 'group': 'Australia', 'id': 39, 'gid': 6, 'units': 1, 'player': 4}), (40, {'name': 'E Australia', 'group': 'Australia', 'id': 40, 'gid': 6, 'units': 8, 'player': 5}), (41, {'name': 'Indonesia', 'group': 'Australia', 'id': 41, 'gid': 6, 'units': 1, 'player': 2}), (42, {'name': 'New Guinea', 'group': 'Australia', 'id': 42, 'gid': 6, 'units': 10, 'player': 0})]\n"
]
},
{
"ename": "KeyError",
"evalue": "'player'",
"output_type": "error",
"traceback": [
"\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[0;31mKeyError\u001B[0m Traceback (most recent call last)",
"\u001B[0;32m/tmp/ipykernel_14222/1551777326.py\u001B[0m in \u001B[0;36m<module>\u001B[0;34m\u001B[0m\n\u001B[0;32m----> 1\u001B[0;31m \u001B[0menv\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m",
"\u001B[0;32m/app/anaconda3/envs/risk/lib/python3.8/site-packages/pettingzoo/utils/wrappers/order_enforcing.py\u001B[0m in \u001B[0;36mrender\u001B[0;34m(self, mode)\u001B[0m\n\u001B[1;32m 55\u001B[0m \u001B[0;32massert\u001B[0m \u001B[0mmode\u001B[0m \u001B[0;32min\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mmetadata\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m\"render.modes\"\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 56\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_has_rendered\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0;32mTrue\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 57\u001B[0;31m \u001B[0;32mreturn\u001B[0m \u001B[0msuper\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmode\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 58\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 59\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mstep\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maction\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;32m/app/anaconda3/envs/risk/lib/python3.8/site-packages/pettingzoo/utils/wrappers/base.py\u001B[0m in \u001B[0;36mrender\u001B[0;34m(self, mode)\u001B[0m\n\u001B[1;32m 47\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 48\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mmode\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;34m\"human\"\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 49\u001B[0;31m \u001B[0;32mreturn\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0menv\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmode\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 50\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 51\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mreset\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;32m/app/anaconda3/envs/risk/lib/python3.8/site-packages/pettingzoo/utils/wrappers/capture_stdout.py\u001B[0m in \u001B[0;36mrender\u001B[0;34m(self, mode)\u001B[0m\n\u001B[1;32m 10\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mmode\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;34m\"human\"\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 11\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mmode\u001B[0m \u001B[0;34m==\u001B[0m \u001B[0;34m\"human\"\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 12\u001B[0;31m \u001B[0msuper\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 13\u001B[0m \u001B[0;32melif\u001B[0m \u001B[0mmode\u001B[0m \u001B[0;34m==\u001B[0m \u001B[0;34m\"ansi\"\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 14\u001B[0m \u001B[0;32mwith\u001B[0m \u001B[0mcapture_stdout\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m \u001B[0;32mas\u001B[0m \u001B[0mstdout\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;32m/app/anaconda3/envs/risk/lib/python3.8/site-packages/pettingzoo/utils/wrappers/base.py\u001B[0m in \u001B[0;36mrender\u001B[0;34m(self, mode)\u001B[0m\n\u001B[1;32m 47\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 48\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mmode\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;34m\"human\"\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 49\u001B[0;31m \u001B[0;32mreturn\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0menv\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mrender\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmode\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 50\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 51\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mreset\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;32m/app/risk/pz-risk/pz_risk/risk_env.py\u001B[0m in \u001B[0;36mrender\u001B[0;34m(self, mode)\u001B[0m\n\u001B[1;32m 82\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mG\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mnodes\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mdata\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 83\u001B[0m nx.draw_networkx_nodes(G, pos,\n\u001B[0;32m---> 84\u001B[0;31m \u001B[0mnodelist\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0mc\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;36m0\u001B[0m\u001B[0;34m]\u001B[0m \u001B[0;32mfor\u001B[0m \u001B[0mc\u001B[0m \u001B[0;32min\u001B[0m \u001B[0mG\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mnodes\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mdata\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m)\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mc\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'player'\u001B[0m\u001B[0;34m]\u001B[0m \u001B[0;34m==\u001B[0m \u001B[0magent\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m,\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 85\u001B[0m node_color=COLORS[agent], **options)\n\u001B[1;32m 86\u001B[0m \u001B[0;31m# nx.draw_networkx_nodes(G, pos, nodelist=[4, 5, 6, 7], node_color=\"tab:blue\", **options)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;32m/app/risk/pz-risk/pz_risk/risk_env.py\u001B[0m in \u001B[0;36m<listcomp>\u001B[0;34m(.0)\u001B[0m\n\u001B[1;32m 82\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mG\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mnodes\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mdata\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 83\u001B[0m nx.draw_networkx_nodes(G, pos,\n\u001B[0;32m---> 84\u001B[0;31m \u001B[0mnodelist\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0mc\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;36m0\u001B[0m\u001B[0;34m]\u001B[0m \u001B[0;32mfor\u001B[0m \u001B[0mc\u001B[0m \u001B[0;32min\u001B[0m \u001B[0mG\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mnodes\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mdata\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m)\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mc\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'player'\u001B[0m\u001B[0;34m]\u001B[0m \u001B[0;34m==\u001B[0m \u001B[0magent\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m,\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 85\u001B[0m node_color=COLORS[agent], **options)\n\u001B[1;32m 86\u001B[0m \u001B[0;31m# nx.draw_networkx_nodes(G, pos, nodelist=[4, 5, 6, 7], node_color=\"tab:blue\", **options)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n",
"\u001B[0;31mKeyError\u001B[0m: 'player'"
]
}
],
"source": [
"env.render()"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 8,
"outputs": [
{
"data": {
"text/plain": "<pettingzoo.utils.wrappers.order_enforcing.OrderEnforcingWrapper at 0x7f6c7c47cf40>"
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"env."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Loading

0 comments on commit 651bc1d

Please sign in to comment.