/*******************************************************************************
* Copyright 2012 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.schedulers.scheduleEntry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.annotation.Nullable;
import com.analog.lyric.dimple.model.core.FactorGraph;
import com.analog.lyric.dimple.model.core.INode;
import com.analog.lyric.dimple.model.variables.Variable;
import com.analog.lyric.dimple.model.variables.VariableBlock;
import com.analog.lyric.util.misc.Internal;
import com.analog.lyric.util.misc.Matlab;
/**
* A schedule entry that contains a collection of nodes to be updated together.
* <p>
* This class is primarily targeted at the Gibbs solver for block Gibbs updates. For that case, all
* of the nodes in the collection would be variables.
*
* @author jeffb
* @since 0.06
*/
public class BlockScheduleEntry implements IScheduleEntry
{
/*-------
* State
*/
private final IBlockUpdater _blockUpdater;
private final VariableBlock _block;
/*---------------
* Construction
*/
/**
*
* @param blockUpdater
* @param block
* @since 0.08
*/
public BlockScheduleEntry(IBlockUpdater blockUpdater, VariableBlock block)
{
_blockUpdater = blockUpdater;
_block = block;
}
/**
* @param blockUpdater
* @param nodeList
* @since 0.08
* @category internal
* @deprecated this will eventually be replaced by something in the matlabproxy package.
*/
@Deprecated
@Internal
@Matlab
public BlockScheduleEntry(FactorGraph graph, IBlockUpdater blockUpdater, Object ... nodeList)
{
this(blockUpdater, graph.addVariableBlock(Arrays.copyOf(nodeList, nodeList.length, Variable[].class)));
}
/*------------------------
* IScheduleEntry methods
*/
@Override
public BlockScheduleEntry copy(Map<Object,Object> old2newObjs, boolean copyToRoot)
{
return new BlockScheduleEntry(_blockUpdater.copy(old2newObjs), (VariableBlock)old2newObjs.get(_block));
}
@Override
public Type type()
{
return IScheduleEntry.Type.VARIABLE_BLOCK;
}
/**
* {@inheritDoc}
* <p>
* @returns parent of {@link #getBlock() variable block}, which is not necessarily the same as the
* parent of the variables contained in the block.
*/
@Override
public @Nullable FactorGraph getParentGraph()
{
return _block.getParentGraph();
}
@Override
public Iterable<? extends INode> getNodes()
{
return _block;
}
/*----------------------------
* BlockScheduleEntry methods
*/
public IBlockUpdater getBlockUpdater()
{
return _blockUpdater;
}
/**
* Variable block for entry.
* @since 0.08
*/
public VariableBlock getBlock()
{
return _block;
}
/**
* Returns {@link NodeScheduleEntry}s for each variable in the block.
* @since 0.08
*/
public List<NodeScheduleEntry> toNodeEntries()
{
ArrayList<NodeScheduleEntry> entries = new ArrayList<>(_block.size());
for (Variable var : _block)
{
entries.add(new NodeScheduleEntry(var));
}
return entries;
}
}