Skip to content
Snippets Groups Projects
Nloc.java 8.41 KiB
Newer Older
package nloc;

import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Arrays;
public class Nloc {
Peter Wagenhuber's avatar
Peter Wagenhuber committed
  public static final int MIN_TIMEDIFF = 0;
  private List<Channel> chanlist;
  private List<Droplet> dropletList;

  public Nloc (List<Channel> chanlist) {
    this.chanlist = chanlist;
    this.dropletList = new ArrayList<Droplet>();
  }

Peter Wagenhuber's avatar
Peter Wagenhuber committed
//  public void addChannel(Channel chan) {
//    chanlist.add(chan);
//  }
//
  public void addChannel(Channel chan) {
    chanlist.add(chan);
  }

  public Sink getSink() {
    Sink sink = null;
    for (Channel chan : chanlist) {
      if (chan instanceof Sink) sink = (Sink)chan;
    }
    return sink;
  }

  public Pump getPump() {
    Pump pump = null;
    for (Channel chan : chanlist) {
      if (chan instanceof Pump) pump = (Pump)chan;
    }
    return pump;
  }

  public boolean simulate() {
    boolean works = true;
    while (!allDropletsInSink()) {
      try {
        this.moveDroplets();
      } catch (CoalescedDropletException e) {
        works = false;
        System.out.println(e.getDroplet());
  public List<Droplet> getDropletList() {
    return dropletList;
  }

  public void moveDroplets() throws CoalescedDropletException {
    for (Droplet dr : dropletList) {
      dr.move();
    }
    for (Droplet dr: dropletList) {
      if (dr.coalesce()) throw new CoalescedDropletException(dr);
  public List<Channel> getBifurcationList(List<Channel> desiredPath) {
    List<Channel> bfList = new ArrayList<Channel>();

    for (Channel ch: desiredPath) {
      if (ch.isBifurcation()) {
  //public Pump generateDropletSequence(List<String> modules) 
  //  throws NlocStructureException {

  //  Pump pump = this.getPump();

  //  List<Channel> modPath = this.getModulesByName(modules);
  //  List<List<Channel>> pathlist = this.getAllPaths();
  //  List<Channel> desiredPath = getDesiredPath(modPath, pathlist);

  //  List<SequenceTuple> bftable = calcBFTable(desiredPath);
  //  SequenceTuple startConfiguration = bftable.get(0);

  //  pump = createDropletsequenceInPump(pump, startConfiguration);

  //  return pump;
  //}

  //private Pump createDropletsequenceInPump(Pump pump, 
  //  int noOfDroplets = startConfiguration.getNoOfDroplets();
  //  int minTimediff = startConfiguration.getMinTimediff();

  //  for (int i = 0; i < noOfDroplets; i++){
  //    if (!pump.containsDroplets()) {
  //      dropletList.add(new Droplet(DropletType.PAYLOAD, 
  //          new Position(pump,1)));
  //    } else {
  //      dropletList.add(new Droplet(DropletType.HEADER, 
  //          new Position(pump,i + i * minTimediff + 1)));
  //    }
  //  }
  //  return pump;
  //}
  public static int getPayloadPathlength(List<Channel> path) {
    int len = 0;
    for (Channel ch: path) {
      len += ch.getPSteps(); 
    }
    return len;
  }

  public static int getHeaderPathlength(List<Channel> path) {
    int len = 0;
    for (Channel ch: path) {
      len += ch.getHSteps(); 
    }
    return len;
  }

  public boolean allDropletsInSink() {
    boolean allInSink = true;
    for (Droplet dr : dropletList) {
      allInSink &= dr.isInSink();
    }
    return allInSink;
  public List<Channel> getDesiredPath(List<Channel> modules,
      List<List<Channel>> pathlist) throws NlocStructureException {

    List<Channel> found = new ArrayList<Channel>();

    for (List<Channel> path : pathlist) {

      List<Channel> modlist = new ArrayList<Channel>();

      for (Channel ch: path) {
        if (ch instanceof Module) {
          modlist.add(ch);
        }
      }

      if (modules.equals(modlist) && found.isEmpty()) {
        found = path;
      } else if (modules.equals(modlist) && !found.isEmpty()) {
        throw new NlocStructureException("Paths are not unique!");
      }
      
    if (found.isEmpty()) {
      throw new NlocStructureException("No path found that covers all given Modules");
  public Channel getModuleByName(String name) {
    Channel found = null;
    for (Channel ch: chanlist) {
      if (ch.getName().equals(name)) {
        found = ch;
      } 
    }
    return found;
  }

  public List<Channel> getModulesByName(List<String> names) {
    List<Channel> ret = new ArrayList<Channel>();
    for (String name : names) {
      Channel ch = getModuleByName(name);
      if (name != null) {
        ret.add(ch);
  public List<List<Channel>> getAllPathsFromTo(Channel from, Channel to) {
    List<List<Channel>> pl = new ArrayList<List<Channel>>();
    List<Channel> path = new ArrayList<Channel>();
    getAllPathsRecursive(from, to, path, pl);
    return pl;
  }

  public List<List<Channel>> getAllPaths() {
    List<List<Channel>> pl = new ArrayList<List<Channel>>();
    List<Channel> path = new ArrayList<Channel>();
    getAllPathsRecursive(this.getPump(), this.getSink(), path, pl);
  private void getAllPathsRecursive(Channel chan, Channel end, List<Channel> path, List<List<Channel>> pathlist) {
      pathlist.add(path);
    } else {
      for (Channel ch : chan.getChildrenList()) {
        getAllPathsRecursive(ch, end, new ArrayList<Channel>(path), pathlist);
  public List<List<SequenceTuple>> getSequencesAtBifurcation(
      List<SequenceTuple> seqTup, SequenceTuple currentSeqTup, 
      Channel currentBifurcation) {

    List<List<SequenceTuple>> seqTupList = new ArrayList<List<SequenceTuple>>();
    getSequencesAtBifurcationRecursive(seqTup, currentSeqTup, seqTupList,
        currentBifurcation);

    return seqTupList;
Peter Wagenhuber's avatar
Peter Wagenhuber committed
  }

  private void getSequencesAtBifurcationRecursive(
      List<SequenceTuple> seqTupList, SequenceTuple currentSeqTup, 
      List<List<SequenceTuple>> possibleSequences, Channel currentBifurcation) {

    if (currentSeqTup.equals(seqTupList.get(seqTupList.size() - 1))) {

      // if at last sequence tuple add another header droplet tuple if needed
      // and add the list of sequence tuples to the possible sequences list

      // check if header droplet is needed
      List<Channel> dropletPath = currentSeqTup.getPath();
      Channel bifurcSuccessor  = 
        dropletPath.get(dropletPath.indexOf(currentBifurcation) + 1);

      // bifurcation priority: prio = 0 if default channel; prio >= 1 if not 
      // default and threrfore header droplet needed
      int prio = currentBifurcation.getChildrenList().indexOf(bifurcSuccessor);

      if (dropletPath.contains(currentBifurcation) && prio > 0) {
        // we need header droplet 
        
        // cirst check all possible paths of heder droplets
        Channel defaultChan = currentBifurcation.getChildrenList().get(0);
          this.getAllPathsFromTo(dropletPath.get(0), defaultChan);
        
        for (List<Channel> path: pathList) {
          List<SequenceTuple> tmp = new ArrayList<SequenceTuple>(seqTupList);
          SequenceTuple tmpTuple = 
            new SequenceTuple(new Droplet(DropletType.HEADER),path);
          tmp.add(tmpTuple);
          // berechnen und setzen von den pump offsets
          int minPos = currentSeqTup.getMinPos();
          int maxPos = currentSeqTup.getMaxPos();

          List<Channel> pathToCurrentBifurcation =
            dropletPath.subList(0,dropletPath.indexOf(currentBifurcation) + 1);

          int pathLenCurrDroplet = 0;
          if (currentSeqTup.getDroplet().getType() == DropletType.HEADER) {
            pathLenCurrDroplet = getHeaderPathlength(pathToCurrentBifurcation);
          } else {
            pathLenCurrDroplet = getPayloadPathlength(pathToCurrentBifurcation);
          }

          int maxPathLenNewDroplet = getHeaderPathlength(path);
          int minPathLenNewDroplet = 
            maxPathLenNewDroplet - defaultChan.getHSteps() + 1;

          //System.out.println("minPos: " + minPos + " pathLenCurrDroplet: " +
          //    pathLenCurrDroplet + " minPathLenNewDroplet: " + minPathLenNewDroplet);
          int newTupleMinPos = 
            minPos - (pathLenCurrDroplet - minPathLenNewDroplet);
          int newTupleMaxPos = 
            maxPos - (pathLenCurrDroplet - minPathLenNewDroplet);

          tmpTuple.setMinPos(newTupleMinPos);
          tmpTuple.setMaxPos(newTupleMaxPos);