/*******************************************************************************
*   Copyright 2014 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.gibbs;

import static java.util.Objects.*;

import org.eclipse.jdt.annotation.Nullable;

import com.analog.lyric.dimple.model.core.FactorGraph;
import com.analog.lyric.dimple.solvers.interfaces.ISolverFactorGraph;
import com.analog.lyric.options.IOptionHolder;

/**
 * @deprecated Will be removed in future release. Use {@link GibbsSolverGraph} instead.
 */
@Deprecated
public class SFactorGraph extends GibbsSolverGraph
{
	/**
	 * @deprecated set corresponding {@link GibbsOptions} using {@linkplain IOptionHolder#setOption setOption}
	 * on graph instead of using this class to configure Gibbs solver.
	 */
	@Deprecated
	public static class Arguments
	{
		public int numSamples = -1;
		public int updatesPerSample = -1;
		public int scansPerSample = Integer.MIN_VALUE;
		public int burnInUpdates = -1;
		public @Nullable Boolean temper = null;
		public double initialTemperature = Double.NaN;
		public double temperingHalfLifeInSamples = Double.NaN;
	}

	protected SFactorGraph(FactorGraph factorGraph, @Nullable ISolverFactorGraph parent,
		@Nullable SFactorGraph.Arguments arguments)
	{
		super(factorGraph, parent);
		if (arguments != null)
		{
			if (arguments.numSamples > 0)
			{
				setNumSamples(arguments.numSamples);
			}
			if (arguments.updatesPerSample > 0)
			{
				setUpdatesPerSample(arguments.updatesPerSample);
			}
			if (arguments.scansPerSample > 0)
			{
				setScansPerSample(arguments.scansPerSample);
			}
			if (arguments.burnInUpdates >=0)
			{
				setBurnInUpdates(arguments.burnInUpdates);
			}
			if (arguments.temper != null)
			{
				setTempering(requireNonNull(arguments.temper));
			}
			if (!Double.isNaN(arguments.initialTemperature))
			{
				setOption(GibbsOptions.initialTemperature, arguments.initialTemperature);
			}
			if (!Double.isNaN(arguments.temperingHalfLifeInSamples))
			{
				setOption(GibbsOptions.annealingHalfLife, arguments.temperingHalfLifeInSamples);
			}
		}
	}
}
