Newer
Older
import java.util.List;
import java.util.ArrayList;
private List<Channel> chanlist;
private List<Droplet> dropletList;
public Nloc (List<Channel> chanlist) {
this.chanlist = chanlist;
this.dropletList = new ArrayList<Droplet>();
}
// 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());
break;
}
}
return works;
}
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);

Peter Wagenhuber
committed
public List<Channel> getBifurcationList(List<Channel> desiredPath) {

Peter Wagenhuber
committed
List<Channel> bfList = new ArrayList<Channel>();
for (Channel ch: desiredPath) {
if (ch.isBifurcation) {
bfList.add(ch);

Peter Wagenhuber
committed
}

Peter Wagenhuber
committed
}
return bfList;

Peter Wagenhuber
committed
}
//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);

Peter Wagenhuber
committed
// List<SequenceTuple> bftable = calcBFTable(desiredPath);
// SequenceTuple startConfiguration = bftable.get(0);
// pump = createDropletsequenceInPump(pump, startConfiguration);
// return pump;
//}
//private Pump createDropletsequenceInPump(Pump pump,

Peter Wagenhuber
committed
// SequenceTuple startConfiguration) {
// 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;
//}

Peter Wagenhuber
committed
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;
}

Peter Wagenhuber
committed
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");
return found;
}
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) {
if (chan.equals(end)) {
pathlist.add(path);
} else {
for (Channel ch : chan.getChildrenList()) {
getAllPathsRecursive(ch, end, new ArrayList<Channel>(path), pathlist);

Peter Wagenhuber
committed
public List<List<SequenceTuple>> getSequencesAtBifurcation(
List<SequenceTuple> seqTup, SequenceTuple currentSeqTup,
Channel currentBifurcation) {

Peter Wagenhuber
committed
List<List<SequenceTuple>> seqTupList = new ArrayList<List<SequenceTuple>>();

Peter Wagenhuber
committed
getSequencesAtBifurcationRecursive(seqTup, currentSeqTup, seqTupList,
currentBifurcation);
return seqTupList;
}
private void getSequencesAtBifurcationRecursive(

Peter Wagenhuber
committed
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
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
List<List<Channel>> pathList =
this.getAllPathsFromTo(dropletPath.get(0),
currentBifurcation.getChildrenList().get(0));
for (List<Channel> path: pathList) {
List<SequenceTuple> tmp = new ArrayList<SequenceTuple>(seqTupList);
tmp.add(new SequenceTuple(new Droplet(DropletType.HEADER),path));
// TODO: berechnen und setzen von den pump offsets
possibleSequences.add(tmp);
}
}