/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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 org.optaplanner.core.config.heuristic.policy; import java.util.HashMap; import java.util.Map; import org.optaplanner.core.config.heuristic.selector.entity.EntitySorterManner; import org.optaplanner.core.config.heuristic.selector.value.ValueSorterManner; import org.optaplanner.core.config.solver.EnvironmentMode; import org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor; import org.optaplanner.core.impl.heuristic.selector.entity.EntitySelector; import org.optaplanner.core.impl.heuristic.selector.entity.mimic.EntityMimicRecorder; import org.optaplanner.core.impl.heuristic.selector.value.ValueSelector; import org.optaplanner.core.impl.heuristic.selector.value.mimic.ValueMimicRecorder; import org.optaplanner.core.impl.score.definition.ScoreDefinition; import org.optaplanner.core.impl.score.director.InnerScoreDirectorFactory; import org.optaplanner.core.impl.solver.ChildThreadType; public class HeuristicConfigPolicy { private final EnvironmentMode environmentMode; private final String logIndentation; private final InnerScoreDirectorFactory scoreDirectorFactory; private EntitySorterManner entitySorterManner = EntitySorterManner.NONE; private ValueSorterManner valueSorterManner = ValueSorterManner.NONE; private boolean reinitializeVariableFilterEnabled = false; private boolean initializedChainedValueFilterEnabled = false; private Map<String, EntityMimicRecorder> entityMimicRecorderMap = new HashMap<>(); private Map<String, ValueMimicRecorder> valueMimicRecorderMap = new HashMap<>(); public HeuristicConfigPolicy(EnvironmentMode environmentMode, InnerScoreDirectorFactory scoreDirectorFactory) { this(environmentMode, "", scoreDirectorFactory); } public HeuristicConfigPolicy(EnvironmentMode environmentMode, String logIndentation, InnerScoreDirectorFactory scoreDirectorFactory) { this.environmentMode = environmentMode; this.logIndentation = logIndentation; this.scoreDirectorFactory = scoreDirectorFactory; } public EnvironmentMode getEnvironmentMode() { return environmentMode; } public String getLogIndentation() { return logIndentation; } public SolutionDescriptor getSolutionDescriptor() { return scoreDirectorFactory.getSolutionDescriptor(); } public ScoreDefinition getScoreDefinition() { return scoreDirectorFactory.getScoreDefinition(); } public InnerScoreDirectorFactory getScoreDirectorFactory() { return scoreDirectorFactory; } public EntitySorterManner getEntitySorterManner() { return entitySorterManner; } public void setEntitySorterManner(EntitySorterManner entitySorterManner) { this.entitySorterManner = entitySorterManner; } public ValueSorterManner getValueSorterManner() { return valueSorterManner; } public void setValueSorterManner(ValueSorterManner valueSorterManner) { this.valueSorterManner = valueSorterManner; } public boolean isReinitializeVariableFilterEnabled() { return reinitializeVariableFilterEnabled; } public void setReinitializeVariableFilterEnabled(boolean reinitializeVariableFilterEnabled) { this.reinitializeVariableFilterEnabled = reinitializeVariableFilterEnabled; } public Map<String, EntityMimicRecorder> getEntityMimicRecorderMap() { return entityMimicRecorderMap; } public void setEntityMimicRecorderMap(Map<String, EntityMimicRecorder> entityMimicRecorderMap) { this.entityMimicRecorderMap = entityMimicRecorderMap; } public Map<String, ValueMimicRecorder> getValueMimicRecorderMap() { return valueMimicRecorderMap; } public void setValueMimicRecorderMap(Map<String, ValueMimicRecorder> valueMimicRecorderMap) { this.valueMimicRecorderMap = valueMimicRecorderMap; } public boolean isInitializedChainedValueFilterEnabled() { return initializedChainedValueFilterEnabled; } public void setInitializedChainedValueFilterEnabled(boolean initializedChainedValueFilterEnabled) { this.initializedChainedValueFilterEnabled = initializedChainedValueFilterEnabled; } // ************************************************************************ // Builder methods // ************************************************************************ public HeuristicConfigPolicy createPhaseConfigPolicy() { return new HeuristicConfigPolicy(environmentMode, scoreDirectorFactory); } public HeuristicConfigPolicy createChildThreadConfigPolicy(ChildThreadType childThreadType) { return new HeuristicConfigPolicy(environmentMode, logIndentation + " ", scoreDirectorFactory); } // ************************************************************************ // Worker methods // ************************************************************************ public void addEntityMimicRecorder(String id, EntityMimicRecorder mimicRecordingEntitySelector) { EntityMimicRecorder put = entityMimicRecorderMap.put(id, mimicRecordingEntitySelector); if (put != null) { throw new IllegalStateException("Multiple " + EntityMimicRecorder.class.getSimpleName() + "s (usually " + EntitySelector.class.getSimpleName() + "s) have the same id (" + id + ")."); } } public EntityMimicRecorder getEntityMimicRecorder(String id) { return entityMimicRecorderMap.get(id); } public void addValueMimicRecorder(String id, ValueMimicRecorder mimicRecordingValueSelector) { ValueMimicRecorder put = valueMimicRecorderMap.put(id, mimicRecordingValueSelector); if (put != null) { throw new IllegalStateException("Multiple " + ValueMimicRecorder.class.getSimpleName() + "s (usually " + ValueSelector.class.getSimpleName() + "s) have the same id (" + id + ")."); } } public ValueMimicRecorder getValueMimicRecorder(String id) { return valueMimicRecorderMap.get(id); } @Override public String toString() { return getClass().getSimpleName() + "(" + environmentMode + ")"; } }