@Override
    public DataSourceProvenance getProvenance() {
        return new DemoLabelDataSourceProvenance(this);
    }
@Test
    public void testNoisyInterlockingCrescents() {
        // Check zero samples throws
        assertThrows(PropertyException.class, () -> new NoisyInterlockingCrescentsDataSource(0, 1, 0.1));
        // Check invalid variance throws
        assertThrows(PropertyException.class, () -> new NoisyInterlockingCrescentsDataSource(200, 1, -0.1));
        assertThrows(PropertyException.class, () -> new NoisyInterlockingCrescentsDataSource(200, 1, 0.0));

        // Check valid parameters work
        NoisyInterlockingCrescentsDataSource source = new NoisyInterlockingCrescentsDataSource(200, 1, 0.1);
        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());
    }