@Override public final @Nullable Value toDeterministicValue(Domain domain) { int index = toDeterministicValueIndex(); return index >= 0 ? Value.createWithIndex((DiscreteDomain) domain, index) : null; }
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); }
/** @deprecated use {@link #setPriorIndex(int)} instead. */ @Deprecated public void setFixedValueIndex(int fixedValueIndex) { setPrior(Value.createWithIndex(getDomain(), fixedValueIndex)); }
@Deprecated @Override public void setFixedValueObject(@Nullable Object value) { setPrior(value != null ? Value.createWithIndex(getDomain(), (Integer) value) : null); }
/** * 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)); }