@Override
 public final @Nullable Value toDeterministicValue(Domain domain) {
   int index = toDeterministicValueIndex();
   return index >= 0 ? Value.createWithIndex((DiscreteDomain) domain, index) : null;
 }
Ejemplo n.º 2
0
  private @Nullable IDatum joinPriors(
      JointDiscreteDomain<?> jointDomain, IDatum[] subdomainPriors) {
    final JointDomainIndexer domains = jointDomain.getDomainIndexer();
    final int dimensions = jointDomain.getDimensions();
    boolean hasPrior = false;
    int[] fixedIndices = new int[dimensions];
    Arrays.fill(fixedIndices, -1);

    for (int i = 0; i < dimensions; ++i) {
      DiscreteDomain domain = domains.get(i);
      IDatum prior = subdomainPriors[i];
      if (prior != null) {
        hasPrior = true;

        if (prior instanceof Value) {
          Value value = (Value) prior;
          fixedIndices[i] =
              domain.equals(value.getDomain())
                  ? value.getIndex()
                  : domain.getIndex(value.getObject());
          subdomainPriors[i] = new DiscreteEnergyMessage(domain, value);
        } else {
          DiscreteMessage msg =
              prior instanceof DiscreteMessage
                  ? (DiscreteMessage) prior
                  : new DiscreteWeightMessage(domain, prior);
          subdomainPriors[i] = msg;
          fixedIndices[i] = msg.toDeterministicValueIndex();
        }
      }
    }

    if (!hasPrior) {
      // If none of the component variables has a prior, then neither will the joint variable.
      return null;
    }

    boolean hasAllFixedPriors = true;
    for (int i : fixedIndices) {
      if (i < 0) {
        hasAllFixedPriors = false;
        break;
      }
    }

    if (hasAllFixedPriors) {
      // Return fixed value with appropriate joint index.
      return Value.createWithIndex(jointDomain, domains.jointIndexFromIndices(fixedIndices));
    }

    int cardinality = jointDomain.size();

    double[] energies = new double[cardinality];

    int inner = 1, outer = cardinality;
    for (int dim = 0; dim < dimensions; ++dim) {
      final DiscreteDomain domain = domains.get(dim);
      final DiscreteMessage prior = (DiscreteMessage) subdomainPriors[dim];
      final int size = domain.size();
      int i = 0;

      outer /= size;

      if (prior != null) {
        for (int o = 0; o < outer; ++o) {
          for (double energy : prior.getEnergies()) {
            for (int r = 0; r < inner; ++r) {
              energies[i++] += energy;
            }
          }
        }
      }

      inner *= size;
    }

    return new DiscreteEnergyMessage(energies);
  }
Ejemplo n.º 3
0
 /** @deprecated use {@link #setPriorIndex(int)} instead. */
 @Deprecated
 public void setFixedValueIndex(int fixedValueIndex) {
   setPrior(Value.createWithIndex(getDomain(), fixedValueIndex));
 }
Ejemplo n.º 4
0
 @Deprecated
 @Override
 public void setFixedValueObject(@Nullable Object value) {
   setPrior(value != null ? Value.createWithIndex(getDomain(), (Integer) value) : null);
 }
Ejemplo n.º 5
0
 /**
  * Sets prior to a fixed discrete value with given index.
  *
  * @param index a valid index into the variable's {@linkplain #getDomain() domain}.
  * @return previous value of prior
  * @since 0.08
  */
 public @Nullable IDatum setPriorIndex(int index) {
   return setPrior(Value.createWithIndex(getDomain(), index));
 }