blob: 41edec02eb2b09f4e604f4a39d57d762625f9e35 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.sysds.test.functions.privacy.propagation;
import org.apache.sysds.runtime.instructions.cp.Data;
import org.apache.sysds.runtime.instructions.cp.DoubleObject;
import org.apache.sysds.runtime.instructions.cp.IntObject;
import org.apache.sysds.runtime.instructions.cp.ListObject;
import org.apache.sysds.runtime.instructions.cp.ScalarObject;
import org.apache.sysds.runtime.matrix.data.MatrixBlock;
import org.apache.sysds.runtime.meta.MatrixCharacteristics;
import org.apache.sysds.runtime.privacy.PrivacyConstraint;
import org.apache.sysds.runtime.privacy.PrivacyConstraint.PrivacyLevel;
import org.apache.sysds.runtime.privacy.finegrained.DataRange;
import org.apache.sysds.runtime.privacy.propagation.AppendPropagator;
import org.apache.sysds.runtime.privacy.propagation.CBindPropagator;
import org.apache.sysds.runtime.privacy.propagation.ListAppendPropagator;
import org.apache.sysds.runtime.privacy.propagation.ListRemovePropagator;
import org.apache.sysds.runtime.privacy.propagation.Propagator;
import org.apache.sysds.runtime.privacy.propagation.PropagatorMultiReturn;
import org.apache.sysds.runtime.privacy.propagation.RBindPropagator;
import org.apache.sysds.test.AutomatedTestBase;
import org.apache.sysds.test.TestConfiguration;
import org.apache.sysds.test.TestUtils;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class AppendPropagatorTest extends AutomatedTestBase {
private final static String TEST_DIR = "functions/privacy/";
private final static String TEST_NAME_RBIND = "RBindTest";
private final static String TEST_NAME_CBIND = "CBindTest";
private final static String TEST_NAME_STRING = "StringAppendTest";
private final static String TEST_NAME_LIST = "ListAppendTest";
private final static String TEST_CLASS_DIR = TEST_DIR + AppendPropagatorTest.class.getSimpleName() + "/";
@Override public void setUp() {
TestUtils.clearAssertionInformation();
addTestConfiguration(TEST_NAME_RBIND, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME_RBIND, new String[] {"C"}));
addTestConfiguration(TEST_NAME_CBIND, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME_CBIND, new String[] {"C"}));
addTestConfiguration(TEST_NAME_STRING, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME_STRING, new String[] {"C"}));
addTestConfiguration(TEST_NAME_LIST, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME_LIST, new String[] {"C"}));
}
@Test
public void generalOnlyRBindPrivate1Test(){
generalOnlyRBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint());
}
@Test
public void generalOnlyRBindPrivateAggregation1Test(){
generalOnlyRBindTest(new PrivacyConstraint(PrivacyLevel.PrivateAggregation), new PrivacyConstraint());
}
@Test
public void generalOnlyRBindNoneTest(){
generalOnlyRBindTest(new PrivacyConstraint(), new PrivacyConstraint());
}
@Test
public void generalOnlyRBindPrivate2Test(){
generalOnlyRBindTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyRBindPrivateAggregation2Test(){
generalOnlyRBindTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyRBindPrivatePrivateTest(){
generalOnlyRBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyRBindPrivatePrivateAggregationTest(){
generalOnlyRBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyCBindPrivate1Test(){
generalOnlyCBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint());
}
@Test
public void generalOnlyCBindPrivateAggregation1Test(){
generalOnlyCBindTest(new PrivacyConstraint(PrivacyLevel.PrivateAggregation), new PrivacyConstraint());
}
@Test
public void generalOnlyCBindNoneTest(){
generalOnlyCBindTest(new PrivacyConstraint(), new PrivacyConstraint());
}
@Test
public void generalOnlyCBindPrivate2Test(){
generalOnlyCBindTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyCBindPrivateAggregation2Test(){
generalOnlyCBindTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyCBindPrivatePrivateTest(){
generalOnlyCBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyCBindPrivatePrivateAggregationTest(){
generalOnlyCBindTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyListAppendPrivate1Test(){
generalOnlyListAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint());
}
@Test
public void generalOnlyListAppendPrivateAggregation1Test(){
generalOnlyCBindTest(new PrivacyConstraint(PrivacyLevel.PrivateAggregation), new PrivacyConstraint());
}
@Test
public void generalOnlyListAppendNoneTest(){
generalOnlyListAppendTest(new PrivacyConstraint(), new PrivacyConstraint());
}
@Test
public void generalOnlyListAppendPrivate2Test(){
generalOnlyListAppendTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyListAppendPrivateAggregation2Test(){
generalOnlyListAppendTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyListAppendPrivatePrivateTest(){
generalOnlyListAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.Private));
}
@Test
public void generalOnlyListAppendPrivatePrivateAggregationTest(){
generalOnlyListAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.PrivateAggregation));
}
@Test
public void generalOnlyListRemoveAppendPrivate1Test(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(),
PrivacyLevel.Private, PrivacyLevel.Private);
}
@Test
public void generalOnlyListRemoveAppendPrivateAggregation1Test(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(PrivacyLevel.PrivateAggregation), new PrivacyConstraint(),
PrivacyLevel.PrivateAggregation, PrivacyLevel.PrivateAggregation);
}
@Test
public void generalOnlyListRemoveAppendNoneTest(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(), new PrivacyConstraint(),
PrivacyLevel.None, PrivacyLevel.None);
}
@Test
public void generalOnlyListRemoveAppendPrivate2Test(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.Private),
PrivacyLevel.Private, PrivacyLevel.Private);
}
@Test
public void generalOnlyListRemoveAppendPrivateAggregation2Test(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(), new PrivacyConstraint(PrivacyLevel.PrivateAggregation),
PrivacyLevel.PrivateAggregation, PrivacyLevel.PrivateAggregation);
}
@Test
public void generalOnlyListRemoveAppendPrivatePrivateTest(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.Private),
PrivacyLevel.Private, PrivacyLevel.Private);
}
@Test
public void generalOnlyListRemoveAppendPrivatePrivateAggregationTest(){
generalOnlyListRemoveAppendTest(new PrivacyConstraint(PrivacyLevel.Private), new PrivacyConstraint(PrivacyLevel.PrivateAggregation),
PrivacyLevel.Private, PrivacyLevel.Private);
}
@Test
public void finegrainedRBindPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedRBindPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedRBindPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedRBindPrivateAndPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedRBindPrivate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedRBindPrivateAndPrivateAggregate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{2,0}), PrivacyLevel.PrivateAggregation);
finegrainedRBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivateAndPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedCBindPrivateAndPrivateAggregate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{2,0}), PrivacyLevel.PrivateAggregation);
finegrainedCBindTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{3},new long[]{5}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivateAndPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{3},new long[]{5}), PrivacyLevel.PrivateAggregation);
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{4}), PrivacyLevel.Private);
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void finegrainedListAppendPrivateAndPrivateAggregate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{0},new long[]{0}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2},new long[]{3}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{0},new long[]{1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{3},new long[]{5}), PrivacyLevel.PrivateAggregation);
finegrainedListAppendTest(constraint1, constraint2);
}
@Test
public void testFunction(){
int dataLength = 9;
List<Data> dataList = new ArrayList<>();
for ( int i = 0; i < dataLength; i++)
dataList.add(new DoubleObject(i));
ListObject l = new ListObject(dataList);
ListObject lCopy = l.copy();
int position = 4;
ListObject output = l.remove(position);
Assert.assertEquals(lCopy.getData(position), output.getData().get(0));
}
@Test
public void finegrainedListRemoveAppendNone1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.None);
}
@Test
public void finegrainedListRemoveAppendPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{6}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.Private);
}
@Test
public void finegrainedListRemoveAppendPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{6}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.Private);
}
@Test
public void finegrainedListRemoveAppendPrivate3(){
PrivacyConstraint constraint1 = new PrivacyConstraint(PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{6}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.Private);
}
@Test
public void finegrainedListRemoveAppendPrivate4(){
PrivacyConstraint constraint1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{4},new long[]{4}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.Private, true);
}
@Test
public void finegrainedListRemoveAppendPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1},new long[]{2}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{3},new long[]{5}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.PrivateAggregation);
}
@Test
public void finegrainedListRemoveAppendPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{5},new long[]{8}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
finegrainedListRemoveAppendTest(constraint1, constraint2, PrivacyLevel.PrivateAggregation);
}
@Test
public void integrationRBindTestNoneNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint(PrivacyLevel.None);
integrationRBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationRBindTestPrivateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0}, new long[]{19,9}), PrivacyLevel.Private);
integrationRBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationRBindTestPrivateAggregateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0}, new long[]{19,9}), PrivacyLevel.PrivateAggregation);
integrationRBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationRBindTestNonePrivateAggregate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{20,0}, new long[]{49, 9}), PrivacyLevel.PrivateAggregation);
integrationRBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationRBindTestNonePrivate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{20,0}, new long[]{49, 9}), PrivacyLevel.Private);
integrationRBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationFinegrainedRBindPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
integrationRBindTest(constraint1, constraint2, constraint1);
}
@Test
public void integrationFinegrainedRBindPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
integrationRBindTest(constraint1, constraint2, constraint1);
}
@Test
public void integrationFinegrainedRBindPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint pcExcepted = new PrivacyConstraint();
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{21,0}, new long[]{21,1}), PrivacyLevel.Private);
integrationRBindTest(constraint1, constraint2, pcExcepted);
}
@Test
public void integrationFinegrainedRBindPrivateAndPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExcepted = new PrivacyConstraint();
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{21,0},new long[]{21,1}), PrivacyLevel.Private);
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{22,0}, new long[]{23,1}), PrivacyLevel.PrivateAggregation);
integrationRBindTest(constraint1, constraint2, pcExcepted);
}
@Test
public void integrationFinegrainedRBindPrivate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{21,0},new long[]{21,1}), PrivacyLevel.Private);
integrationRBindTest(constraint1, constraint2, pcExpected);
}
@Test
public void integrationFinegrainedRBindPrivateAndPrivateAggregate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{2,0}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{20,0},new long[]{20,1}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0}, new long[]{3,1}), PrivacyLevel.PrivateAggregation);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{21,0}, new long[]{22,0}), PrivacyLevel.PrivateAggregation);
integrationRBindTest(constraint1, constraint2, pcExpected);
}
private void integrationRBindTest(PrivacyConstraint privacyConstraint1, PrivacyConstraint privacyConstraint2,
PrivacyConstraint expectedOutput){
TestConfiguration config = getAndLoadTestConfiguration(TEST_NAME_RBIND);
fullDMLScriptName = SCRIPT_DIR + TEST_DIR + config.getTestScript() + ".dml";
int rows1 = 20;
int rows2 = 30;
int cols = 10;
double[][] A = getRandomMatrix(rows1, cols, -10, 10, 0.5, 1);
double[][] B = getRandomMatrix(rows2, cols, -10, 10, 0.5, 1);
writeInputMatrixWithMTD("A", A, false, new MatrixCharacteristics(rows1, cols), privacyConstraint1);
writeInputMatrixWithMTD("B", B, false, new MatrixCharacteristics(rows2, cols), privacyConstraint2);
programArgs = new String[]{"-nvargs", "A=" + input("A"), "B=" + input("B"), "C=" + output("C")};
runTest(true,false,null,-1);
PrivacyConstraint outputConstraint = getPrivacyConstraintFromMetaData("C");
Assert.assertEquals(expectedOutput, outputConstraint);
}
@Test
public void integrationCBindTestNoneNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint(PrivacyLevel.None);
integrationCBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationCBindTestPrivateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0}, new long[]{9,19}), PrivacyLevel.Private);
integrationCBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationCBindTestPrivateAggregateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0}, new long[]{9,19}), PrivacyLevel.PrivateAggregation);
integrationCBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationCBindTestNonePrivateAggregate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,20}, new long[]{9, 49}), PrivacyLevel.PrivateAggregation);
integrationCBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationCBindTestNonePrivate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,20}, new long[]{9, 49}), PrivacyLevel.Private);
integrationCBindTest(pc1, pc2, pcExpected);
}
@Test
public void integrationFinegrainedCBindPrivate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
integrationCBindTest(constraint1, constraint2, constraint1);
}
@Test
public void integrationFinegrainedCBindPrivateAndPrivateAggregate1(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
integrationCBindTest(constraint1, constraint2, constraint1);
}
@Test
public void integrationFinegrainedCBindPrivate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint pcExcepted = new PrivacyConstraint();
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{1,20}, new long[]{1,21}), PrivacyLevel.Private);
integrationCBindTest(constraint1, constraint2, pcExcepted);
}
@Test
public void integrationFinegrainedCBindPrivateAndPrivateAggregate2(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExcepted = new PrivacyConstraint();
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{1,20},new long[]{1,21}), PrivacyLevel.Private);
pcExcepted.getFineGrainedPrivacy().put(new DataRange(new long[]{2,20}, new long[]{3,21}), PrivacyLevel.PrivateAggregation);
integrationCBindTest(constraint1, constraint2, pcExcepted);
}
@Test
public void integrationFinegrainedCBindPrivate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{1,1}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{1,20},new long[]{1,21}), PrivacyLevel.Private);
integrationCBindTest(constraint1, constraint2, pcExpected);
}
@Test
public void integrationFinegrainedCBindPrivateAndPrivateAggregate12(){
PrivacyConstraint constraint1 = new PrivacyConstraint();
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint1.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0},new long[]{3,1}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint constraint2 = new PrivacyConstraint();
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
constraint2.getFineGrainedPrivacy().put(new DataRange(new long[]{1,0},new long[]{2,0}), PrivacyLevel.PrivateAggregation);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,0},new long[]{0,1}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0,20},new long[]{0,21}), PrivacyLevel.Private);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{2,0}, new long[]{3,1}), PrivacyLevel.PrivateAggregation);
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{1,20}, new long[]{2,20}), PrivacyLevel.PrivateAggregation);
integrationCBindTest(constraint1, constraint2, pcExpected);
}
@Test
public void integrationStringAppendTestNoneNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
integrationStringAppendTest(pc1, pc2, pc1);
}
@Test
public void integrationStringAppendTestPrivateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
integrationStringAppendTest(pc1, pc2, pc1);
}
@Test
public void integrationStringAppendTestPrivateAggregateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
integrationStringAppendTest(pc1, pc2, pc1);
}
@Test
public void integrationStringAppendTestNonePrivateAggregate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
integrationStringAppendTest(pc1, pc2, pc2);
}
@Test
public void integrationStringAppendTestNonePrivate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.Private);
integrationStringAppendTest(pc1, pc2, pc2);
}
@Ignore
@Test
public void integrationListAppendTestNoneNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
integrationListAppendTest(pc1, pc2, pc1);
}
@Ignore
@Test
public void integrationListAppendTestPrivateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.Private);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pcExpected = new PrivacyConstraint();
pcExpected.getFineGrainedPrivacy().put(new DataRange(new long[]{0}, new long[]{0}), PrivacyLevel.Private);
integrationListAppendTest(pc1, pc2, pcExpected);
}
@Ignore
@Test
public void integrationListAppendTestPrivateAggregateNone(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.None);
integrationListAppendTest(pc1, pc2, pc1);
}
@Ignore
@Test
public void integrationListAppendTestNonePrivateAggregate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.PrivateAggregation);
integrationListAppendTest(pc1, pc2, pc2);
}
@Ignore
@Test
public void integrationListAppendTestNonePrivate(){
PrivacyConstraint pc1 = new PrivacyConstraint(PrivacyLevel.None);
PrivacyConstraint pc2 = new PrivacyConstraint(PrivacyLevel.Private);
integrationListAppendTest(pc1, pc2, pc2);
}
private static void generalOnlyRBindTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int columns = 2;
int rows1 = 4;
int rows2 = 3;
MatrixBlock inputMatrix1 = new MatrixBlock(rows1,columns,3);
MatrixBlock inputMatrix2 = new MatrixBlock(rows2,columns,4);
AppendPropagator propagator = new RBindPropagator(inputMatrix1, constraint1, inputMatrix2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Assert.assertEquals(mergedConstraint.getPrivacyLevel(), PrivacyLevel.None);
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,0}, new long[]{rows1-1,columns-1}));
firstHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint1.getPrivacyLevel(),level));
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{rows1,0}, new long[]{rows1+rows2-1,columns-1}));
secondHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint2.getPrivacyLevel(),level));
}
private static void generalOnlyCBindTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int rows = 2;
int columns1 = 4;
int columns2 = 3;
MatrixBlock inputMatrix1 = new MatrixBlock(rows,columns1,3);
MatrixBlock inputMatrix2 = new MatrixBlock(rows,columns2,4);
AppendPropagator propagator = new CBindPropagator(inputMatrix1, constraint1, inputMatrix2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Assert.assertEquals(mergedConstraint.getPrivacyLevel(), PrivacyLevel.None);
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,0}, new long[]{rows-1,columns1-1}));
firstHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint1.getPrivacyLevel(),level));
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,columns1}, new long[]{rows,columns1+columns2-1}));
secondHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint2.getPrivacyLevel(),level));
}
private static void generalOnlyListAppendTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int length1 = 6;
List<Data> dataList1 = Arrays.asList(new Data[length1]);
ListObject input1 = new ListObject(dataList1);
int length2 = 11;
List<Data> dataList2 = Arrays.asList(new Data[length2]);
ListObject input2 = new ListObject(dataList2);
Propagator propagator = new ListAppendPropagator(input1, constraint1, input2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0}, new long[]{length1-1})
);
firstHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint1.getPrivacyLevel(),level));
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[length1], new long[]{length1+length2-1})
);
secondHalfPrivacy.forEach((range,level) -> Assert.assertEquals(constraint2.getPrivacyLevel(),level));
}
private static void generalOnlyListRemoveAppendTest(
PrivacyConstraint constraint1, PrivacyConstraint constraint2, PrivacyLevel expected1, PrivacyLevel expected2){
int dataLength = 9;
List<Data> dataList = new ArrayList<>();
for ( int i = 0; i < dataLength; i++){
dataList.add(new DoubleObject(i));
}
ListObject inputList = new ListObject(dataList);
int removePositionInt = 5;
ScalarObject removePosition = new IntObject(removePositionInt);
PropagatorMultiReturn propagator = new ListRemovePropagator(inputList, constraint1, removePosition, constraint2);
PrivacyConstraint[] mergedConstraints = propagator.propagate();
Assert.assertEquals(expected1, mergedConstraints[0].getPrivacyLevel());
Assert.assertEquals(expected2, mergedConstraints[1].getPrivacyLevel());
Assert.assertFalse("The first output constraint should have no fine-grained constraints", mergedConstraints[0].hasFineGrainedConstraints());
Assert.assertFalse("The second output constraint should have no fine-grained constraints", mergedConstraints[1].hasFineGrainedConstraints());
}
private static void finegrainedRBindTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int columns = 2;
int rows1 = 4;
int rows2 = 3;
MatrixBlock inputMatrix1 = new MatrixBlock(rows1,columns,3);
MatrixBlock inputMatrix2 = new MatrixBlock(rows2,columns,4);
AppendPropagator propagator = new RBindPropagator(inputMatrix1, constraint1, inputMatrix2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Assert.assertEquals(mergedConstraint.getPrivacyLevel(), PrivacyLevel.None);
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,0}, new long[]{rows1-1,columns-1}));
constraint1.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 1",
firstHalfPrivacy.containsValue(constraint.getValue()))
);
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{rows1,0}, new long[]{rows1+rows2-1,columns-1}));
constraint2.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 2",
secondHalfPrivacy.containsValue(constraint.getValue()))
);
}
private static void finegrainedCBindTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int rows = 6;
int columns1 = 4;
int columns2 = 3;
MatrixBlock inputMatrix1 = new MatrixBlock(rows,columns1,3);
MatrixBlock inputMatrix2 = new MatrixBlock(rows,columns2,4);
AppendPropagator propagator = new CBindPropagator(inputMatrix1, constraint1, inputMatrix2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Assert.assertEquals(mergedConstraint.getPrivacyLevel(), PrivacyLevel.None);
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,0}, new long[]{rows-1,columns1-1}));
constraint1.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 1",
firstHalfPrivacy.containsValue(constraint.getValue()))
);
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0,columns1}, new long[]{rows,columns1+columns2-1}));
constraint2.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 2",
secondHalfPrivacy.containsValue(constraint.getValue()))
);
}
private static void finegrainedListAppendTest(PrivacyConstraint constraint1, PrivacyConstraint constraint2){
int length1 = 6;
List<Data> dataList1 = Arrays.asList(new Data[length1]);
ListObject input1 = new ListObject(dataList1);
int length2 = 11;
List<Data> dataList2 = Arrays.asList(new Data[length2]);
ListObject input2 = new ListObject(dataList2);
Propagator propagator = new ListAppendPropagator(input1, constraint1, input2, constraint2);
PrivacyConstraint mergedConstraint = propagator.propagate();
Assert.assertEquals(mergedConstraint.getPrivacyLevel(), PrivacyLevel.None);
Map<DataRange, PrivacyLevel> firstHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0}, new long[]{length1-1})
);
constraint1.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 1",
firstHalfPrivacy.containsValue(constraint.getValue()))
);
Map<DataRange, PrivacyLevel> secondHalfPrivacy = mergedConstraint.getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{length1}, new long[]{length1+length2-1})
);
constraint2.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 2",
secondHalfPrivacy.containsValue(constraint.getValue()))
);
}
private static void finegrainedListRemoveAppendTest(
PrivacyConstraint constraint1, PrivacyConstraint constraint2, PrivacyLevel expectedOutput2){
finegrainedListRemoveAppendTest(constraint1, constraint2, expectedOutput2, false);
}
private static void finegrainedListRemoveAppendTest(
PrivacyConstraint constraint1, PrivacyConstraint constraint2, PrivacyLevel expectedOutput2, boolean singleElementPrivacy){
int dataLength = 9;
List<Data> dataList = new ArrayList<>();
for ( int i = 0; i < dataLength; i++){
dataList.add(new DoubleObject(i));
}
ListObject inputList = new ListObject(dataList);
int removePositionInt = 5;
ScalarObject removePosition = new IntObject(removePositionInt);
PropagatorMultiReturn propagator = new ListRemovePropagator(inputList, constraint1, removePosition, constraint2);
PrivacyConstraint[] mergedConstraints = propagator.propagate();
if ( !singleElementPrivacy ){
Map<DataRange, PrivacyLevel> outputPrivacy = mergedConstraints[0].getFineGrainedPrivacy().getPrivacyLevel(
new DataRange(new long[]{0}, new long[]{dataLength-1})
);
constraint1.getFineGrainedPrivacy().getAllConstraintsList().forEach(
constraint -> Assert.assertTrue("Merged constraint should contain same privacy levels as input 1",
outputPrivacy.containsValue(constraint.getValue()))
);
}
Assert.assertEquals(expectedOutput2, mergedConstraints[1].getPrivacyLevel());
Assert.assertFalse(mergedConstraints[1].hasFineGrainedConstraints());
}
private void integrationCBindTest(PrivacyConstraint privacyConstraint1, PrivacyConstraint privacyConstraint2,
PrivacyConstraint expectedOutput){
TestConfiguration config = getAndLoadTestConfiguration(TEST_NAME_CBIND);
fullDMLScriptName = SCRIPT_DIR + TEST_DIR + config.getTestScript() + ".dml";
int cols1 = 20;
int cols2 = 30;
int rows = 10;
double[][] A = getRandomMatrix(rows, cols1, -10, 10, 0.5, 1);
double[][] B = getRandomMatrix(rows, cols2, -10, 10, 0.5, 1);
writeInputMatrixWithMTD("A", A, false, new MatrixCharacteristics(rows, cols1), privacyConstraint1);
writeInputMatrixWithMTD("B", B, false, new MatrixCharacteristics(rows, cols2), privacyConstraint2);
programArgs = new String[]{"-nvargs", "A=" + input("A"), "B=" + input("B"), "C=" + output("C")};
runTest(true,false,null,-1);
PrivacyConstraint outputConstraint = getPrivacyConstraintFromMetaData("C");
Assert.assertEquals(expectedOutput, outputConstraint);
}
private void integrationStringAppendTest(PrivacyConstraint privacyConstraint1, PrivacyConstraint privacyConstraint2,
PrivacyConstraint expectedOutput){
TestConfiguration config = getAndLoadTestConfiguration(TEST_NAME_STRING);
fullDMLScriptName = SCRIPT_DIR + TEST_DIR + config.getTestScript() + ".dml";
int cols = 1;
int rows = 1;
double[][] A = getRandomMatrix(rows, cols, -10, 10, 0.5, 1);
double[][] B = getRandomMatrix(rows, cols, -10, 10, 0.5, 1);
writeInputMatrixWithMTD("A", A, false, new MatrixCharacteristics(rows, cols), privacyConstraint1);
writeInputMatrixWithMTD("B", B, false, new MatrixCharacteristics(rows, cols), privacyConstraint2);
programArgs = new String[]{"-nvargs", "A=" + input("A"), "B=" + input("B"), "C=" + output("C")};
runTest(true,false,null,-1);
PrivacyConstraint outputConstraint = getPrivacyConstraintFromMetaData("C");
Assert.assertEquals(expectedOutput, outputConstraint);
}
private void integrationListAppendTest(PrivacyConstraint privacyConstraint1, PrivacyConstraint privacyConstraint2,
PrivacyConstraint expectedOutput){
TestConfiguration config = getAndLoadTestConfiguration(TEST_NAME_LIST);
fullDMLScriptName = SCRIPT_DIR + TEST_DIR + config.getTestScript() + ".dml";
int cols = 1;
int rows = 5;
double[][] A = getRandomMatrix(rows, cols, -10, 10, 0.5, 1);
double[][] B = getRandomMatrix(rows, cols, -10, 10, 0.5, 1);
writeInputMatrixWithMTD("A", A, false, new MatrixCharacteristics(rows, cols), privacyConstraint1);
writeInputMatrixWithMTD("B", B, false, new MatrixCharacteristics(rows, cols), privacyConstraint2);
programArgs = new String[]{"-nvargs", "A=" + input("A"), "B=" + input("B"), "C=" + output("C")};
runTest(true,false,null,-1);
PrivacyConstraint outputConstraint = getPrivacyConstraintFromMetaData("C");
Assert.assertEquals(expectedOutput, outputConstraint);
}
}