@Override
    public DataSourceProvenance getProvenance() {
        return new DemoLabelDataSourceProvenance(this);
    }
@Test
    public void testGaussianGenerator() {
        double[] firstMean = new double[]{0.0, 0.0};
        double[] firstCovariance = new double[]{1.0, 0.1, 0.1, 1.0};
        double[] secondMean = new double[]{1.0, 1.0};
        double[] secondCovariance = new double[]{1.0, 0.5, 0.5, 1.0};
        // Check zero samples throws
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(0, 1, firstMean, firstCovariance, secondMean, secondCovariance));
        // Check invalid mean throws
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, new double[]{0.0}, firstCovariance, secondMean, secondCovariance));
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, firstMean, firstCovariance, new double[]{0.0, 0.0, 0.0}, secondCovariance));
        // Check invalid covariance throws
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, firstMean, new double[]{0.1}, secondMean, secondCovariance));
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, firstMean, firstCovariance, secondMean, new double[]{0.1}));
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, new double[]{0.1, 0.0, 1.0, 0.1}, firstCovariance, secondMean, secondCovariance));
        assertThrows(PropertyException.class, () -> new GaussianLabelDataSource(200, 1, firstMean, firstCovariance, secondMean, new double[]{0.1, 0.0, 0.0, -1.0}));

        // Check valid parameters work
        GaussianLabelDataSource source = new GaussianLabelDataSource(200, 1, firstMean, firstCovariance, secondMean, secondCovariance);
        assertEquals(200, source.examples.size());
        Dataset<Label> dataset = new MutableDataset<>(source);
        Map<String, Long> map = new HashMap<>();
        dataset.getOutputInfo().outputCountsIterable().forEach((p) -> map.put(p.getA(), p.getB()));
        assertEquals(100, map.get("X"));
        assertEquals(100, map.get("O"));
        Helpers.testProvenanceMarshalling(source.getProvenance());
    }