Skip to content

Commit

Permalink
Merge pull request #12 from NetCal/v2.6-dev
Browse files Browse the repository at this point in the history
Merge v2.6-dev Branch
  • Loading branch information
NetCal committed Jun 17, 2019
2 parents c9a3108 + d2c0a82 commit c1105d4
Show file tree
Hide file tree
Showing 22 changed files with 89 additions and 63 deletions.
20 changes: 11 additions & 9 deletions java/org/networkcalculus/dnc/func_tests/DncTest.java
Expand Up @@ -32,6 +32,7 @@
import org.networkcalculus.dnc.AnalysisConfig.ArrivalBoundMethod;
import org.networkcalculus.dnc.AnalysisConfig.Multiplexing;
import org.networkcalculus.dnc.AnalysisConfig.MultiplexingEnforcement;
import org.networkcalculus.dnc.feedforward.ArrivalBoundDispatch;
import org.networkcalculus.dnc.Calculator;
import org.networkcalculus.dnc.func_tests.DncTestConfig;
import org.networkcalculus.dnc.func_tests.DncTestMethodSources;
Expand All @@ -41,9 +42,9 @@
import org.networkcalculus.dnc.network.server_graph.ServerGraph;
import org.networkcalculus.dnc.network.server_graph.ServerGraphFactory;
import org.networkcalculus.dnc.sinktree.Backlog_SinkTree;
import org.networkcalculus.dnc.tandem.Analysis;
import org.networkcalculus.dnc.tandem.AnalysisResults;
import org.networkcalculus.dnc.tandem.Analysis.Analyses;
import org.networkcalculus.dnc.tandem.TandemAnalysis;
import org.networkcalculus.dnc.tandem.TandemAnalysisResults;
import org.networkcalculus.dnc.tandem.TandemAnalysis.Analyses;
import org.networkcalculus.dnc.tandem.analyses.PmooAnalysis;
import org.networkcalculus.dnc.tandem.analyses.SeparateFlowAnalysis;
import org.networkcalculus.dnc.tandem.analyses.TotalFlowAnalysis;
Expand Down Expand Up @@ -73,7 +74,8 @@ protected void initializeTest(DncTestConfig test_config) {

Calculator.getInstance().setCurveBackend(test_config.getCurveBackend());
Calculator.getInstance().setNumBackend(test_config.getNumBackend());

ArrivalBoundDispatch.clearAllCaches();

// reinitialize the server graph and the expected bounds
sg_factory.reinitializeCurves();
expected_results.initialize();
Expand Down Expand Up @@ -118,7 +120,7 @@ public void setMux(Set<Server> servers) {
}
}

private void runAnalysis(Analysis analysis, Flow flow_of_interest) {
private void runAnalysis(TandemAnalysis analysis, Flow flow_of_interest) {
try {
analysis.performAnalysis(flow_of_interest);
} catch (Exception e) {
Expand Down Expand Up @@ -149,7 +151,7 @@ protected void runTFAtest(TotalFlowAnalysis tfa, Flow flow_of_interest) {
// The alias holds the original flow ID, independent of the order flows are added to the server graph under analysis.
Integer foiID_from_alias = Integer.valueOf(flow_of_interest.getAlias().substring(1));

AnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.TFA, test_config.arrivalBoundMethods(), test_config.multiplexing);
TandemAnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.TFA, test_config.arrivalBoundMethods(), test_config.multiplexing);

Num epsilon = expected_results.getEpsilon(foiID_from_alias, Analyses.TFA,
test_config.arrivalBoundMethods(), test_config.multiplexing, test_config.getNumBackend());
Expand Down Expand Up @@ -200,7 +202,7 @@ protected void runSFAtest(SeparateFlowAnalysis sfa, Flow flow_of_interest) {
// The alias holds the original flow ID, independent of the order flows are added to the server graph under analysis.
Integer foiID_from_alias = Integer.valueOf(flow_of_interest.getAlias().substring(1));

AnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.SFA, test_config.arrivalBoundMethods(), test_config.multiplexing);
TandemAnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.SFA, test_config.arrivalBoundMethods(), test_config.multiplexing);

Num epsilon = expected_results.getEpsilon(foiID_from_alias, Analyses.SFA,
test_config.arrivalBoundMethods(), test_config.multiplexing, test_config.getNumBackend());
Expand Down Expand Up @@ -255,7 +257,7 @@ protected void runPMOOtest(PmooAnalysis pmoo, Flow flow_of_interest) {
// The alias holds the original flow ID, independent of the order flows are added to the server graph under analysis.
Integer foiID_from_alias = Integer.valueOf(flow_of_interest.getAlias().substring(1));

AnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.PMOO, test_config.arrivalBoundMethods(), test_config.multiplexing);
TandemAnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.PMOO, test_config.arrivalBoundMethods(), test_config.multiplexing);

Num epsilon = expected_results.getEpsilon(foiID_from_alias, Analyses.PMOO,
test_config.arrivalBoundMethods(), test_config.multiplexing, test_config.getNumBackend());
Expand Down Expand Up @@ -324,7 +326,7 @@ protected void runSinkTreePMOOtest(ServerGraph sink_tree, Flow flow_of_interest)
// The alias holds the original flow ID, independent of the order flows are added to the server graph under analysis.
Integer foiID_from_alias = Integer.valueOf(flow_of_interest.getAlias().substring(1));

AnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.PMOO, DncTestMethodSources.sinktree, Multiplexing.ARBITRARY);
TandemAnalysisResults bounds = expected_results.getBounds(foiID_from_alias, Analyses.PMOO, DncTestMethodSources.sinktree, Multiplexing.ARBITRARY);

Num epsilon = expected_results.getEpsilon(foiID_from_alias, Analyses.PMOO,
test_config.arrivalBoundMethods(), test_config.multiplexing, test_config.getNumBackend());
Expand Down
12 changes: 9 additions & 3 deletions java/org/networkcalculus/dnc/func_tests/DncTestConfig.java
Expand Up @@ -46,14 +46,16 @@ public class DncTestConfig extends AnalysisConfig {
private DncTestConfig() {
}

public DncTestConfig(Set<ArrivalBoundMethod> arrival_bound_methods, boolean convolve_alternative_arrival_bounds,
public DncTestConfig(Set<ArrivalBoundMethod> arrival_bound_methods,
boolean arrival_bounds_caching, boolean convolve_alternative_arrival_bounds,
AnalysisConfig.Multiplexing multiplexing,
boolean define_multiplexing_globally, NumBackend numbers, AlgDncBackend curves ) {

super(AnalysisConfig.MultiplexingEnforcement.GLOBAL_ARBITRARY, // Not used, no influence yet.
MaxScEnforcement.GLOBALLY_OFF, // Not used, no influence yet.
MaxScEnforcement.GLOBALLY_OFF, // Not used, no influence yet.
arrival_bound_methods, convolve_alternative_arrival_bounds, false);
arrival_bound_methods,
convolve_alternative_arrival_bounds, arrival_bounds_caching, false);

this.multiplexing = multiplexing;
this.define_multiplexing_globally = define_multiplexing_globally;
Expand Down Expand Up @@ -84,10 +86,14 @@ public String toString() {
StringBuffer func_test_str = new StringBuffer();

func_test_str.append(arrivalBoundMethods().toString());

if (convolveAlternativeArrivalBounds()) {
func_test_str.append(", " + "conv ABs");
}

if (useArrivalBoundsCache()) {
func_test_str.append(", " + "AB cache");
}

func_test_str.append(", " + multiplexing.toString());

Expand Down
36 changes: 27 additions & 9 deletions java/org/networkcalculus/dnc/func_tests/DncTestMethodSources.java
Expand Up @@ -37,18 +37,22 @@
import org.networkcalculus.dnc.AlgDncBackend_DNC_Affine;
import org.networkcalculus.dnc.AlgDncBackend_DNC_ConPwAffine;
import org.networkcalculus.dnc.AlgDncBackend_MPARTC_DISCO_Affine;
import org.networkcalculus.dnc.AlgDncBackend_MPARTC_DISCO_PwAffine;
import org.networkcalculus.dnc.AlgDncBackend_MPARTC_DISCO_ConPwAffine;
import org.networkcalculus.dnc.AlgDncBackend_MPARTC_PwAffine;
import org.networkcalculus.dnc.AnalysisConfig.ArrivalBoundMethod;
import org.networkcalculus.dnc.AnalysisConfig.Multiplexing;
import org.networkcalculus.dnc.algebra.MinPlus;
import org.networkcalculus.dnc.algebra.disco.MinPlus_Disco_Affine;
import org.networkcalculus.dnc.algebra.disco.MinPlus_Disco_ConPwAffine;
import org.networkcalculus.dnc.bounds.BoundingCurves;
import org.networkcalculus.dnc.bounds.Bounds;
import org.networkcalculus.dnc.bounds.disco.BoundingCurves_Disco_ConPwAffine;
import org.networkcalculus.dnc.bounds.disco.Bounds_Disco_PwAffine;
import org.networkcalculus.dnc.curves.Curve;
import org.networkcalculus.dnc.curves.LinearSegment;
import org.networkcalculus.dnc.curves.disco.LinearSegment_Disco;
import org.networkcalculus.dnc.curves.disco.pw_affine.Curve_Disco_PwAffine;
import org.networkcalculus.dnc.func_tests.AlgDncBackend_DNC_PwAffineC_AffineMP;
import org.networkcalculus.dnc.func_tests.AlgDncBackend_DNC_PwAffineC_Affine;
import org.networkcalculus.dnc.func_tests.DncTestConfig;
import org.networkcalculus.num.NumBackend;

Expand Down Expand Up @@ -139,22 +143,26 @@ private static Set<DncTestConfig> createParameters(Set<Multiplexing> mux_discipl
curves.add(AlgDncBackend_DNC_ConPwAffine.DISCO_CONPWAFFINE);
curves.add(AlgDncBackend_DNC_Affine.DISCO_AFFINE);

curves.add(AlgDncBackend_DNC_PwAffineC_AffineMP.DISCO_PWAFFINEC_AFFINEMP);
curves.add(AlgDncBackend_DNC_PwAffineC_Affine.DISCO_PWAFFINEC_AFFINEMP);

curves.add(AlgDncBackend_MPARTC_PwAffine.MPARTC_PWAFFINE);
curves.add(AlgDncBackend_MPARTC_DISCO_Affine.MPARTC_PWAFFINEC_DISCO_AFFINEMP);
curves.add(AlgDncBackend_MPARTC_DISCO_PwAffine.MPARTC_PWAFFINEC_DISCO_CONPWAFFINEMP);
curves.add(AlgDncBackend_MPARTC_DISCO_ConPwAffine.MPARTC_PWAFFINEC_DISCO_CONPWAFFINEMP);

// Parameter configurations for single arrival bounding tests:
// AB, convolve alternative ABs, global mux def, number class to use, curve class to use.
for (AlgDncBackend curve : curves) {
for (NumBackend num : nums) {
for (Set<ArrivalBoundMethod> ab : ab_sets) {
for (Multiplexing mux : mux_disciplines) {
test_configurations.add(new DncTestConfig(ab, false, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, true, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, false, mux, true, num, curve));
test_configurations.add(new DncTestConfig(ab, true, mux, true, num, curve));
test_configurations.add(new DncTestConfig(ab, false, false, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, false, false, mux, true, num, curve));
test_configurations.add(new DncTestConfig(ab, false, true, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, false, true, mux, true, num, curve));
test_configurations.add(new DncTestConfig(ab, true, false, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, true, false, mux, true, num, curve));
test_configurations.add(new DncTestConfig(ab, true, true, mux, false, num, curve));
test_configurations.add(new DncTestConfig(ab, true, true, mux, true, num, curve));
}
}
}
Expand All @@ -164,14 +172,24 @@ private static Set<DncTestConfig> createParameters(Set<Multiplexing> mux_discipl
}
}

enum AlgDncBackend_DNC_PwAffineC_AffineMP implements AlgDncBackend {
enum AlgDncBackend_DNC_PwAffineC_Affine implements AlgDncBackend {
DISCO_PWAFFINEC_AFFINEMP;

@Override
public MinPlus getMinPlus() {
return MinPlus_Disco_Affine.MINPLUS_DISCO_AFFINE;
}

@Override
public BoundingCurves getBoundingCurves() {
return BoundingCurves_Disco_ConPwAffine.BOUNDINGCURVES_DISCO_CONPWAFFINE;
}

@Override
public Bounds getBounds() {
return Bounds_Disco_PwAffine.BOUNDS_DISCO_PWAFFINE;
}

@Override
public Curve getCurveFactory() {
return Curve_Disco_PwAffine.getFactory();
Expand Down
48 changes: 24 additions & 24 deletions java/org/networkcalculus/dnc/func_tests/DncTestResults.java
Expand Up @@ -34,17 +34,17 @@
import org.networkcalculus.dnc.AnalysisConfig.ArrivalBoundMethod;
import org.networkcalculus.dnc.AnalysisConfig.Multiplexing;
import org.networkcalculus.dnc.Calculator;
import org.networkcalculus.dnc.tandem.AnalysisResults;
import org.networkcalculus.dnc.tandem.Analysis.Analyses;
import org.networkcalculus.dnc.tandem.TandemAnalysisResults;
import org.networkcalculus.dnc.tandem.TandemAnalysis.Analyses;
import org.networkcalculus.num.Num;
import org.networkcalculus.num.NumBackend;

public abstract class DncTestResults {
private Map<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>>> results_map;
private Map<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>>> results_map;
private Map<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Map<NumBackend, Num>>>>> epsilon_map;

public DncTestResults() {
results_map = new HashMap<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>>>();
results_map = new HashMap<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>>>();
epsilon_map = new HashMap<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Map<NumBackend, Num>>>>>();
}

Expand All @@ -57,48 +57,48 @@ protected void clear() {

// TODO Some batch mode would be nice in order not to query the maps for every analysis of the same flow.
protected void addBounds(Integer flowId, Analyses analysis, Set<ArrivalBoundMethod> ab_set, Multiplexing mux, Num delay, Num backlog) {
AnalysisResults expected_results = new AnalysisResults(delay, backlog, null);
TandemAnalysisResults expected_results = new TandemAnalysisResults(delay, backlog, null);

Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>> foi_maps = results_map.get(flowId);
Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>> foi_maps = results_map.get(flowId);
if(foi_maps == null) {
foi_maps = new HashMap<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>>();
foi_maps = new HashMap<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>>();
results_map.put(flowId, foi_maps);
}

Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>> foi_analysis_maps = foi_maps.get(analysis);
Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>> foi_analysis_maps = foi_maps.get(analysis);
if(foi_analysis_maps == null) {
foi_analysis_maps = new HashMap<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>();
foi_analysis_maps = new HashMap<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>();
foi_maps.put(analysis, foi_analysis_maps);
}

Map<Multiplexing, Set<AnalysisResults>> foi_analysis_ab_maps = foi_analysis_maps.get(ab_set);
Map<Multiplexing, Set<TandemAnalysisResults>> foi_analysis_ab_maps = foi_analysis_maps.get(ab_set);
if(foi_analysis_ab_maps == null) {
foi_analysis_ab_maps = new HashMap<Multiplexing, Set<AnalysisResults>>();
foi_analysis_ab_maps = new HashMap<Multiplexing, Set<TandemAnalysisResults>>();
foi_analysis_maps.put(ab_set, foi_analysis_ab_maps);
}

Set<AnalysisResults> existing_results = foi_analysis_ab_maps.get(mux);
Set<TandemAnalysisResults> existing_results = foi_analysis_ab_maps.get(mux);
if(existing_results == null) {
existing_results = new HashSet<AnalysisResults>();
existing_results = new HashSet<TandemAnalysisResults>();
foi_analysis_ab_maps.put(mux, existing_results);
}

existing_results.add(expected_results);
}

public AnalysisResults getBounds(Integer flowId, Analyses analysis, Set<ArrivalBoundMethod> ab_set, Multiplexing mux) {
Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>> foi_maps = results_map.get(flowId);
public TandemAnalysisResults getBounds(Integer flowId, Analyses analysis, Set<ArrivalBoundMethod> ab_set, Multiplexing mux) {
Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>> foi_maps = results_map.get(flowId);
if(foi_maps == null || foi_maps.isEmpty()) {
throw new RuntimeException("No DNC test results found! The results file may be corrupted.");
}

Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>> foi_analysis_maps = foi_maps.get(analysis);
Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>> foi_analysis_maps = foi_maps.get(analysis);
if(foi_analysis_maps == null || foi_analysis_maps.isEmpty()) {
throw new RuntimeException("No DNC test results found! The results file may be corrupted.");
}

Map<Multiplexing, Set<AnalysisResults>> foi_analysis_ab_maps = new HashMap<Multiplexing, Set<AnalysisResults>>();
for(Map.Entry<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>> abs_to_map : foi_analysis_maps.entrySet()) {
Map<Multiplexing, Set<TandemAnalysisResults>> foi_analysis_ab_maps = new HashMap<Multiplexing, Set<TandemAnalysisResults>>();
for(Map.Entry<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>> abs_to_map : foi_analysis_maps.entrySet()) {
if( abs_to_map.getKey().size() == ab_set.size()
&& abs_to_map.getKey().containsAll(ab_set)) {
foi_analysis_ab_maps = abs_to_map.getValue();
Expand All @@ -109,7 +109,7 @@ public AnalysisResults getBounds(Integer flowId, Analyses analysis, Set<ArrivalB
throw new RuntimeException("No DNC test results found! The results file may be corrupted.");
}

Set<AnalysisResults> existing_results = foi_analysis_ab_maps.get(mux);
Set<TandemAnalysisResults> existing_results = foi_analysis_ab_maps.get(mux);
if(existing_results == null || existing_results.isEmpty()) {
throw new RuntimeException("No DNC test results found! The results file may be corrupted.");
}
Expand Down Expand Up @@ -188,20 +188,20 @@ public String toString() {
StringBuffer exp_results_str = new StringBuffer();
String analysis_str, ab_str, mux_str;

for( Map.Entry<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>>> foi_map_entry : results_map.entrySet() ) {
for( Map.Entry<Integer, Map<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>>> foi_map_entry : results_map.entrySet() ) {
exp_results_str.append("flow Id: " + foi_map_entry.getKey().toString());
exp_results_str.append("\n");

for( Map.Entry<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>>> analysis_map_entry : foi_map_entry.getValue().entrySet() ) {
for( Map.Entry<Analyses, Map<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>>> analysis_map_entry : foi_map_entry.getValue().entrySet() ) {
analysis_str = "\t" + "Analysis: " + analysis_map_entry.getKey().toString();

for( Map.Entry<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<AnalysisResults>>> ab_map_entry : analysis_map_entry.getValue().entrySet() ) {
for( Map.Entry<Set<ArrivalBoundMethod>, Map<Multiplexing, Set<TandemAnalysisResults>>> ab_map_entry : analysis_map_entry.getValue().entrySet() ) {
ab_str = "; " + "Arrival Boundings: " + ab_map_entry.getKey().toString();

for( Map.Entry<Multiplexing, Set<AnalysisResults>> mux_map_entry : ab_map_entry.getValue().entrySet() ) {
for( Map.Entry<Multiplexing, Set<TandemAnalysisResults>> mux_map_entry : ab_map_entry.getValue().entrySet() ) {
mux_str = "; " + "Multiplexing: " + mux_map_entry.getKey().toString();

for( AnalysisResults stored_results : mux_map_entry.getValue() ) {
for( TandemAnalysisResults stored_results : mux_map_entry.getValue() ) {
exp_results_str.append( analysis_str );
exp_results_str.append( ab_str );
exp_results_str.append( mux_str );
Expand Down
Expand Up @@ -33,7 +33,7 @@
import org.networkcalculus.dnc.Calculator;
import org.networkcalculus.dnc.func_tests.DncTestMethodSources;
import org.networkcalculus.dnc.func_tests.DncTestResults;
import org.networkcalculus.dnc.tandem.Analysis.Analyses;
import org.networkcalculus.dnc.tandem.TandemAnalysis.Analyses;
import org.networkcalculus.num.Num;
import org.networkcalculus.num.NumBackend;
import org.networkcalculus.num.implementations.RationalBigInt;
Expand Down
Expand Up @@ -33,7 +33,7 @@
import org.networkcalculus.dnc.Calculator;
import org.networkcalculus.dnc.func_tests.DncTestMethodSources;
import org.networkcalculus.dnc.func_tests.DncTestResults;
import org.networkcalculus.dnc.tandem.Analysis.Analyses;
import org.networkcalculus.dnc.tandem.TandemAnalysis.Analyses;
import org.networkcalculus.num.Num;
import org.networkcalculus.num.NumBackend;
import org.networkcalculus.num.implementations.RationalBigInt;
Expand Down
Expand Up @@ -34,7 +34,7 @@
import org.networkcalculus.dnc.Calculator;
import org.networkcalculus.dnc.func_tests.DncTestMethodSources;
import org.networkcalculus.dnc.func_tests.DncTestResults;
import org.networkcalculus.dnc.tandem.Analysis.Analyses;
import org.networkcalculus.dnc.tandem.TandemAnalysis.Analyses;
import org.networkcalculus.num.Num;
import org.networkcalculus.num.NumBackend;
import org.networkcalculus.num.implementations.RationalBigInt;
Expand Down

0 comments on commit c1105d4

Please sign in to comment.