def do_mh_kernel_update(trace, scope, block, extra): (useDeltaKernels, deltaKernelArgs, updateValues) = extra scaffolder = BlockScaffoldIndexer(scope, block, useDeltaKernels=useDeltaKernels, deltaKernelArgs=deltaKernelArgs, updateValues=updateValues) return mixMH(trace, scaffolder, MHOperator())
def doit(scaffolder): return mixMH(trace, scaffolder, RejectionOperator(logBound, trials))
def doit(scaffolder): return mixMH(trace, scaffolder, BogoPossibilizeOperator())
def doit(scaffolder): return mixMH(trace, scaffolder, GradientAscentOperator(rate, int(steps)))
def doit(scaffolder): return mixMH( trace, scaffolder, NesterovAcceleratedGradientAscentOperator(rate, int(steps)))
def doit(scaffolder): return mixMH(trace, scaffolder, StepOutSliceOperator(w, m))
def doit(scaffolder): return mixMH(trace, scaffolder, DoublingSliceOperator(w, p))
def doit(scaffolder): return mixMH(trace, scaffolder, EnumerativeMAPOperator())
def doit(scaffolder): return mixMH(trace, scaffolder, HamiltonianMonteCarloOperator(epsilon, int(L)))
def doit(scaffolder): return mixMH(trace, scaffolder, MeanfieldOperator(steps, 0.0001))
def doit(scaffolder): return mixMH(trace, scaffolder, FuncMHOperator())
def primitive_infer(trace, exp): operator = exp[0] if operator == "resimulation_mh": (scaffolders, transitions, _) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, MHOperator()) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "func_mh": (scaffolders, transitions, _) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, FuncMHOperator()) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "draw_scaffold": (scaffolders, _transitions, _) = dispatch_arguments(trace, exp) drawScaffold(trace, scaffolders[0]) elif operator == "mh_kernel_update": (scope, block, transitions, extra) = parse_arguments(trace, exp) return transloop(trace, transitions, lambda : \ do_mh_kernel_update(trace, scope, block, extra)) elif operator == "subsampled_mh": (scope, block, transitions, extra) = parse_arguments(trace, exp) return transloop(trace, transitions, lambda : \ do_subsampled_mh(trace, scope, block, extra)) elif operator == "subsampled_mh_check_applicability": (scope, block, _transitions, _) = parse_arguments(trace, exp) SubsampledBlockScaffoldIndexer(scope, block).checkApplicability(trace) # Does not affect nodes return 0.0 elif operator == "subsampled_mh_make_consistent": (scope, block, transitions, _) = parse_arguments(trace, exp) return transloop(trace, transitions, lambda : \ do_subsampled_mh_make_consistent(trace, scope, block, extra)) elif operator == "meanfield": (scaffolders, transitions, extra) = dispatch_arguments(trace, exp) steps = int(extra[0]) def doit(scaffolder): return mixMH(trace, scaffolder, MeanfieldOperator(steps, 0.0001)) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "hmc": (scaffolders, transitions, (epsilon, L)) = dispatch_arguments(trace, exp) assert isinstance(L, numbers.Number) assert isinstance(epsilon, numbers.Number) def doit(scaffolder): return mixMH(trace, scaffolder, HamiltonianMonteCarloOperator(epsilon, int(L))) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "gibbs": (scaffolders, transitions, _) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, EnumerativeGibbsOperator()) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "emap": (scaffolders, transitions, _) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, EnumerativeMAPOperator()) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "gibbs_update": (scope, block, transitions, _) = parse_arguments(trace, exp) return transloop(trace, transitions, lambda : \ mixMH(trace, BlockScaffoldIndexer(scope, block, updateValues=True), EnumerativeGibbsOperator())) elif operator == "slice": (scaffolders, transitions, (w, m)) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, StepOutSliceOperator(w, m)) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "slice_doubling": (scaffolders, transitions, (w, p)) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, DoublingSliceOperator(w, p)) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "pgibbs": (scope, block, transitions, extra) = parse_arguments(trace, exp) particles = int(extra[0]) if isinstance(block, list): # Ordered range (_, min_block, max_block) = block scaffolder = BlockScaffoldIndexer(scope, "ordered_range", (min_block, max_block)) return transloop(trace, transitions, lambda : \ mixMH(trace, scaffolder, PGibbsOperator(particles))) else: return transloop(trace, transitions, lambda : \ mixMH(trace, BlockScaffoldIndexer(scope, block), PGibbsOperator(particles))) elif operator == "pgibbs_update": (scope, block, transitions, extra) = parse_arguments(trace, exp) particles = int(extra[0]) if isinstance(block, list): # Ordered range (_, min_block, max_block) = block scaffolder = BlockScaffoldIndexer(scope, "ordered_range", (min_block, max_block), updateValues=True) return transloop(trace, transitions, lambda : \ mixMH(trace, scaffolder, PGibbsOperator(particles))) else: return transloop(trace, transitions, lambda : \ mixMH(trace, BlockScaffoldIndexer(scope, block, updateValues=True), PGibbsOperator(particles))) elif operator == "func_pgibbs": (scope, block, transitions, extra) = parse_arguments(trace, exp) particles = int(extra[0]) if isinstance(block, list): # Ordered range (_, min_block, max_block) = block scaffolder = BlockScaffoldIndexer(scope, "ordered_range", (min_block, max_block)) return transloop(trace, transitions, lambda : \ mixMH(trace, scaffolder, ParticlePGibbsOperator(particles))) else: return transloop(trace, transitions, lambda : \ mixMH(trace, BlockScaffoldIndexer(scope, block), ParticlePGibbsOperator(particles))) elif operator == "func_pmap": (scope, block, transitions, extra) = parse_arguments(trace, exp) particles = int(extra[0]) if isinstance(block, list): # Ordered range (_, min_block, max_block) = block scaffolder = BlockScaffoldIndexer(scope, "ordered_range", (min_block, max_block)) return transloop(trace, transitions, lambda : \ mixMH(trace, scaffolder, ParticlePMAPOperator(particles))) else: return transloop(trace, transitions, lambda : \ mixMH(trace, BlockScaffoldIndexer(scope, block), ParticlePMAPOperator(particles))) elif operator == "gradient_ascent": # XXX, in order to mak default args work here, I need to check the lenght of # the args to `gradient_ascent` conditioned on whether the second arg is a # VentureSymbol. if isinstance(exp[1], v.VentureSymbol): expected_arg_length = 6 else: expected_arg_length = 5 if len(exp) == expected_arg_length - 2: exp += [v.VentureNumber(1.0), v.VentureNumber(1.0)] elif len(exp) == expected_arg_length - 1: exp += [v.VentureNumber(1.0)] elif len(exp) < expected_arg_length - 2: raise ValueError('Not enough args for gradient_ascent') (scaffolders, transitions, extra) = dispatch_arguments(trace, exp) (rate, steps) = extra def doit(scaffolder): return mixMH(trace, scaffolder, GradientAscentOperator(rate, int(steps))) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "nesterov": (scaffolders, transitions, (rate, steps)) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH( trace, scaffolder, NesterovAcceleratedGradientAscentOperator(rate, int(steps))) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "rejection": (scaffolders, transitions, extra) = dispatch_arguments(trace, exp) if len(extra) >= 1: logBound = float(extra[0]) else: logBound = None if len(extra) == 2: trials = int(extra[1]) else: trials = None def doit(scaffolder): return mixMH(trace, scaffolder, RejectionOperator(logBound, trials)) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "bogo_possibilize": (scaffolders, transitions, _) = dispatch_arguments(trace, exp) def doit(scaffolder): return mixMH(trace, scaffolder, BogoPossibilizeOperator()) return transloop(trace, transitions, scaffolder_loop(scaffolders, doit)) elif operator == "log_rejection_bound_at": (scaffolders, _transitions, _) = dispatch_arguments(trace, exp) assert len( scaffolders) == 1, "log_rejection_bound_at doesn't support 'each'" scaffold = scaffolders[0].sampleIndex(trace) return computeRejectionBound(trace, scaffold, scaffold.border[0]) elif operator == "print_scaffold_stats": (scaffolders, _transitions, _) = dispatch_arguments(trace, exp) scaffold = scaffolders[0].sampleIndex(trace) scaffold.show() return scaffold.numAffectedNodes() else: raise Exception("INFER %s is not implemented" % operator)