Skip to content

Commit

Permalink
User-defined goods properties
Browse files Browse the repository at this point in the history
  • Loading branch information
charwick committed Jun 19, 2021
1 parent 1b8b581 commit bc0da53
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
39 changes: 32 additions & 7 deletions helipad/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,10 @@ def __init__(self, breed, id, model):
self.model = model
self.age = 0
self.dead = False
self.stocks = {}
self.stocks = Stocks(breed, model.goods)
self.edges = {}
self.utils = 0
self.position = None #Overridden in spatial init
for good, ginfo in model.goods.items():
endow = ginfo.endowment(self.breed if hasattr(self, 'breed') else None) if callable(ginfo.endowment) else ginfo.endowment
if endow is None: self.stocks[good] = 0
elif isinstance(endow, tuple) or isinstance(endow, list): self.stocks[good] = randint(*endow)
else: self.stocks[good] = endow

self.currentDemand = {g:0 for g in model.goods.keys()}
self.currentShortage = {g:0 for g in model.goods.keys()}
Expand Down Expand Up @@ -340,4 +335,34 @@ def reassign(self, oldagent, newagent):
self.vertices = (self.partner(oldagent), newagent)
oldagent.edges[self.kind].remove(self)
newagent.edges[self.kind].append(self)
newagent.model.doHooks('edgeReassign', [self, oldagent, newagent])
newagent.model.doHooks('edgeReassign', [self, oldagent, newagent])

class Stocks:
def __init__(self, breed, goodslist):
self.goods = {g:{} for g in goodslist}
for good, ginfo in goodslist.items():
for p, fn in ginfo.props.items():
endow = fn(breed) if callable(fn) else fn
if endow is None: self.goods[good][p] = 0
elif isinstance(endow, tuple) or isinstance(endow, list): self.goods[good][p] = randint(*endow)
else: self.goods[good][p] = endow

def __getitem__(self, key):
if type(key) is str: return self.goods[key]['quantity']
elif type(key) is tuple:
if type(key[1]) is str: return self.goods[key[0]][key[1]]
elif key[1]==True: return self.goods[key[0]]
elif key[1]==False: return self.goods[key]['quantity']
raise KeyError

def __setitem__(self, key, val):
if type(key) is str: self.goods[key]['quantity'] = val
elif type(key) is tuple and type(key[1]) is str: self.goods[key[0]][key[1]] = val
else: raise KeyError

def __iter__(self): return iter({k: g['quantity'] for k,g in self.goods.items()})
def __next__(self): return next({k: g['quantity'] for k,g in self.goods.items()})
def __len__(self): return len(self.goods)
def keys(self): return self.goods.keys()
def values(self): return [g['quantity'] for g in self.goods.values()]
def items(self): return [(k, g['quantity']) for k,g in self.goods.items()]
7 changes: 4 additions & 3 deletions helipad/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ def addBreed(self, name, color, prim=None):
else: raise KeyError('Breed must specify which primitive it belongs to')
return self.addItem('breed', name, color, prim=prim)

def addGood(self, name, color, endowment=None, money=False):
def addGood(self, name, color, endowment=None, money=False, props={}):
if money:
if self.moneyGood is not None: print('Money good already specified as',self.moneyGood,'. Overriding…')
self.moneyGood = name
Expand All @@ -280,8 +280,9 @@ def addGood(self, name, color, endowment=None, money=False):
if not 'demand' in self.visual.plots: self.visual.addPlot('demand', 'Demand', selected=False)
if not 'shortages' in self.visual.plots: self.visual.addPlot('shortage', 'Shortages', selected=False)
except: pass

return self.addItem('good', name, color, endowment=endowment, money=money)

props['quantity'] = endowment
return self.addItem('good', name, color, money=money, props=props)

@property
def nonMoneyGoods(self):
Expand Down
2 changes: 2 additions & 0 deletions sample-models/pricediscover.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

heli.addParameter('ratio', 'Log Endowment Ratio', 'slider', dflt=0, opts={'low': -3, 'high': 3, 'step': 0.5}, runtime=False)
heli.params['num_agent'].opts['step'] = 2 #Make sure we don't get stray agents
heli.params['num_agent'].opts['low'] = 2 #Make sure we don't get stray agents


heli.addGood('shmoo','#11CC00', (1, 1000))
heli.addGood('soma', '#CC0000', lambda breed: (1, floor(exp(heli.param('ratio'))*1000)))
Expand Down

0 comments on commit bc0da53

Please sign in to comment.