/* * 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.examples; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.deidentifier.arx.ARXLattice.ARXNode; import org.deidentifier.arx.ARXResult; import org.deidentifier.arx.Data; import org.deidentifier.arx.DataHandle; /** * This class provides a base class for examples. * * @author Fabian Prasser * @author Florian Kohlmayer */ public abstract class Example { /** * Prints a given data handle. * * @param handle */ protected static void print(DataHandle handle) { final Iterator<String[]> itHandle = handle.iterator(); print(itHandle); } /** * Prints a given iterator. * * @param iterator */ protected static void print(Iterator<String[]> iterator) { while (iterator.hasNext()) { System.out.print(" "); System.out.println(Arrays.toString(iterator.next())); } } /** * Prints java array. * * @param array */ protected static void printArray(String[][] array) { System.out.print("{"); for (int j=0; j<array.length; j++){ String[] next = array[j]; System.out.print("{"); for (int i = 0; i < next.length; i++) { String string = next[i]; System.out.print("\"" + string + "\""); if (i < next.length - 1) { System.out.print(","); } } System.out.print("}"); if (j<array.length-1) { System.out.print(",\n"); } } System.out.println("}"); } /** * Prints a given data handle. * * @param handle */ protected static void printHandle(DataHandle handle) { final Iterator<String[]> itHandle = handle.iterator(); printIterator(itHandle); } /** * Prints java array. * * @param iterator */ protected static void printIterator(Iterator<String[]> iterator) { while (iterator.hasNext()) { String[] next = iterator.next(); System.out.print("["); for (int i = 0; i < next.length; i++) { String string = next[i]; System.out.print(string); if (i < next.length - 1) { System.out.print(", "); } } System.out.println("]"); } } /** * Prints the result. * * @param result * @param data */ protected static void printResult(final ARXResult result, final Data data) { // Print time final DecimalFormat df1 = new DecimalFormat("#####0.00"); final String sTotal = df1.format(result.getTime() / 1000d) + "s"; System.out.println(" - Time needed: " + sTotal); // Extract final ARXNode optimum = result.getGlobalOptimum(); final List<String> qis = new ArrayList<String>(data.getDefinition().getQuasiIdentifyingAttributes()); if (optimum == null) { System.out.println(" - No solution found!"); return; } // Initialize final StringBuffer[] identifiers = new StringBuffer[qis.size()]; final StringBuffer[] generalizations = new StringBuffer[qis.size()]; int lengthI = 0; int lengthG = 0; for (int i = 0; i < qis.size(); i++) { identifiers[i] = new StringBuffer(); generalizations[i] = new StringBuffer(); identifiers[i].append(qis.get(i)); generalizations[i].append(optimum.getGeneralization(qis.get(i))); if (data.getDefinition().isHierarchyAvailable(qis.get(i))) generalizations[i].append("/").append(data.getDefinition().getHierarchy(qis.get(i))[0].length - 1); lengthI = Math.max(lengthI, identifiers[i].length()); lengthG = Math.max(lengthG, generalizations[i].length()); } // Padding for (int i = 0; i < qis.size(); i++) { while (identifiers[i].length() < lengthI) { identifiers[i].append(" "); } while (generalizations[i].length() < lengthG) { generalizations[i].insert(0, " "); } } // Print System.out.println(" - Information loss: " + result.getGlobalOptimum().getLowestScore() + " / " + result.getGlobalOptimum().getHighestScore()); System.out.println(" - Optimal generalization"); for (int i = 0; i < qis.size(); i++) { System.out.println(" * " + identifiers[i] + ": " + generalizations[i]); } System.out.println(" - Statistics"); System.out.println(result.getOutput(result.getGlobalOptimum(), false).getStatistics().getEquivalenceClassStatistics()); } }