001package javax.visrec.ml.classification;
002
003import javax.visrec.spi.ServiceProvider;
004
005/**
006 * Builder to create @{link Classifier}
007 *
008 * @author Kevin Berendsen
009 * @since 1.0
010 */
011public abstract class ClassifierBuilder {
012
013    protected ClassifierBuilder() {
014        // Prevent instantiation outside of subclasses.
015    }
016
017    /**
018     * Creates a new instance of the builder.
019     * @return the builder
020     */
021    public static ClassifierBuilder newBuilder() {
022        return ServiceProvider.current().getBuilderService().newClassifierBuilder();
023    }
024
025    /**
026     * Set the trained model to be used during the image classification.
027     *
028     * TODO Add the proper class to the method signature.
029     *
030     * @param trainedModel the object of the trained model.
031     * @return current builder instance
032     */
033    public abstract ClassifierBuilder trainedModel(Object trainedModel);
034
035    /**
036     * Create the {@link Classifier} that is able to use {@code sourceClss} as input/source type and
037     * {@code returnCls} as return type of the {@link Classifier}
038     *
039     * @param sourceCls {@link Class} object of the incoming input/source.
040     * @param returnCls {@link Class} object of the return type of the {@link Classifier}
041     * @param <T> source type class of the {@link Classifier}
042     * @param <R> return type class of the {@link Classifier}
043     * @return {@link Classifier} object.
044     */
045    public abstract <T, R> Classifier<T, R> buildWithSourceType(final Class<T> sourceCls, final Class<R> returnCls);
046
047    /**
048     * Create the {@link Classifier} that is able to use {@code sourceClss} as input/source type and
049     * {@link String} as default return type of the {@link Classifier}
050     *
051     * @param sourceCls {@link Class} object of the incoming input/source.
052     * @param <T> source type class of the {@link Classifier}
053     * @return {@link Classifier} object.
054     */
055    public final <T> Classifier<T, String> buildWithSourceType(final Class<T> sourceCls) {
056        return buildWithSourceType(sourceCls, String.class);
057    }
058}