/*
* 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());
}
}