package com.plectix.simulator.simulator.api.steps;
import java.util.LinkedList;
import java.util.List;
import com.plectix.simulator.simulator.KappaSystem;
import com.plectix.simulator.simulator.api.OperationType;
import com.plectix.simulator.staticanalysis.StaticAnalysisException;
import com.plectix.simulator.staticanalysis.abstracting.AbstractAgent;
import com.plectix.simulator.staticanalysis.contactmap.ContactMap;
import com.plectix.simulator.staticanalysis.cycledetection.Detector;
import com.plectix.simulator.staticanalysis.localviews.LocalViewsMain;
import com.plectix.simulator.staticanalysis.speciesenumeration.SpeciesEnumeration;
import com.plectix.simulator.staticanalysis.subviews.AllSubViewsOfAllAgentsInterface;
public class SpeciesEnumerationOperation extends AbstractOperation<SpeciesEnumeration> {
private final KappaSystem kappaSystem;
public SpeciesEnumerationOperation(KappaSystem kappaSystem) {
super(kappaSystem.getSimulationData(), OperationType.SPECIES_ENUMERATION);
this.kappaSystem = kappaSystem;
kappaSystem.getSimulationData().getSimulationArguments().setEnumerationOfSpecies(true);
}
protected SpeciesEnumeration performDry() throws StaticAnalysisException {
ContactMap contactMap = kappaSystem.getContactMap();
AllSubViewsOfAllAgentsInterface subViews = kappaSystem.getSubViews();
LocalViewsMain localViews = kappaSystem.getLocalViews();
SpeciesEnumeration enumerationOfSpecies = new SpeciesEnumeration(localViews.getLocalViews());
List<AbstractAgent> list = new LinkedList<AbstractAgent>();
list.addAll(contactMap.getAbstractSolution().getAgentNameToAgent().values());
Detector detector = new Detector(subViews, list);
if (detector.extractCycles().isEmpty()) {
enumerationOfSpecies.enumerate();
} else {
enumerationOfSpecies.unbound();
}
kappaSystem.setEnumerationOfSpecies(enumerationOfSpecies);
return enumerationOfSpecies;
}
@Override
protected boolean noNeedToPerform() {
return kappaSystem.getEnumerationOfSpecies() != null;
}
@Override
protected SpeciesEnumeration retrievePreparedResult() {
return kappaSystem.getEnumerationOfSpecies();
}
}