implement loop route specification
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package ru.trader.analysis;
|
||||
|
||||
import ru.trader.analysis.graph.Edge;
|
||||
import ru.trader.analysis.graph.Traversal;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class LoopRouteSpecification<T> implements RouteSpecification<T> {
|
||||
private final boolean unique;
|
||||
|
||||
public LoopRouteSpecification(boolean unique) {
|
||||
this.unique = unique;
|
||||
}
|
||||
|
||||
private Traversal<T> getStart(Traversal<T> entry){
|
||||
Traversal<T> res = null;
|
||||
Traversal<T> last = entry;
|
||||
Optional<Traversal<T>> head = entry.getHead();
|
||||
while (head.isPresent()) {
|
||||
Traversal<T> e = head.get();
|
||||
res = last;
|
||||
last = e;
|
||||
head = e.getHead();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean specified(Edge<T> edge, Traversal<T> entry) {
|
||||
return check(edge, entry, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateSpecified(Edge<T> edge, Traversal<T> entry) {
|
||||
return check(edge, entry, true);
|
||||
}
|
||||
|
||||
private boolean check(Edge<T> edge, Traversal<T> entry, boolean update) {
|
||||
Optional<Traversal<T>> head = entry.getHead();
|
||||
if (!head.isPresent() || head.get().getEdge() == null) return false;
|
||||
Traversal<T> start = getStart(head.get());
|
||||
boolean found = edge.isConnect(start.getTarget().getEntry());
|
||||
if (found && unique){
|
||||
found = !start.isSkipped();
|
||||
if (update){
|
||||
start.setSkipped(true);
|
||||
setSkip(entry);
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
private void setSkip(Traversal<T> entry) {
|
||||
Traversal<T> curr = entry;
|
||||
Optional<Traversal<T>> head = entry.getHead();
|
||||
while (head.isPresent()) {
|
||||
curr.setSkipped(true);
|
||||
curr = head.get();
|
||||
head = curr.getHead();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -89,6 +89,10 @@ public class RouteSearcher {
|
||||
return collector.get();
|
||||
}
|
||||
|
||||
public List<Route> getLoops(Vendor source, Collection<Vendor> vendors, int count){
|
||||
return search(source, source, vendors, count, new LoopRouteSpecification<Vendor>(true));
|
||||
}
|
||||
|
||||
private class RouteCollector {
|
||||
private List<Route> routes = new ArrayList<>();
|
||||
|
||||
|
||||
@@ -202,6 +202,10 @@ public class MarketAnalyzer {
|
||||
return top;
|
||||
}
|
||||
|
||||
public Collection<Route> getLoops(Vendor vendor, int limit){
|
||||
return searcher.getLoops(vendor, getVendors(), limit);
|
||||
}
|
||||
|
||||
public Collection<Route> getRoutes(Place from){
|
||||
return searcher.getRoutes(getVendors(from), getVendors());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user