private double[] getDefaultPriors(DiscreteDomain domain) { final int length = domain.size(); double[] retval = new double[length]; double val = 1.0 / length; for (int i = 0; i < retval.length; i++) retval[i] = val; return retval; }
/** * Sets values for domain from datum. * * <p> * * @param domain discrete domain with size matching {@link #size()}. * @param datum either an exact {@link Value}, another {@link DiscreteMessage} or other {@link * IUnaryFactorFunction} used to evaluate energies for all possible discrete values. * @since 0.08 */ public void setFrom(DiscreteDomain domain, IDatum datum) { if (datum instanceof DiscreteMessage) { setFrom((DiscreteMessage) datum); } else if (datum instanceof Value) { Value value = (Value) datum; if (domain.equals(value.getDomain())) { setDeterministicIndex(value.getIndex()); } else { setDeterministicIndex(domain.getIndex(value.getObject())); } } else { IUnaryFactorFunction function = (IUnaryFactorFunction) datum; assertSameSize(domain.size()); DiscreteValue value = Value.create(domain); for (int i = domain.size(); --i >= 0; ) { value.setIndex(i); setEnergy(i, function.evalEnergy(value)); } } }
public Object[] getElements() { DiscreteDomain domain = getModelerObject(); // For some reason MATLAB cares about the component type of the array and for example will // implicitly convert strings from an Object[] but not a String[]! return domain.getElements(new Object[domain.size()]); }
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); }
private MultiplexerCPD create( Discrete Y, Discrete[] Zs, int zasize, boolean oneBased, boolean aAsDouble) { Y.setLabel("Y"); java.util.Hashtable<Object, Integer> yDomainObj2index = new java.util.Hashtable<Object, Integer>(); final DiscreteDomain yDomain = Y.getDiscreteDomain(); for (int i = 0, end = yDomain.size(); i < end; i++) yDomainObj2index.put(yDomain.getElement(i), i); // Create a variable Object[] adomain = new Object[Zs.length]; for (int i = 0; i < adomain.length; i++) { int val = oneBased ? i + 1 : i; if (aAsDouble) adomain[i] = (double) val; else adomain[i] = (int) val; } Discrete A = new Discrete(adomain); A.setLabel("A"); addBoundaryVariables(Y); addBoundaryVariables(A); addBoundaryVariables(Zs); // Make all of those boundary variables Variable[] vars = new Variable[Zs.length + 2]; vars[0] = Y; vars[1] = A; for (int i = 0; i < Zs.length; i++) vars[i + 2] = Zs[i]; // Create ZA variable Object[] zaDomain = new Object[zasize]; for (int i = 0; i < zaDomain.length; i++) zaDomain[i] = i; Discrete ZA = new Discrete(zaDomain); ZA.setLabel("ZA"); // Create Z* variables Discrete[] Zstars = new Discrete[Zs.length]; for (int i = 0; i < Zstars.length; i++) { Object[] domain = new Object[Zs[i].getDiscreteDomain().size() + 1]; for (int j = 0; j < domain.length; j++) domain[j] = j; Zstars[i] = new Discrete(domain); } // Create ZA Y factor int[][] indices = new int[zasize][2]; double[] weights = new double[zasize]; int index = 0; for (int i = 0; i < Zs.length; i++) { for (int j = 0; j < Zs[i].getDiscreteDomain().size(); j++) { indices[index][0] = index; indices[index][1] = yDomainObj2index.get(Zs[i].getDiscreteDomain().getElement(j)); weights[index] = 1; index++; } } Factor f = this.addFactor(indices, weights, ZA, Y); f.setLabel("Y2ZA"); // Create ZA A factor indices = new int[zasize][2]; weights = new double[zasize]; index = 0; for (int i = 0; i < Zs.length; i++) { for (int j = 0; j < Zs[i].getDiscreteDomain().size(); j++) { indices[index][0] = index; indices[index][1] = i; weights[index] = 1; index++; } } f = this.addFactor(indices, weights, ZA, A); f.setLabel("ZA2A"); // Create ZA Z* factors // Create Z* Z factors for (int a = 0; a < Zs.length; a++) { Zs[a].setLabel("Z" + a); Zstars[a].setLabel("Z*" + a); indices = new int[zasize][2]; weights = new double[zasize]; index = 0; // Factor from ZA to Z* for (int i = 0; i < Zs.length; i++) { for (int j = 0; j < Zs[i].getDiscreteDomain().size(); j++) { indices[index][0] = index; if (a == i) { indices[index][1] = j; } else { int sz = Zs[a].getDiscreteDomain().size(); indices[index][1] = sz; } weights[index] = 1; index++; } } f = this.addFactor(indices, weights, ZA, Zstars[a]); f.setLabel("ZA2Z*"); // From Z* to Z indices = new int[Zs[a].getDiscreteDomain().size() * 2][2]; weights = new double[indices.length]; int ds = Zs[a].getDiscreteDomain().size(); for (int i = 0; i < ds; i++) { indices[i][0] = i; indices[ds + i][0] = ds; indices[i][1] = i; indices[ds + i][1] = i; weights[i] = 1; weights[ds + i] = 1; } f = this.addFactor(indices, weights, Zstars[a], Zs[a]); f.setLabel("Z*2Z"); } this._y = Y; this._a = A; this._za = ZA; this._zs = Zs; return this; }