/*
 * AbstractValueSelection.java
 *
 * Created on 12. říjen 2000, 14:28
 * Documented 18. 7. 2001
 */

package timetable.solver.strategy.value;

import timetable.data.*;
import timetable.solver.strategy.price.*;
import timetable.util.*;
/** Abstraktní třída heuristiky výběru umístění.
 * Narozdíl od ValueSelectionInterface navíc implementuje použití ohodnocovací funkce.
 *
 * @author Tomáš Müller
 * @version 1.0
 *
 * @see timetable.solver.strategy.value.ValueSelectionInterface
 * @see timetable.solver.strategy.price.SingleActivityEvaluationInterface
 */
public abstract class AbstractValueSelection implements ValueSelectionInterface {
    /** Ohodnocovací funkce. */
    protected SingleActivityEvaluationInterface evaluation = null;
    /** Globální konfigurace */
    protected Config config  = null;    
    /** Vybraná aktivita */
    protected Activity activity = null;
    
    /** Konstruktor.
     * @param config konfigurace
     * @param evaluation ohodnocovací funkce
     */
    public AbstractValueSelection(Config config,SingleActivityEvaluationInterface evaluation) {
        this.config = config;
        this.evaluation = evaluation;
    }
    
    /** Nastavení aktivity, pro kterou se bude umístění hledat. Reset heuristiky.
     * @param activity vybraná aktivita
     */
    public void reset(Activity activity) {
        this.activity = activity;
    }
    
    /** Přidání možného umístění do výběru. 
     * @param slot počáteční slot 
     * @param selectedResources vybrané zdroje
     * @param dependences množina všech závislostí
     * @param conflictActivities množina aktivit, které jsou s daným umístěním v konfliktu - budou se muset z rozvrhu odebrat v případě zvolení tohoto umístění
     */
    public abstract void addValue(int slot,ActivityResources selectedResources,ActivityDependenceGroup dependences,ActivityGroup conflictActivities) throws TimetableException ;
    
    /** Metoda provede výběr umístění. */
    public abstract void select() throws TimetableException ;
    
    /** Vrací vybrané umístění.
     * @return počáteční slot
     */
    public abstract int selectedSlot();
    
    /** Vrací vybrané umístění.
     * @return vybrané zdroje
     */
    public abstract ActivityResources selectedResources();

    /** Vrací vybrané umístění.
     * @return konfliktní aktivity
     */
    public abstract ActivityGroup selectedConflictActivities();
    
}