/******************************************************************************* * Copyright 2013-2015 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ package com.analog.lyric.dimple.solvers.core; import org.eclipse.jdt.annotation.Nullable; import com.analog.lyric.dimple.events.SolverEventSource; import com.analog.lyric.dimple.exceptions.DimpleException; import com.analog.lyric.dimple.model.core.EdgeState; import com.analog.lyric.dimple.model.core.Port; import com.analog.lyric.dimple.model.factors.Factor; import com.analog.lyric.dimple.model.repeated.BlastFromThePastFactor; import com.analog.lyric.dimple.model.variables.Variable; import com.analog.lyric.dimple.solvers.interfaces.ISolverBlastFromThePastFactor; import com.analog.lyric.dimple.solvers.interfaces.ISolverEdgeState; import com.analog.lyric.dimple.solvers.interfaces.ISolverFactorGraph; import com.analog.lyric.dimple.solvers.interfaces.ISolverVariable; import com.analog.lyric.dimple.solvers.interfaces.SolverNodeMapping; public class SBlastFromThePast extends SolverEventSource implements ISolverBlastFromThePastFactor { private BlastFromThePastFactor _factor; protected final Port _portForOtherVar; protected final Port _portForBlastVar; protected final ISolverFactorGraph _parent; public SBlastFromThePast(BlastFromThePastFactor f, ISolverFactorGraph parent) { _factor = f; _portForOtherVar = f.getPortForOtherVariable(); Variable varConnectedToBlast = f.getVariableConnectedToBlast(); _portForBlastVar = varConnectedToBlast.getPort(varConnectedToBlast.findSibling(getModelObject())); _parent = parent; } /*---------------- * Object methods */ @Override public String toString() { return String.format("[%s %s]", getClass().getSimpleName(), _factor.getQualifiedName()); } /*---------------------------- * IDimpleEventSource methods */ @Override public Factor getModelEventSource() { return getModelObject(); } /*---------------------- * ISolverNode methods */ @Override public ISolverFactorGraph getContainingSolverGraph() { return _parent; } @Override public @Nullable ISolverEdgeState getSiblingEdgeState(int siblingIndex) { return requireParentGraph().getSolverEdge(_factor.getSiblingEdgeIndex(siblingIndex)); } @Override public ISolverVariable getSibling(int edge) { final Variable sibling = getModelObject().getSibling(edge); return getSolverMapping().getSolverVariable(sibling); } @Override public int getSiblingCount() { return getModelObject().getSiblingCount(); } @Override public SolverNodeMapping getSolverMapping() { return _parent.getSolverMapping(); } /*----------------------- * ISolverFactor methods */ @Override public @Nullable ISolverEdgeState createEdge(EdgeState edge) { return null; } /*--------------------------- * SBlastFromThePast methods */ public BlastFromThePastFactor getFactor() { return _factor; } public @Nullable Port getOtherVariablePort() { return _portForOtherVar; } @Override public Object getBelief() { throw new DimpleException("Not implemented"); } @Override public double getInternalEnergy() { throw new DimpleException("Not implemented"); } @Override public double getBetheEntropy() { throw new DimpleException("Not implemented"); } @Override public int[][] getPossibleBeliefIndices() { throw new DimpleException("Not implemented"); } @Override public void update() { } @Override public void updateEdge(int outPortNum) { } @Override public void initialize() { clearFlags(); } @Override public ISolverFactorGraph getParentGraph() { return _parent; } @Override public ISolverFactorGraph getRootSolverGraph() { return _parent.getRootSolverGraph(); } @Override public double getScore() { throw new DimpleException("Not implemented"); } @Override public Factor getModelObject() { return _factor; } @Deprecated @Override public Object getInputMsg(int portIndex) { throw new DimpleException("Not implemented"); } @Deprecated @Override public Object getOutputMsg(int portIndex) { throw new DimpleException("Not implemented"); } @Deprecated @Override public void setInputMsg(int portIndex, Object obj) { throw new DimpleException("Not implemented"); } @Deprecated @Override public void setOutputMsg(int portIndex, Object obj) { Variable var = _factor.getSibling(portIndex); int index = _factor.getReverseSiblingNumber(portIndex); // FIXME - lookup through solver graph var.requireSolver("setOutputMsg").setInputMsg(index,obj); } @Deprecated @Override public void setInputMsgValues(int portIndex, Object obj) { throw new DimpleException("Not implemented"); } @Override public void setOutputMsgValues(int portIndex, Object obj) { throw new DimpleException("Not implemented"); } @SuppressWarnings("null") @Override public void advance() { // FIXME lookup through solver graph EdgeState edgeState = _portForBlastVar.toEdgeState(); ISolverFactorGraph sfg = _portForBlastVar.getNode().getParentGraph().getSolver(); ISolverEdgeState sedge = sfg.getSolverEdge(edgeState); EdgeState edgeState2 = _portForOtherVar.toEdgeState(); ISolverFactorGraph sfg2 = _portForOtherVar.getNode().getParentGraph().getSolver(); ISolverEdgeState sedge2 = sfg2.getSolverEdge(edgeState2); sedge.setFrom(sedge2); sedge2.reset(); } @Override public void setDirectedTo(int[] indices) { //NOP } }