Exemple #1
0
 def asVentureValue(self, thing):
     thing = np.asarray(thing)
     if len(thing.shape) == 0:
         return vv.VentureNumber(float(thing))
     elif len(thing.shape) == 1:
         subtype = NumberType(thing.dtype.name)
     else:
         subtype = self
     return vv.VentureArrayUnboxed(thing, subtype)
def testGradientOfSimulateOfLookup2():
    from venture.lite.sp_registry import builtInSPs
    sp = builtInSPs()["lookup"]
    args = [vv.VentureArrayUnboxed([0, 0], t.Number), vv.VentureNumber(1)]
    grad = sp.outputPSP.gradientOfSimulate(MockArgs(args, sp.constructSPAux()),
                                           vv.VentureNumber(0),
                                           vv.VentureNumber(1))
    assert grad[0].lookup(vv.VentureNumber(0)) == vv.VentureNumber(0)
    assert grad[0].lookup(vv.VentureNumber(1)) == vv.VentureNumber(1)
    assert grad[1] == 0
Exemple #3
0
 def asPython(self, thing):
     if isinstance(thing, vv.VentureBool):
         return thing.getBool()
     if isinstance(thing, vv.VentureInteger):
         return thing.getInteger()
     if isinstance(thing, vv.VentureNumber):
         return thing.getNumber()
     if isinstance(thing, vv.VentureAtom):
         return thing  # Atoms are valid elements of expressions
     if isinstance(thing, vv.VentureSymbol):
         return thing.getSymbol()
     if thing.isValidCompoundForm():
         # Leave quoted data as they are, on the grounds that (quote
         # <thing>) should evaluate to exactly that <thing>, even if
         # constructed programmatically from a <thing> that does not
         # normally appear in expressions.
         if thing.size() == 2 \
            and thing.lookup(vv.VentureNumber(0)) == vv.VentureSymbol("quote"):
             return ["quote", thing.lookup(vv.VentureNumber(1))]
         else:
             return thing.asPythonList(self)
     # Most other things are represented as themselves.
     return thing
Exemple #4
0
 def asVentureValue(self, thing):
     if isinstance(thing, bool) or isinstance(thing, np.bool_):
         return vv.VentureBool(thing)
     if isinstance(thing, int):
         return vv.VentureInteger(thing)
     if isinstance(thing, numbers.Number):
         return vv.VentureNumber(thing)
     if isinstance(thing, vv.VentureAtom):
         return thing
     if isinstance(thing, str):
         return vv.VentureSymbol(thing)
     if hasattr(thing, "__getitem__"):  # Already not a string
         return vv.VentureArray([self.asVentureValue(val) for val in thing])
     if isinstance(thing, vv.VentureValue):
         return thing
     else:
         raise Exception("Cannot convert Python object %r to a Venture " \
                         "Expression" % thing)
Exemple #5
0
 def asVentureValue(self, thing):
     if isinstance(thing, bool) or isinstance(thing, np.bool_):
         return vv.VentureBool(thing)
     if isinstance(thing, int):
         return vv.VentureInteger(thing)
     if isinstance(thing, numbers.Number):
         return vv.VentureNumber(thing)
     if isinstance(thing, str):
         return vv.VentureString(thing)
     if isinstance(thing, dict):
         return vv.VentureDict(
             OrderedDict([(self.asVentureValue(key),
                           self.asVentureValue(val))
                          for (key, val) in thing.iteritems()]))
     if hasattr(thing, "__getitem__"):  # Already not a string
         return vv.VentureArray([self.asVentureValue(val) for val in thing])
     if isinstance(thing, vv.VentureValue):
         return thing
     else:
         raise Exception("Cannot convert Python object %r to a Venture " \
                         "Expression" % thing)
Exemple #6
0
def __venture_start__(r):
    r.bind_callback("foo", lambda _inferrer: None)
    return v.VentureNumber(
        7)  # To test that load_plugin will forward the return value
 def number(self, **_kwargs):
     return v.VentureNumber(npr.uniform(-10, 10))
Exemple #8
0
 def asVentureValue(self, thing):
     assert isinstance(thing, numbers.Number)
     assert 0 <= thing and thing <= 1
     return vv.VentureNumber(thing)
Exemple #9
0
 def asVentureValue(self, thing):
     assert thing <= 0
     return vv.VentureNumber(thing)
 def probability(self, **_kwargs):
     return v.VentureNumber(npr.uniform(0, 1))
Exemple #11
0
 def asVentureValue(self, thing):
     return vv.VentureNumber(thing)
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)
 def nonpositive(self, **_kwargs):
     return v.VentureNumber(log(npr.uniform(0, 1)))
Exemple #14
0
def grad_vector_times_scalar(args, direction):
    dot_prod = v.vv_dot_product(v.VentureArrayUnboxed(args[0], t.NumberType()),
                                direction)
    return [direction * args[1], v.VentureNumber(dot_prod)]
Exemple #15
0
def mk_dict(*entries):
    return dict([(e.lookup(v.VentureNumber(0)), e.lookup(v.VentureNumber(1)))
                 for e in entries])
Exemple #16
0
def testCallbackReturns():
    ripl = get_ripl()
    ripl.bind_callback("three", lambda _inferrer: v.VentureNumber(3))
    ripl.infer("(do (x <- (call_back three)) (assert (eq 3 x)))")
def count_nodes(ripl):
    scope = vv.VentureNumber(0)
    block = vv.VentureNumber(0)
    return ripl.sivm.core_sivm.engine.getDistinguishedTrace().numNodesInBlock(
        scope, block)
Exemple #18
0
def vvsum(venture_array):
    # TODO Why do the directions come in and out as Venture Values
    # instead of being unpacked by f_type.gradient_type()?
    return v.VentureNumber(sum(venture_array.getArray(t.NumberType())))
 def positive(self, **_kwargs):
     return v.VentureNumber(npr.uniform(0, 10))  # TODO Prevent zero
Exemple #20
0
def count_nodes(engine):
    scope = vv.VentureNumber(0)
    block = vv.VentureNumber(0)
    return engine.getDistinguishedTrace().numNodesInBlock(scope, block)