def __init__( self, cFuncAdj=None, ShareFuncAdj=None, vFuncAdj=None, vPfuncAdj=None, cFuncFxd=None, ShareFuncFxd=None, vFuncFxd=None, dvdmFuncFxd=None, dvdsFuncFxd=None, aGrid=None, Share_adj=None, EndOfPrddvda_adj=None, ShareGrid=None, EndOfPrddvda_fxd=None, AdjPrb=None, ): # Change any missing function inputs to NullFunc if cFuncAdj is None: cFuncAdj = NullFunc() if cFuncFxd is None: cFuncFxd = NullFunc() if ShareFuncAdj is None: ShareFuncAdj = NullFunc() if ShareFuncFxd is None: ShareFuncFxd = NullFunc() if vFuncAdj is None: vFuncAdj = NullFunc() if vFuncFxd is None: vFuncFxd = NullFunc() if vPfuncAdj is None: vPfuncAdj = NullFunc() if dvdmFuncFxd is None: dvdmFuncFxd = NullFunc() if dvdsFuncFxd is None: dvdsFuncFxd = NullFunc() # Set attributes of self self.cFuncAdj = cFuncAdj self.cFuncFxd = cFuncFxd self.ShareFuncAdj = ShareFuncAdj self.ShareFuncFxd = ShareFuncFxd self.vFuncAdj = vFuncAdj self.vFuncFxd = vFuncFxd self.vPfuncAdj = vPfuncAdj self.dvdmFuncFxd = dvdmFuncFxd self.dvdsFuncFxd = dvdsFuncFxd self.aGrid = aGrid self.Share_adj = Share_adj self.EndOfPrddvda_adj = EndOfPrddvda_adj self.ShareGrid = ShareGrid self.EndOfPrddvda_fxd = EndOfPrddvda_fxd self.AdjPrb = AdjPrb
def __init__(self, VfuncJock=None, VfuncPunk=None, switchFuncJock=None, switchFuncPunk=None): ''' Make a new instance of FashionSolution. Parameters ---------- VfuncJock : function Value when entering the period as a jock as a function of the proportion of the population dressed as a punk. VfuncPunk : function Value when entering the period as a punk as a function of the proportion of the population dressed as a punk. switchFuncJock : function Probability of switching styles (to punk) when entering the period as a jock, as a function of the population punk proportion. switchFuncPunk : function Probability of switching styles (to jock) when entering the period as a punkk, as a function of the population punk proportion. Returns ------- new instance of FashionSolution ''' # Fill in missing function inputs with trivial defaults if VfuncJock is None: VfuncJock = NullFunc() if VfuncPunk is None: VfuncPunk = NullFunc() if switchFuncJock is None: switchFuncJock = NullFunc() if switchFuncPunk is None: switchFuncPunk = NullFunc() self.VfuncJock = VfuncJock self.VfuncPunk = VfuncPunk self.switchFuncJock = switchFuncJock self.switchFuncPunk = switchFuncPunk self.distance_criteria = ['VfuncJock', 'VfuncPunk']
def __init__( self, Cpol=None, cFuncs=None, ): """ The constructor for a new GLConsumerSolution object. Parameters ---------- Cpol : Array Consumption Policy from next period. 13 by 200 array Cfuncs : Array 13 by 1 Array whose elements are objects of the 'LinearInterp' Class. The ith element is the linearinterpolation between the Bond Grid and consumption for a certain level of productivity. Returns ------- None """ # Change any missing function inputs to NullFunc self.Cpol = Cpol if Cpol is not None else NullFunc() self.cFuncs = cFuncs if cFuncs is not None else NullFunc()
def __init__( self, cFuncAdj=None, ShareFuncAdj=None, vFuncAdj=None, vPfuncAdj=None, cFuncFxd=None, ShareFuncFxd=None, vFuncFxd=None, dvdmFuncFxd=None, dvdsFuncFxd=None, ): # Change any missing function inputs to NullFunc if cFuncAdj is None: cFuncAdj = NullFunc() if cFuncFxd is None: cFuncFxd = NullFunc() if ShareFuncAdj is None: ShareFuncAdj = NullFunc() if ShareFuncFxd is None: ShareFuncFxd = NullFunc() if vFuncAdj is None: vFuncAdj = NullFunc() if vFuncFxd is None: vFuncFxd = NullFunc() if vPfuncAdj is None: vPfuncAdj = NullFunc() if dvdmFuncFxd is None: dvdmFuncFxd = NullFunc() if dvdsFuncFxd is None: dvdsFuncFxd = NullFunc() # Set attributes of self self.cFuncAdj = cFuncAdj self.cFuncFxd = cFuncFxd self.ShareFuncAdj = ShareFuncAdj self.ShareFuncFxd = ShareFuncFxd self.vFuncAdj = vFuncAdj self.vFuncFxd = vFuncFxd self.vPfuncAdj = vPfuncAdj self.dvdmFuncFxd = dvdmFuncFxd self.dvdsFuncFxd = dvdsFuncFxd
class FashionVictimType(AgentType): ''' A class for representing types of agents in the fashion victim model. Agents make a binary decision over which style to wear (jock or punk), subject to switching costs. They receive utility directly from their chosen style and from the proportion of the population that wears the same style. ''' _solution_terminal = FashionSolution(VfuncJock=LinearInterp(np.array([0.0, 1.0]),np.array([0.0,0.0])), VfuncPunk=LinearInterp(np.array([0.0, 1.0]),np.array([0.0,0.0])), switchFuncJock=NullFunc(), switchFuncPunk=NullFunc()) def __init__(self,**kwds): ''' Instantiate a new FashionVictim with given data. Parameters ---------- **kwds : keyword arguments Any number of keyword arguments key=value; each value will be assigned to the attribute key in the new instance. Returns ------- new instance of FashionVictimType ''' # Initialize a basic AgentType AgentType.__init__(self,solution_terminal=FashionVictimType._solution_terminal,cycles=0,pseudo_terminal=True,**kwds) # Add class-specific features self.time_inv = ['DiscFac','conformUtilityFunc','punk_utility','jock_utility','switchcost_J2P','switchcost_P2J','pGrid','pEvolution','pref_shock_mag'] self.time_vary = [] self.solveOnePeriod = solveFashion self.update() def updateEvolution(self): ''' Updates the "population punk proportion" evolution array. Fasion victims believe that the proportion of punks in the subsequent period is a linear function of the proportion of punks this period, subject to a uniform shock. Given attributes of self pNextIntercept, pNextSlope, pNextCount, pNextWidth, and pGrid, this method generates a new array for the attri- bute pEvolution, representing a discrete approximation of next period states for each current period state in pGrid. Parameters ---------- none Returns ------- none ''' self.pEvolution = np.zeros((self.pCount,self.pNextCount)) for j in range(self.pCount): pNow = self.pGrid[j] pNextMean = self.pNextIntercept + self.pNextSlope*pNow dist = approxUniform(N=self.pNextCount,bot=pNextMean-self.pNextWidth,top=pNextMean+self.pNextWidth)[1] self.pEvolution[j,:] = dist def update(self): ''' Updates the non-primitive objects needed for solution, using primitive attributes. This includes defining a "utility from conformity" function conformUtilityFunc, a grid of population punk proportions, and an array of future punk proportions (for each value in the grid). Results are stored as attributes of self. Parameters ---------- none Returns ------- none ''' self.conformUtilityFunc = lambda x : stats.beta.pdf(x,self.uParamA,self.uParamB) self.pGrid = np.linspace(0.0001,0.9999,self.pCount) self.updateEvolution() def reset(self): ''' Resets this agent type to prepare it for a new simulation run. This includes resetting the random number generator and initializing the style of each agent of this type. ''' self.resetRNG() sNow = np.zeros(self.pop_size) Shk = self.RNG.rand(self.pop_size) sNow[Shk < self.p_init] = 1 self.sNow = sNow def preSolve(self): ''' Updates the punk proportion evolution array by calling self.updateEvolution(). Parameters ---------- none Returns ------- none ''' # This step is necessary in the general equilibrium framework, where a # new evolution rule is calculated after each simulation run, but only # the sufficient statistics describing it are sent back to agents. self.updateEvolution() def postSolve(self): ''' Unpack the behavioral and value functions for more parsimonious access. Parameters ---------- none Returns ------- none ''' self.switchFuncPunk = self.solution[0].switchFuncPunk self.switchFuncJock = self.solution[0].switchFuncJock self.VfuncPunk = self.solution[0].VfuncPunk self.VfuncJock = self.solution[0].VfuncJock def simOnePrd(self): ''' Simulate one period of the fashion victom model for this type. Each agent receives an idiosyncratic preference shock and chooses whether to change styles (using the optimal decision rule). Parameters ---------- none Returns ------- none ''' pNow = self.pNow sPrev = self.sNow J2Pprob = self.switchFuncJock(pNow) P2Jprob = self.switchFuncPunk(pNow) Shks = self.RNG.rand(self.pop_size) J2P = np.logical_and(sPrev == 0,Shks < J2Pprob) P2J = np.logical_and(sPrev == 1,Shks < P2Jprob) sNow = copy(sPrev) sNow[J2P] = 1 sNow[P2J] = 0 self.sNow = sNow def marketAction(self): ''' The "market action" for a FashionType in the general equilibrium setting. Simulates a single period using self.simOnePrd(). Parameters ---------- none Returns ------- none ''' self.simOnePrd()