package com.plectix.simulator.util; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.plectix.simulator.interfaces.ConnectedComponentInterface; import com.plectix.simulator.simulationclasses.perturbations.ComplexPerturbation; import com.plectix.simulator.simulationclasses.perturbations.SpeciesCondition; import com.plectix.simulator.simulationclasses.perturbations.TimeCondition; import com.plectix.simulator.simulator.KappaSystem; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.LinkRank; import com.plectix.simulator.staticanalysis.Site; public class OutputUtils { private final static String AGENT_DEFAULT_NAME = Agent.DEFAULT_NAME + "()"; public static final String printPartRule( List<ConnectedComponentInterface> components, boolean ocamlStyleNaming) { StringBuffer sb = new StringBuffer(); int[] indexLink = new int[] { 0 }; int length = 0; if (components == null) return sb.toString(); for (ConnectedComponentInterface cc : components) length = length + cc.getAgents().size(); int index = 1; for (ConnectedComponentInterface cc : components) { if (cc.isEmpty()) return sb.toString(); sb.append(printPartRule(cc, indexLink, ocamlStyleNaming)); if (index < components.size()) sb.append(","); index++; } if(sb.toString().equals(AGENT_DEFAULT_NAME)) return ""; return sb.toString(); } private static String printPartRule( ConnectedComponentInterface component, int[] index, boolean ocamlStyleNaming) { StringBuffer sb = new StringBuffer(); int length = 0; if (component == null) return sb.toString(); length = component.getAgents().size(); int j = 1; if (component.isEmpty()) return sb.toString(); List<Agent> sortedAgents = component.getAgentsSortedByIdInRule(); for (Agent agent : sortedAgents) { sb.append(agent.getName()); sb.append("("); List<String> sitesList = new ArrayList<String>(); for (Site site : agent.getSites()) { String siteStr = new String(site.getName()); // line = line + site.getName(); if ((site.getInternalState() != null) && (!site.getInternalState().hasDefaultName())) { siteStr = siteStr + "~" + site.getInternalState().getName(); // line = line + "~" + site.getInternalState().getName(); } switch (site.getLinkState().getStatusLink()) { case BOUND: { if (site.getLinkState().getStatusLinkRank() == LinkRank.SEMI_LINK) { siteStr = siteStr + "!_"; // line = line + "!_"; } else if (site.getParentAgent().getIdInRuleHandside() < ((Site) site .getLinkState().getConnectedSite()).getParentAgent() .getIdInRuleHandside()) { site.getLinkState().getConnectedSite().getLinkState() .setLinkStateId(index[0]); siteStr = siteStr + "!" + index[0]; index[0]++; // line = line + "!" + indexLink++; } else { siteStr = siteStr + "!" + site.getLinkState().getLinkStateId(); // line = line + "!" // + site.getLinkState().getLinkStateID(); site.getLinkState().setLinkStateId(-1); } break; } case WILDCARD: { siteStr = siteStr + "?"; // line = line + "?"; break; } } // if (agent.getSites().size() > i++) // line = line + ","; sitesList.add(siteStr); } sb.append(prepareSiteDescription(sortSiteLines(sitesList, ocamlStyleNaming))); sb.append((length > j) ? "),":")"); sitesList.clear(); j++; } return sb.toString(); } private static final String prepareSiteDescription(List<String> siteLines) { StringBuffer sb = new StringBuffer(); if (siteLines.size() == 0) return sb.toString(); for (int i = 0; i < siteLines.size() - 1; i++) { sb.append(siteLines.get(i) + ","); } sb.append(siteLines.get(siteLines.size() - 1)); return sb.toString(); } private static final List<String> sortSiteLines(List<String> siteLines, boolean isOcamlStyleObsName) { if (isOcamlStyleObsName) { Collections.sort(siteLines); } return siteLines; } public static final String perturbationToString(ComplexPerturbation<?, ?> perturbation, KappaSystem kappaSystem) { StringBuffer sb = new StringBuffer(); sb.append("-"); switch (perturbation.getCondition().getType()) { case TIME: { TimeCondition condition = (TimeCondition)perturbation.getCondition(); sb.append("Whenever current time "); sb.append(condition.inequalitySign()); sb.append(condition.getTimeLimit()); break; } case SPECIES: { SpeciesCondition condition = (SpeciesCondition)perturbation.getCondition(); sb.append("Whenever ["); sb.append(condition.getPickedObservable()); sb.append("] "); sb.append(condition.inequalitySign() + " "); sb.append(condition.getExpression()); break; } } // TODO match compile option in simplx sb.append(perturbation.getModification()); return sb.toString(); } }