/*******************************************************************************
* 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;
import java.util.List;
import java.util.Map;
import com.analog.lyric.dimple.model.core.FactorGraph;
import com.analog.lyric.dimple.schedulers.schedule.ISchedule;
import com.analog.lyric.dimple.schedulers.schedule.ScheduleValidationException;
import com.analog.lyric.dimple.solvers.interfaces.ISolverFactorGraph;
import com.analog.lyric.options.IOptionValue;
/**
* @author jeffb
*
* Any scheduler must implement this interface.
*
* The createSchedule method takes a factor-graph as input, and returns
* a schedule of any type.
*/
public interface IScheduler extends IOptionValue
{
/**
* Create schedule appropriate for given solver graph.
* @since 0.08
*/
public ISchedule createSchedule(ISolverFactorGraph solverGraph);
/**
* Create schedule appropriate for given graph.
*/
public ISchedule createSchedule(FactorGraph graph);
/**
* Returns an immutable list of scheduler option keys for which the scheduler is intended to be used.
* <p>
* For instance, a scheduler that produces edge schedule entries appropriate for message
* passing might return a list containing {@linkplain com.analog.lyric.dimple.options.BPOptions#scheduler
* BPOptions.scheduler}
* <p>
* This list is used by the {@link FactorGraph#setScheduler} method to set the corresponding options
* listed by the scheduler.
* @since 0.08
*/
public List<? extends SchedulerOptionKey> applicableSchedulerOptions();
public IScheduler copy(Map<Object,Object> old2NewMap, boolean copyToRoot);
/**
* True if this is a custom scheduler.
* <p>
* Schedules produced by custom schedulers are subject to validation during graph initialization.
* <p>
* @since 0.08
*/
public boolean isCustomScheduler();
/**
* Indicates this is a default scheduler for one or more {@link SchedulerOptionKey}.
* @since 0.08
*/
public boolean isDefaultScheduler();
/**
* Validates whether scheduler can be used with given graph.
* <p>
* Most schedulers can be applied to any graph and will not do anything.
* <p>
* @since 0.08
* @throws ScheduleValidationException if scheduler cannot be used with {@code graph}.
*/
public void validateForGraph(FactorGraph graph);
}