/*******************************************************************************
* 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.core;
import java.lang.reflect.Constructor;
import java.util.List;
import com.analog.lyric.collect.ConstructorRegistry;
import com.analog.lyric.dimple.environment.DimpleEnvironment;
import com.analog.lyric.dimple.solvers.gibbs.GibbsSolver;
import com.analog.lyric.dimple.solvers.interfaces.IFactorGraphFactory;
import com.analog.lyric.dimple.solvers.junctiontree.JunctionTreeSolver;
import com.analog.lyric.dimple.solvers.junctiontreemap.JunctionTreeMAPSolver;
import com.analog.lyric.dimple.solvers.lp.LPSolver;
import com.analog.lyric.dimple.solvers.minsum.MinSumSolver;
import com.analog.lyric.dimple.solvers.particleBP.ParticleBPSolver;
import com.analog.lyric.dimple.solvers.sumproduct.SumProductSolver;
import com.analog.lyric.util.misc.Internal;
/**
* Registry of known {@link IFactorGraphFactory} implementations, i.e. Dimple solvers.
* <p>
* Supports lookup and instantiation of solvers by class name. This is primarily for use
* in supporting dynamic language API's (e.g. MATLAB).
* <p>
* @since 0.07
* @author Christopher Barber
*/
public class DimpleSolverRegistry extends ConstructorRegistry<IFactorGraphFactory<?>>
{
/*--------------
* Construction
*/
/**
* For internal use. Users should instead use {@link DimpleEnvironment#solvers}.
* @since 0.07
*/
@Internal
public DimpleSolverRegistry()
{
super(IFactorGraphFactory.class);
addClass(GibbsSolver.class);
addClass(JunctionTreeSolver.class);
addClass(JunctionTreeMAPSolver.class);
addClass(LPSolver.class);
addClass(MinSumSolver.class);
addClass(ParticleBPSolver.class);
addClass(SumProductSolver.class);
}
/*
*
*/
/**
* {@inheritDoc}
* <p>
* This extends the default behavior by appending "Solver" to the end of the name if no match
* is found using the original argument.
*/
@Override
public List<Constructor<IFactorGraphFactory<?>>> getAll(String className)
{
List<Constructor<IFactorGraphFactory<?>>> constructors = super.getAll(className);
if (constructors.isEmpty())
{
String name = className;
if (!name.endsWith("Solver"))
{
// Try again with name appended with "Solver"
constructors = super.getAll(name + "Solver");
}
}
return constructors;
}
}