/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.deidentifier.arx.metric;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.deidentifier.arx.metric.Metric.AggregateFunction;
/**
* A class describing a metric and its configuration options.
*
* @author Fabian Prasser
*/
public abstract class MetricDescription implements Serializable {
/** SVUID. */
private static final long serialVersionUID = -2774981286637344244L;
/** Name. */
private final String name;
/** Monotonic variant supported. */
private final boolean monotonicVariantSupported;
/** Attribute weights supported. */
private final boolean attributeWeightsSupported;
/** Configurable coding model supported. */
private final boolean configurableCodingModelSupported;
/** Pre-computation supported. */
private final boolean precomputationSupported;
/** Aggregate functions supported. */
private final boolean aggregateFunctionSupported;
/** Are different attacker models supported. */
private final boolean attackerModelSupported;
/**
* Creates a new description.
*
* @param name
* @param monotonicVariantSupported
* @param attributeWeightsSupported
* @param configurableCodingModelSupported
* @param precomputationSupported
* @param aggregateFunctionSupported
* @param attackerModelSupported
*/
MetricDescription(String name,
boolean monotonicVariantSupported,
boolean attributeWeightsSupported,
boolean configurableCodingModelSupported,
boolean precomputationSupported,
boolean aggregateFunctionSupported,
boolean attackerModelSupported) {
this.name = name;
this.monotonicVariantSupported = monotonicVariantSupported;
this.attributeWeightsSupported = attributeWeightsSupported;
this.configurableCodingModelSupported = configurableCodingModelSupported;
this.precomputationSupported = precomputationSupported;
this.aggregateFunctionSupported = aggregateFunctionSupported;
this.attackerModelSupported = attackerModelSupported;
}
/**
* Creates an instance with the given configuration options.
*
* @param config
* @return
*/
public abstract Metric<?> createInstance(MetricConfiguration config);
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* Returns a list of all supported aggregate functions.
*
* @return
*/
public List<Metric.AggregateFunction> getSupportedAggregateFunctions() {
if (!aggregateFunctionSupported) {
return new ArrayList<Metric.AggregateFunction>(0);
} else {
return Arrays.asList(new Metric.AggregateFunction[] { AggregateFunction.SUM,
AggregateFunction.MAXIMUM,
AggregateFunction.ARITHMETIC_MEAN,
AggregateFunction.GEOMETRIC_MEAN,
AggregateFunction.RANK });
}
}
/**
* Returns whether an aggregate function is supported by the metric.
*
* @return
*/
public boolean isAggregateFunctionSupported() {
return aggregateFunctionSupported;
}
/**
* @return the attackerModelSupported
*/
public boolean isAttackerModelSupported() {
return attackerModelSupported;
}
/**
* @return the attributeWeightsSupported
*/
public boolean isAttributeWeightsSupported() {
return attributeWeightsSupported;
}
/**
* @return the configurableCodingModelSupported
*/
public boolean isConfigurableCodingModelSupported() {
return configurableCodingModelSupported;
}
/**
* Returns whether the given metric is an instance of this description.
*
* @param metric
* @return
*/
public abstract boolean isInstance(Metric<?> metric);
/**
* @return the monotonicVariantSupported
*/
public boolean isMonotonicVariantSupported() {
return monotonicVariantSupported;
}
/**
* @return the precomputationSupported
*/
public boolean isPrecomputationSupported() {
return precomputationSupported;
}
}