package com.plectix.simulator.staticanalysis.speciesenumeration; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Stack; import com.plectix.simulator.staticanalysis.abstracting.AbstractAgent; public final class SpeciesEnumeration { private final Map<String, List<AbstractAgent>> localViews; private final Map<String, Species> species = new LinkedHashMap<String, Species>(); private boolean isUnbounded = false; public SpeciesEnumeration(Map<String, List<AbstractAgent>> localViews) { this.localViews = localViews; } public final Map<String, Species> getSpecies() { return species; } public final void enumerate() { Map<String, List<AbstractAgent>> availableListOfView = new LinkedHashMap<String, List<AbstractAgent>>(); for (String i : localViews.keySet()) { List<AbstractAgent> newlist = new LinkedList<AbstractAgent>(); newlist = localViews.get(i); availableListOfView.put(i, newlist); for (AbstractAgent view : newlist) { buildSpeciesFromRoot(availableListOfView, view); } } } private final void buildSpeciesFromRoot( Map<String, List<AbstractAgent>> availableListOfViews, AbstractAgent root) { Species first = new Species(availableListOfViews, root); Stack<Species> children = new Stack<Species>(); children.add(first); // TODO stack -> map<String,Species> while (!children.isEmpty()) { Species initiative = children.pop(); if (initiative.isComplete()) { if (species.get(initiative.getHashCode()) == null) { species.put(initiative.getHashCode(), initiative); } } else { List<Species> list = initiative.propagate(); if (list != null) children.addAll(list); } } } public final void unbound() { isUnbounded = true; } public boolean isUnbounded() { return isUnbounded; } }