コード例 #1
0
 private int getVarDepth(VarWithDistrib var) {
   int maxArgDepth = 0;
   for (int i = 0; i < var.args().length; ++i) {
     Object arg = var.args()[i];
     if (arg instanceof NonGuaranteedObject) {
       int d = ((NonGuaranteedObject) arg).getDepth();
       maxArgDepth = Math.max(d, maxArgDepth);
     }
   }
   return maxArgDepth;
 }
コード例 #2
0
  @Override
  public void nextSample() {
    WorldWithBlock curWorld = (WorldWithBlock) getBaseWorld();
    if (curWorld == null) {
      curWorld = new WorldWithBlock(model, evidence, intBound, depthBound);
      Util.debug("Creating initial possible world");
    }
    this.curWorld = curWorld;
    double logWeight = Double.NEGATIVE_INFINITY;
    latestSampleLogWeight = 0;
    while (!isCurWorldSufficient(curWorld)) {
      VarWithDistrib var = curWorld.getNextUninstVar();
      if (var != null) {
        if (var.canSample(curWorld)) {
          logWeight = sampleAndComputeLogWeight(var, curWorld);
        } else {
          curWorld.putBackVarWithDistrib(var);
        }
      } else {
        System.out.println(
            "World is not complete, but no basic random "
                + "variable is supported.  Please check for "
                + "a possible cycle in your model.");
      }
      latestSampleLogWeight += logWeight;
    }

    if (!evidence.isTrue(curWorld)) latestSampleLogWeight = Double.NEGATIVE_INFINITY;
    BLOGUtil.ensureDetAndSupported(queryVars, curWorld);

    // FIXME: remove duplication with LWSampler
    ++totalNumSamples;
    ++numSamplesThisTrial;
    if (latestSampleLogWeight > NEGLIGIBLE_LOG_WEIGHT) {
      ++totalNumConsistent;
      ++numConsistentThisTrial;
    }
    logSumWeightsThisTrial = Util.logSum(logSumWeightsThisTrial, latestSampleLogWeight);
  }
コード例 #3
0
  private double sampleAndComputeLogWeight(VarWithDistrib var, WorldWithBlock curWorld) {
    DependencyModel.Distrib distrib =
        var.getDistrib(new BlockInstantiatingEvalContextImpl(curWorld));
    Util.debug("Instantiating: ", var);
    Type varType = var.getType();
    CondProbDistrib cpd = distrib.getCPD();
    cpd.setParams(distrib.getArgValues());
    Region r = curWorld.getSatisfyingRegion(var);

    double logWeight = Double.NEGATIVE_INFINITY;
    if (r.isEmpty()) return -1;
    Object value = null;
    if (r.isSingleton()) {
      value = r.getOneValue();
      logWeight = java.lang.Math.log(cpd.getProb(value));
    } else {
      do {
        value = cpd.sampleVal();
      } while (!r.contains(value));
      logWeight = java.lang.Math.log(computeCPD(cpd, r));
    }
    curWorld.setValue(var, value);
    return logWeight;
  }