Exemple #1
0
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())
Exemple #2
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder,
                  RejectionOperator(logBound, trials))
Exemple #3
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, BogoPossibilizeOperator())
Exemple #4
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder,
                  GradientAscentOperator(rate, int(steps)))
Exemple #5
0
 def doit(scaffolder):
     return mixMH(
         trace, scaffolder,
         NesterovAcceleratedGradientAscentOperator(rate, int(steps)))
Exemple #6
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, StepOutSliceOperator(w, m))
Exemple #7
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, DoublingSliceOperator(w, p))
Exemple #8
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, EnumerativeMAPOperator())
Exemple #9
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder,
                  HamiltonianMonteCarloOperator(epsilon, int(L)))
Exemple #10
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, MeanfieldOperator(steps, 0.0001))
Exemple #11
0
 def doit(scaffolder):
     return mixMH(trace, scaffolder, FuncMHOperator())
Exemple #12
0
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)