def propose(self,trace,scaffold): from particle import Particle self.trace = trace self.scaffold = scaffold assertTrace(self.trace,self.scaffold) #print map(len, scaffold.border) self.T = len(self.scaffold.border) T = self.T P = self.P # assert T == 1 # TODO temporary rhoDBs = [None for t in range(T)] rhoWeights = [None for t in range(T)] for t in reversed(range(T)): rhoWeights[t],rhoDBs[t] = detachAndExtract(trace,scaffold.border[t],scaffold) assertTorus(scaffold) particles = [Particle(trace) for p in range(P+1)] self.particles = particles particleWeights = [None for p in range(P+1)] # Simulate and calculate initial xiWeights for p in range(P): particleWeights[p] = regenAndAttach(particles[p],scaffold.border[0],scaffold,False,OmegaDB(),{}) particleWeights[P] = regenAndAttach(particles[P],scaffold.border[0],scaffold,True,rhoDBs[0],{}) assert_almost_equal(particleWeights[P],rhoWeights[0]) # for every time step, for t in range(1,T): newParticles = [None for p in range(P+1)] newParticleWeights = [None for p in range(P+1)] # Sample new particle and propagate for p in range(P): parent = sampleLogCategorical(particleWeights) newParticles[p] = Particle(particles[parent]) newParticleWeights[p] = regenAndAttach(newParticles[p],self.scaffold.border[t],self.scaffold,False,OmegaDB(),{}) newParticles[P] = Particle(particles[P]) newParticleWeights[P] = regenAndAttach(newParticles[P],self.scaffold.border[t],self.scaffold,True,rhoDBs[t],{}) assert_almost_equal(newParticleWeights[P],rhoWeights[t]) particles = newParticles particleWeights = newParticleWeights # Now sample a NEW particle in proportion to its weight finalIndex = sampleLogCategorical(particleWeights[0:-1]) assert finalIndex < P self.finalIndex = finalIndex self.particles = particles return particles[finalIndex],self._compute_alpha(particleWeights, finalIndex)
def propose(self,trace,scaffold): self.trace = trace self.scaffold = scaffold assertTrace(self.trace,self.scaffold) self.T = len(self.scaffold.border) T = self.T P = self.P rhoWeights = [None for t in range(T)] omegaDBs = [[None for p in range(P+1)] for t in range(T)] ancestorIndices = [[None for p in range(P)] + [P] for t in range(T)] self.omegaDBs = omegaDBs self.ancestorIndices = ancestorIndices for t in reversed(range(T)): (rhoWeights[t],omegaDBs[t][P]) = detachAndExtract(trace,scaffold.border[t],scaffold) assertTorus(scaffold) xiWeights = [None for p in range(P)] # Simulate and calculate initial xiWeights for p in range(P): regenAndAttach(trace,scaffold.border[0],scaffold,False,OmegaDB(),{}) (xiWeights[p],omegaDBs[0][p]) = detachAndExtract(trace,scaffold.border[0],scaffold) # for every time step, for t in range(1,T): newWeights = [None for p in range(P)] # Sample new particle and propagate for p in range(P): extendedWeights = xiWeights + [rhoWeights[t-1]] ancestorIndices[t][p] = sampleLogCategorical(extendedWeights) path = constructAncestorPath(ancestorIndices,t,p) restoreAncestorPath(trace,self.scaffold.border,self.scaffold,omegaDBs,t,path) regenAndAttach(trace,self.scaffold.border[t],self.scaffold,False,OmegaDB(),{}) (newWeights[p],omegaDBs[t][p]) = detachAndExtract(trace,self.scaffold.border[t],self.scaffold) detachRest(trace,self.scaffold.border,self.scaffold,t) xiWeights = newWeights # Now sample a NEW particle in proportion to its weight finalIndex = sampleLogCategorical(xiWeights) path = constructAncestorPath(ancestorIndices,T-1,finalIndex) + [finalIndex] assert len(path) == T restoreAncestorPath(trace,self.scaffold.border,self.scaffold,omegaDBs,T,path) assertTrace(self.trace,self.scaffold) return trace,self._compute_alpha(rhoWeights[T-1], xiWeights, finalIndex)
def propose(self,trace,scaffold): from particle import Particle assertTrace(trace,scaffold) pnodes = scaffold.getPrincipalNodes() currentValues = getCurrentValues(trace,pnodes) allSetsOfValues = getCartesianProductOfEnumeratedValues(trace,pnodes) registerDeterministicLKernels(trace,scaffold,pnodes,currentValues) detachAndExtract(trace,scaffold.border[0],scaffold) assertTorus(scaffold) xiWeights = [] xiParticles = [] for p in range(len(allSetsOfValues)): newValues = allSetsOfValues[p] xiParticle = Particle(trace) assertTorus(scaffold) registerDeterministicLKernels(trace,scaffold,pnodes,newValues) xiParticles.append(xiParticle) xiWeights.append(regenAndAttach(xiParticle,scaffold.border[0],scaffold,False,OmegaDB(),{})) # Now sample a NEW particle in proportion to its weight finalIndex = sampleLogCategorical(xiWeights) self.finalParticle = xiParticles[finalIndex] return self.finalParticle,0