Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Preserve mappings after partial application #53

Draft
wants to merge 11 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Adds test case for applyNonZeriMappings
maxkratz committed Sep 21, 2023
commit 5b43a15d9d1a20abb12cdc6237b6c5c23cbc9de9
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package gipsl.all.build.mappingpreservation.connector;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.emoflon.gips.core.ilp.ILPSolverOutput;

import gipsl.all.build.mappingpreservation.api.gips.MappingpreservationGipsAPI;
import gipsl.all.build.mappingpreservation.api.gips.mapping.N2nMapping;
import gipsl.all.build.mappingpreservation.api.matches.MapVnodeMatch;
import test.suite.gips.utils.AConnector;
import test.suite.gips.utils.GipsTestUtils;
@@ -24,6 +26,7 @@ public MappingPreservationConnector(final String modelPath) {
public ILPSolverOutput run(final String outputPath) {
final ILPSolverOutput output = solve();
((MappingpreservationGipsAPI) api).getN2n().applyNonZeroMappings();
save(outputPath);
return output;
}

@@ -32,27 +35,23 @@ public ILPSolverOutput runWithNoApplication(final String outputPath) {
save(outputPath);
return output;
}

public List<Optional<MapVnodeMatch>> applyMappingWithVnodeName(final String vnodeName) {
// final var mappings = ((MappingpreservationGipsAPI) api).getN2n().getMappings();
// final var filtered = mappings.values().stream().filter(t -> {
// return t.getMatch().getVnode().getName().equals(vnodeName);
// }).toList();
final var mappings = ((MappingpreservationGipsAPI) api).getN2n().getNonZeroVariableMappings();
final var filtered = mappings.stream().filter(t -> {
return t.getMatch().getVnode().getName().equals(vnodeName);
}).toList();

// Check that only one mapping should be applied
if (filtered.size() != 1) {
throw new UnsupportedOperationException();
}

// Check if mapping to be applied has a value > 0
if (!(filtered.get(0).getValue() > 0)) {
throw new InternalError();
}

final var rule = ((MappingpreservationGipsAPI) api).getN2n().getGTRule();
return filtered.stream().map(m -> rule.apply(m.getMatch(), true)).collect(Collectors.toList());
}
@@ -61,4 +60,8 @@ public void save(final String path) {
super.save(path);
}

public Collection<N2nMapping> getMappings() {
return ((MappingpreservationGipsAPI) api).getN2n().getMappings().values();
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package test.suite.gipsl.all.build;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.File;
import java.util.Collection;

import org.emoflon.gips.core.ilp.ILPSolverOutput;
import org.emoflon.gips.core.ilp.ILPSolverStatus;
import org.junit.jupiter.api.Test;

import gipsl.all.build.mappingpreservation.api.gips.mapping.N2nMapping;
import gipsl.all.build.mappingpreservation.connector.MappingPreservationConnector;
import model.Container;
import model.Root;
@@ -21,7 +24,7 @@ public class GipslAllBuildMappingPreservationTest extends AGipslAllBuildTest {
public void callableSetUp() {
gen.persistModel(MODEL_PATH);
con = new MappingPreservationConnector(MODEL_PATH);

// Delete possible file of previous run
final File output = new File(OUTPUT_PATH);
output.delete();
@@ -31,7 +34,7 @@ public void callableSetUp() {
// Positive tests

@Test
public void testMap2to1() {
public void testMap2to1IndividualApplication() {
gen.genSubstrateNode("s1", 2);
gen.genVirtualNode("v1", 1);
gen.genVirtualNode("v2", 1);
@@ -66,7 +69,31 @@ public void testMap2to1() {
gen.loadModel(OUTPUT_PATH);
checkNumberOfEmbeddedVnodes(2);
}


@Test
public void testMap2to1ApplyNonZeroMappings() {
gen.genSubstrateNode("s1", 2);
gen.genVirtualNode("v1", 1);
gen.genVirtualNode("v2", 1);
callableSetUp();

final ILPSolverOutput ret = ((MappingPreservationConnector) con).run(OUTPUT_PATH);
assertEquals(ILPSolverStatus.OPTIMAL, ret.status());
assertEquals(2, Math.abs(ret.objectiveValue()));

// Check model state
gen.loadModel(OUTPUT_PATH);
checkNumberOfEmbeddedVnodes(2);

// Actual check: Both mappings must still have the value > 0, even if PM got
// updated
final Collection<N2nMapping> mappings = ((MappingPreservationConnector) con).getMappings();
assertEquals(2, mappings.size());
for (final N2nMapping m : mappings) {
assertTrue(m.getValue() > 0);
}
}

// Utility methods

private void checkNumberOfEmbeddedVnodes(final int expected) {
@@ -76,8 +103,8 @@ private void checkNumberOfEmbeddedVnodes(final int expected) {
for (final Container c : root.getContainers()) {
if (c instanceof VirtualContainer) {
final VirtualContainer vc = (VirtualContainer) c;
for(final VirtualNode vn : vc.getVirtualNodes()) {
if(vn.getHost() != null) {
for (final VirtualNode vn : vc.getVirtualNodes()) {
if (vn.getHost() != null) {
hostedVnodeCntr++;
}
}