def test_resource_put(resource): res1num = resource.number res2 = f.Resource("usd", 3) resource.put(res2) assert resource.number == res1num + 3 assert res2.number == 0 assert res2.asset_type == resource.asset_type
def test_entity_receive_transfer(trade_entities): me, other = trade_entities res = f.Resource( me.contracts[0].assets[0], me.contracts[0].numbers[0], allow_negative=False, ) other.receive_transfer(resource=res, reference=me.contracts[0].reference, requesting_entity=me) assert (other.resources[me.contracts[0].reference].number == me.contracts[0].numbers[0])
def test_entity_request_transfer_insufficient_funds(trade_entities): me, other = trade_entities res = f.Resource( me.contracts[0].assets[1], me.contracts[0].numbers[1] - 1, allow_negative=False, ) other.resources[me.contracts[0].reference] = res with pytest.raises(f.DeniedError, match="must not become negative"): other.request_transfer( number=me.contracts[0].numbers[1], asset_type=me.contracts[0].assets[1], reference=me.contracts[0].reference, requesting_entity=me, )
def test_entity_request_transfer_number_higher_than_contract(trade_entities): me, other = trade_entities res = f.Resource( me.contracts[0].assets[1], me.contracts[0].numbers[1] + 1, allow_negative=False, ) other.resources[me.contracts[0].reference] = res with pytest.raises(f.DeniedError, match="only"): other.request_transfer( number=me.contracts[0].numbers[1] + 1, asset_type=me.contracts[0].assets[1], reference=me.contracts[0].reference, requesting_entity=me, )
def test_entity_request_transfer(trade_entities): me, other = trade_entities res = f.Resource( me.contracts[0].assets[1], me.contracts[0].numbers[1], allow_negative=False, ) other.resources[me.contracts[0].reference] = res r1 = other.request_transfer( number=me.contracts[0].numbers[1] / 2, asset_type=me.contracts[0].assets[1], reference=me.contracts[0].reference, requesting_entity=me, ) r2 = other.request_transfer( number=me.contracts[0].numbers[1] / 2, asset_type=me.contracts[0].assets[1], reference=me.contracts[0].reference, requesting_entity=me, ) assert other.resources[me.contracts[0].reference].number == 0 assert r1.number == me.contracts[0].numbers[1] / 2 assert r2.number == me.contracts[0].numbers[1] / 2
def perform_increment(self): """Performs one time increment of action(s) for an `Individual`""" logger.debug(f"{self} performing increment...") self.ensure_active() if self.age >= 67: self.income = 0 # Stop working logger.debug(f"{self} retired at age {self.age}") if self.world.np_random.uniform( ) < self.world.year_fraction * utils.cached_cdf( int(self.age / 2) * 2, 85, 10): self.die() logger.debug(f"{self} died at age {self.age}") return # Earn salary self.resources["cash"].put( f.Resource(asset_type="eur", number=self.income)) try: # Spend living expenses (we won't simulate how this money circulates, # can throw away the resulting Resource object) r = self.resources["cash"].take(self.living_expenses) logger.info(f"{self} spending {r}. {self.resources['cash']} left.") except f.DeniedError: po = self.world.find_entities(PublicOpinion)[0] for c in self.find_contracts(type="insurance"): po.accuse(c.entities[1], 100) logger.info(f"{self} starved at age {self.age}") self.die() return if self.resources["cash"].number < self.living_expenses / 2: # Be unhappy and tell the world po = self.world.find_entities(PublicOpinion)[0] for c in self.find_contracts(type="insurance"): po.accuse(c.entities[1], 20) logger.info(self.age) # DEBUG: old_contracts = self.find_contracts(type="insurance") if self.age >= 25 and not old_contracts: # Try to get some pension insurance logger.info("Trying to get insurance...") companies = self.world.find_entities(PensionInsuranceCompany) po = self.world.find_entities(PublicOpinion)[0] best_companies_first = sorted(companies, key=po.reputation, reverse=True) for c in best_companies_first: rep = po.reputation(c) logger.info(f" ...Looking at {c} with reputation {rep}...") if self.world.np_random.uniform() < utils.cached_cdf( int(rep / 100) * 100, 0, 100): try: logger.info(" ...suggesting contract...") contract = PensionContract(me=self, my_role="insured", other=c) # print(f"{self} contracts before: {self.contracts}") c.request_contract(contract) contract.draft = False self.contracts.append(contract) # DEBUG -- REMOVE if len(self.contracts) > 1: raise RuntimeError( f"self.contracts of {self} is greater than 1: {self.contracts}. " f"Somehow had an old contract already: {self.contracts[0]} while I thought it had {old_contracts}" ) # print(f"{self} contracts after: {self.contracts}") logger.info(" ...got accepted.") break except f.DeniedError: logger.info(" ...got denied.") pass else: logger.info(" ...I don't like it.")
def __init__(self, world: PensionSim): super().__init__(world) self.resources["cash"] = f.Resource(asset_type="eur", number=20000) self._creation_time = world.time self.income = 20000 * self.world.year_fraction self.living_expenses = 15000 * self.world.year_fraction
def __init__(self, world: PensionSim): super().__init__(world) self.resources["cash"] = f.Resource(asset_type="eur", number=20000) self.running_cost = 2000
def resource(): return f.Resource("usd", 42, True)
def test_resource_put_wrong_type(resource): res2 = f.Resource("eur", 3) with pytest.raises(f.DeniedError): resource.put(res2)
def test_resource_take_too_much(): res = f.Resource("usd", 2, allow_negative=False) with pytest.raises(f.DeniedError): res.take(3)
def test_resource_unknown_asset_type(): with pytest.raises(ValueError): f.Resource("saoenthaueosnth", 42)
def test_resource(): f.Resource("usd", 42)