/* Copyright 2009-2016 David Hadka * * This file is part of the MOEA Framework. * * The MOEA Framework is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * The MOEA Framework is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the MOEA Framework. If not, see <http://www.gnu.org/licenses/>. */ package org.moeaframework.core.spi; import org.moeaframework.core.NondominatedPopulation; import org.moeaframework.core.Problem; /** * Defines an SPI for instantiation optimization problems. Problems are * identified by a unique name. The methods of the provider must return {@code * null} if the problem is not supported by the provider. * <p> * If the provider can supply the problem but an error occurred during * instantiation, the provider may throw a {@link ProviderNotFoundException} * along with the details causing the exception. * <p> * To provide a custom {@code ProblemProvider}, first extend this class and * implement the two abstract methods. Next, build a JAR file containing the * custom provider. Within the JAR file, create the file * {@code META-INF/services/org.moeaframework.core.spi.ProblemProvider} * containing on a single line the class name of the custom provider. Lastly, * add this JAR file to the classpath. Once these steps are completed, the * problem(s) are now accessible via the * {@link ProblemFactory#getProblem(String)} and * {@link ProblemFactory#getReferenceSet(String)} methods. * <p> * As problems names are often used in file names, it is best to avoid * characters which are not compatible with the file system. It is suggested * that names match the following regular expression: * {@code ^[a-zA-Z0-9()\-,]+$}. */ public abstract class ProblemProvider { /** * Constructs a problem provider. */ public ProblemProvider() { super(); } /** * Returns the problem with the specified name, or {@code null} if this * provider does not support the problem. * * @param name the problem name * @return the problem with the specified name, or {@code null} if this * provider does not support the problem */ public abstract Problem getProblem(String name); /** * Returns the reference set for the specified problem, or {@code null} if * this provider does not support the problem or no reference set is * available. * * @param name the problem name * @return the reference set for the specified problem, or {@code null} if * this provider does not support the problem or no reference set * is available */ public abstract NondominatedPopulation getReferenceSet(String name); }