public Model<T> reproduceFromProvenance() throws ClassNotFoundException {

        // Until now the object only holds the configuration for these objects, the following
        // functions will actually re-instantiate them.
        Trainer<T> newTrainer = recoverTrainer();

        Dataset<T> newDataset = recoverDataset();

        // Exposing the configuration manager means there could be an edge case were
        // the invocation count is changed before the model is trained.
        // Pass through a desired invocation count to prevent this behavior
        // TODO: does not apply to inner trainers, figure out how to address this or if it needs to be addressed
        int trainedInvocationCount = (int) this.modelProvenance
                .getTrainerProvenance()
                .getInstanceValues()
                .get("train-invocation-count")
                .getValue();

        // This function actually re-trains a model rather than copy the original
        return newTrainer.train(newDataset);
    }
@Test
    public void testReproduceFromProvenanceNoSplitter() throws URISyntaxException, ClassNotFoundException {
        CSVDataSource<Label> csvSource = getCSVDataSource();
        MutableDataset<Label> datasetFromCSV = new MutableDataset<>(csvSource);

        LogisticRegressionTrainer trainer = new LogisticRegressionTrainer();
        LinearSGDModel model = (LinearSGDModel) trainer.train(datasetFromCSV);
        model = (LinearSGDModel) trainer.train(datasetFromCSV);
        model = (LinearSGDModel) trainer.train(datasetFromCSV);

        ReproUtil<Label> reproUtil = new ReproUtil<>(model.getProvenance(),Label.class);
        LinearSGDModel newModel = (LinearSGDModel) reproUtil.reproduceFromProvenance();

        assertEquals(newModel.getWeightsCopy(), model.getWeightsCopy());
    }