@Override public void initialize() { super.initialize(); _numPorts = _factor.getSiblingCount(); // Pre-compute parity associated with any constant edges _constantParity = 1; FactorFunction factorFunction = _factor.getFactorFunction(); if (factorFunction.hasConstants()) { Object[] constantValues = factorFunction.getConstants(); int constantSum = 0; for (int i = 0; i < constantValues.length; i++) constantSum += FactorFunctionUtilities.toInteger(constantValues[i]); _constantParity = ((constantSum & 1) == 0) ? 1 : -1; } }
private void determineParameterConstantsAndEdges() { // Get the factor function and related state FactorFunction factorFunction = _factor.getFactorFunction(); FactorFunction containedFactorFunction = factorFunction.getContainedFactorFunction(); // In case the factor function is wrapped _factorFunction = factorFunction; boolean hasFactorFunctionConstants = factorFunction.hasConstants(); if (containedFactorFunction instanceof CategoricalUnnormalizedParameters) { CategoricalUnnormalizedParameters specificFactorFunction = (CategoricalUnnormalizedParameters) containedFactorFunction; _hasFactorFunctionConstructorConstants = specificFactorFunction.hasConstantParameters(); _numParameters = specificFactorFunction.getDimension(); _useEnergyParameters = false; } else if (containedFactorFunction instanceof CategoricalEnergyParameters) { CategoricalEnergyParameters specificFactorFunction = (CategoricalEnergyParameters) containedFactorFunction; _hasFactorFunctionConstructorConstants = specificFactorFunction.hasConstantParameters(); _numParameters = specificFactorFunction.getDimension(); _useEnergyParameters = true; } else throw new DimpleException("Invalid factor function"); // Pre-determine whether or not the parameters are constant; if so save the value; if not save // reference to the variable _numParameterEdges = _numParameters; _hasConstantOutputs = false; if (_hasFactorFunctionConstructorConstants) { // The factor function has fixed parameters provided in the factor-function constructor _numParameterEdges = 0; _hasConstantOutputs = hasFactorFunctionConstants; } else if (hasFactorFunctionConstants) { _hasConstantOutputs = factorFunction.hasConstantAtOrAboveIndex(_numParameters); int numConstantParameters = factorFunction.numConstantsInIndexRange(0, _numParameters - 1); _numParameterEdges = _numParameters - numConstantParameters; } _numOutputEdges = _numPorts - _numParameterEdges; // Save output variables List<? extends VariableBase> siblings = _factor.getSiblings(); _outputVariables = new SDiscreteVariable[_numOutputEdges]; for (int i = 0; i < _numOutputEdges; i++) _outputVariables[i] = (SDiscreteVariable) ((siblings.get(i + _numParameterEdges)).getSolver()); }