/* * 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.risk; import java.io.Serializable; import org.deidentifier.arx.ARXCostBenefitConfiguration; /** * This class implements a cost/benefit analysis following the game-theoretic approach proposed in: <br> * * A Game Theoretic Framework for Analyzing Re-Identification Risk. * Zhiyu Wan, Yevgeniy Vorobeychik, Weiyi Xia, Ellen Wright Clayton, * Murat Kantarcioglu, Ranjit Ganta, Raymond Heatherly, Bradley A. Malin * PLOS|ONE. 2015. * * @author Fabian Prasser */ public class RiskModelCostBenefit implements Serializable { /** SVUID */ private static final long serialVersionUID = -6124431335607475931L; /** The underlying configuration */ private final ARXCostBenefitConfiguration config; /** * Creates a new instance * @param configuration */ public RiskModelCostBenefit(ARXCostBenefitConfiguration configuration) { this.config = configuration; } /** * Returns the expected adversary payout * @param successProbability * @return */ public double getExpectedAdversaryPayout(double successProbability) { checkArgument(successProbability); return config.getAdversaryGain() * successProbability - config.getAdversaryCost(); } /** * Returns the expected information loss * @param informationLoss * @return */ public double getExpectedPublisherBenefit(double informationLoss) { checkArgument(informationLoss); return config.getPublisherBenefit() * (1d - informationLoss); } /** * Returns the expected publisher payout * @param informationLoss * @param adversarySuccessProbability * @return */ public double getExpectedPublisherPayout(double informationLoss, double adversarySuccessProbability ) { // Arguments will be checked in subsequent method calls return getExpectedPublisherBenefit(informationLoss) - (getExpectedAdversaryPayout(adversarySuccessProbability) > 0 ? config.getPublisherLoss() * adversarySuccessProbability : 0); } /** * Checks the provided argument * @param argument */ private void checkArgument(double argument) { if (argument < 0d || argument > 1d) { throw new IllegalArgumentException("Argument out of range [0,1]: " + argument); } } }