class MvDDetector extends MvDDetectorAlgorithm implements MultivaluedDependencyAlgorithm, 			// Defines the type of the algorithm, i.e., the result type, for instance, FunctionalDependencyAlgorithm or InclusionDependencyAlgorithm; implementing multiple types is possible
						  			 RelationalInputParameterAlgorithm,	// Defines the input type of the algorithm; relational input is any relational input from files or databases; more specific input specifications are possible
						  			 BooleanParameterAlgorithm,
						  			 IntegerParameterAlgorithm {

	@Override
	public ArrayList<ConfigurationRequirement<?>> getConfigurationRequirements() { // Tells Metanome which and how many parameters the algorithm needs
		ArrayList<ConfigurationRequirement<?>> conf = new ArrayList<>();
		conf.add(new ConfigurationRequirementRelationalInput(MvDDetector.Identifier.INPUT_GENERATOR.name()));

		
		ConfigurationRequirementInteger pruningType = new ConfigurationRequirementInteger(MvDDetector.Identifier.PRUNING_TYPE.name());
		Integer[] defaultPruningType = new Integer[1];
		defaultPruningType[0] = Integer.valueOf(5);
		pruningType.setDefaultValues(defaultPruningType);
		pruningType.setRequired(true);
		conf.add(pruningType);
		
//		ConfigurationRequirementInteger maxLhsSize = new ConfigurationRequirementInteger(MvDDetector.Identifier.MAX_LHS_SIZE.name());
//		Integer[] defaultMaxLhsSize = new Integer[1];
//		defaultMaxLhsSize[0] = Integer.valueOf(-1);
//		maxLhsSize.setDefaultValues(defaultMaxLhsSize);
//		maxLhsSize.setRequired(true);
//		conf.add(maxLhsSize);

		ConfigurationRequirementBoolean removeDuplicates = new ConfigurationRequirementBoolean(MvDDetector.Identifier.REMOVE_DUPLICATES.name());
		Boolean[] defaultRemoveDuplicates = new Boolean[1];
		defaultRemoveDuplicates[0] = Boolean.valueOf(true);
		removeDuplicates.setDefaultValues(defaultRemoveDuplicates);
		removeDuplicates.setRequired(true);
		conf.add(removeDuplicates);
		
		ConfigurationRequirementBoolean markUniqueValues = new ConfigurationRequirementBoolean(MvDDetector.Identifier.MARK_UNIQUE_VALUES.name());
		Boolean[] defaultMarkUniqueValues = new Boolean[1];
		defaultMarkUniqueValues[0] = Boolean.valueOf(true);
		markUniqueValues.setDefaultValues(defaultMarkUniqueValues);
		markUniqueValues.setRequired(true);
		conf.add(markUniqueValues);
		
		ConfigurationRequirementBoolean convertToIntTuples = new ConfigurationRequirementBoolean(MvDDetector.Identifier.CONVERT_TO_INT_TUPLES.name());
		Boolean[] defaultConvertToIntTuples = new Boolean[1];
		defaultConvertToIntTuples[0] = Boolean.valueOf(true);
		convertToIntTuples.setDefaultValues(defaultConvertToIntTuples);
		convertToIntTuples.setRequired(true);
		conf.add(convertToIntTuples);
		
		ConfigurationRequirementBoolean usePLIs = new ConfigurationRequirementBoolean(MvDDetector.Identifier.USE_PLIS.name());
		Boolean[] defaultUsePLIs = new Boolean[1];
		defaultUsePLIs[0] = Boolean.valueOf(true);
		usePLIs.setDefaultValues(defaultUsePLIs);
		usePLIs.setRequired(true);
		conf.add(usePLIs);
		
		return conf;
	}

}