/*
* 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.gui.model;
import org.deidentifier.arx.criteria.AverageReidentificationRisk;
import org.deidentifier.arx.criteria.PopulationUniqueness;
import org.deidentifier.arx.criteria.PrivacyCriterion;
import org.deidentifier.arx.criteria.SampleUniqueness;
import org.deidentifier.arx.gui.resources.Resources;
import org.deidentifier.arx.gui.view.SWTUtil;
import org.deidentifier.arx.risk.RiskModelPopulationUniqueness.PopulationUniquenessModel;
/**
* This class implements a model for risk-based criteria
*
* @author Fabian Prasser
*/
public class ModelRiskBasedCriterion extends ModelImplicitCriterion{
/** SVUID*/
private static final long serialVersionUID = -3653781193588952725L;
/** Threshold */
private double threshold = 0.01d;
/** Variant. */
public static final int VARIANT_AVERAGE_RISK = 0;
/** Variant. */
public static final int VARIANT_SAMPLE_UNIQUES = 1;
/** Variant. */
public static final int VARIANT_POPULATION_UNIQUES_DANKAR = 2;
/** Variant. */
public static final int VARIANT_POPULATION_UNIQUES_PITMAN = 3;
/** Variant. */
public static final int VARIANT_POPULATION_UNIQUES_ZAYATZ = 4;
/** Variant. */
public static final int VARIANT_POPULATION_UNIQUES_SNB = 5;
/** The variant to use. */
private int variant = 0;
/**
* Creates a new instance
* @param variant
*/
public ModelRiskBasedCriterion(int variant) {
this.variant = variant;
}
/**
* Creates a new instance
* @param variant
* @param threshold
*/
public ModelRiskBasedCriterion(int variant,
double threshold) {
this.variant = variant;
this.threshold = threshold;
}
@Override
public ModelRiskBasedCriterion clone() {
ModelRiskBasedCriterion result = new ModelRiskBasedCriterion(this.variant);
result.threshold = this.threshold;
result.variant = this.variant;
result.setEnabled(this.isEnabled());
return result;
}
@Override
public PrivacyCriterion getCriterion(Model model) {
switch (variant) {
case VARIANT_AVERAGE_RISK:
return new AverageReidentificationRisk(threshold);
case VARIANT_POPULATION_UNIQUES_DANKAR:
return getPopulationBasedCriterion(PopulationUniquenessModel.DANKAR, model);
case VARIANT_POPULATION_UNIQUES_PITMAN:
return getPopulationBasedCriterion(PopulationUniquenessModel.PITMAN, model);
case VARIANT_POPULATION_UNIQUES_SNB:
return getPopulationBasedCriterion(PopulationUniquenessModel.SNB, model);
case VARIANT_POPULATION_UNIQUES_ZAYATZ:
return getPopulationBasedCriterion(PopulationUniquenessModel.ZAYATZ, model);
case VARIANT_SAMPLE_UNIQUES:
return new SampleUniqueness(threshold);
default:
throw new RuntimeException(Resources.getMessage("Model.0b")); //$NON-NLS-1$
}
}
@Override
public String getLabel() {
switch (variant) {
case VARIANT_AVERAGE_RISK:
return Resources.getMessage("Model.1a"); //$NON-NLS-1$
case VARIANT_POPULATION_UNIQUES_DANKAR:
case VARIANT_POPULATION_UNIQUES_PITMAN:
case VARIANT_POPULATION_UNIQUES_SNB:
case VARIANT_POPULATION_UNIQUES_ZAYATZ:
return Resources.getMessage("Model.21"); //$NON-NLS-1$
case VARIANT_SAMPLE_UNIQUES:
return Resources.getMessage("Model.6a"); //$NON-NLS-1$
default:
throw new RuntimeException(Resources.getMessage("Model.7a")); //$NON-NLS-1$
}
}
/**
* Returns the threshold.
*
* @return
*/
public double getThreshold() {
return threshold;
}
/**
* Returns the variant
* @return
*/
public int getVariant() {
return this.variant;
}
@Override
public void parse(ModelCriterion criterion, boolean _default) {
if (!(criterion instanceof ModelRiskBasedCriterion)) {
return;
}
ModelRiskBasedCriterion other = (ModelRiskBasedCriterion)criterion;
this.threshold = other.threshold;
this.variant = other.variant;
if (!_default) {
this.setEnabled(other.isEnabled());
}
}
/**
* Sets the threshold.
*
* @param k
*/
public void setThreshold(double threshold) {
this.threshold = threshold;
}
/**
* Sets the variant.
*
* @param variant
*/
public void setVariant(int variant) {
this.variant = variant;
}
@Override
public String toString() {
switch (variant) {
case VARIANT_AVERAGE_RISK:
return Resources.getMessage("Model.8a") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.9a"); //$NON-NLS-1$ //$NON-NLS-2$
case VARIANT_POPULATION_UNIQUES_DANKAR:
return Resources.getMessage("Model.10a") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.11"); //$NON-NLS-1$ //$NON-NLS-2$
case VARIANT_POPULATION_UNIQUES_PITMAN:
return Resources.getMessage("Model.12") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.13"); //$NON-NLS-1$ //$NON-NLS-2$
case VARIANT_POPULATION_UNIQUES_SNB:
return Resources.getMessage("Model.14") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.15"); //$NON-NLS-1$ //$NON-NLS-2$
case VARIANT_POPULATION_UNIQUES_ZAYATZ:
return Resources.getMessage("Model.16") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.17"); //$NON-NLS-1$ //$NON-NLS-2$
case VARIANT_SAMPLE_UNIQUES:
return Resources.getMessage("Model.18") + SWTUtil.getPrettyString(threshold) + Resources.getMessage("Model.19"); //$NON-NLS-1$ //$NON-NLS-2$
default:
throw new RuntimeException(Resources.getMessage("Model.20")); //$NON-NLS-1$
}
}
/**
* Returns a population-based criterion for the given models
* @param statisticalModel
* @param model
* @return
*/
private PrivacyCriterion getPopulationBasedCriterion(PopulationUniquenessModel statisticalModel, Model model) {
ModelRisk riskModel = model.getRiskModel();
return new PopulationUniqueness(threshold,
statisticalModel,
riskModel.getPopulationModel().clone(),
riskModel.getSolverConfiguration());
}
}