Search in sources :

Example 6 with Stop

use of im.tny.segvault.subway.Stop in project underlx by underlx.

the class Route method getShortestPath.

public static GraphPath getShortestPath(final Network network, Station source, Station target, @Nullable IEdgeWeighter weighter, @Nullable IAlternativeQualifier qualifier) {
    if (qualifier == null) {
        qualifier = new IAlternativeQualifier() {

            @Override
            public boolean acceptable(Station station) {
                return !station.isAlwaysClosed() && !station.isExceptionallyClosed(network, new Date());
            }
        };
    }
    List<Stop> possibleSources = new ArrayList<>();
    if (!qualifier.acceptable(source)) {
        for (Station neighbor : source.getAlternatives(qualifier, 1)) {
            possibleSources.addAll(neighbor.getStops());
        }
    } else {
        possibleSources.addAll(source.getStops());
    }
    List<Stop> possibleTargets = new ArrayList<>();
    if (!qualifier.acceptable(target)) {
        for (Station neighbor : target.getAlternatives(qualifier, 1)) {
            possibleTargets.addAll(neighbor.getStops());
        }
    } else {
        possibleTargets.addAll(target.getStops());
    }
    return getShortestPath(network, possibleSources, possibleTargets, weighter);
}
Also used : Station(im.tny.segvault.subway.Station) Stop(im.tny.segvault.subway.Stop) ArrayList(java.util.ArrayList) Date(java.util.Date)

Example 7 with Stop

use of im.tny.segvault.subway.Stop in project underlx by underlx.

the class MainService method loadNetworks.

private void loadNetworks() {
    synchronized (lock) {
        try {
            Network net = TopologyCache.loadNetwork(this, PRIMARY_NETWORK_ID, api.getEndpoint().toString());
            putNetwork(net);
            S2LS loc = locServices.get(PRIMARY_NETWORK_ID);
            Log.d("loadNetworks", String.format("In network? %b", loc.inNetwork()));
            Log.d("loadNetworks", String.format("Near network? %b", loc.nearNetwork()));
            Zone z = loc.getLocation();
            for (Stop s : z.vertexSet()) {
                Log.d("loadNetworks", String.format("May be in station %s", s));
            }
        } catch (CacheException e) {
            // cache invalid, attempt to reload topology
            updateTopology();
        }
    }
}
Also used : S2LS(im.tny.segvault.s2ls.S2LS) Stop(im.tny.segvault.subway.Stop) CacheException(im.tny.segvault.disturbances.exception.CacheException) Zone(im.tny.segvault.subway.Zone) Network(im.tny.segvault.subway.Network)

Example 8 with Stop

use of im.tny.segvault.subway.Stop in project underlx by underlx.

the class TopologyCache method loadNetwork.

public static Network loadNetwork(Context context, String id, String apiEndpoint) throws CacheException {
    String filename = "net-" + id;
    Topology t = null;
    try {
        FileInputStream fis = context.openFileInput(filename);
        ObjectInputStream is = new ObjectInputStream(fis);
        t = (Topology) is.readObject();
        is.close();
        fis.close();
    } catch (FileNotFoundException e) {
        throw new CacheException(e).addInfo("File " + filename + " not found");
    } catch (IOException e) {
        throw new CacheException(e).addInfo("IO exception");
    } catch (ClassNotFoundException e) {
        throw new CacheException(e).addInfo("Class not found");
    } catch (Exception e) {
        e.printStackTrace();
        throw new CacheException(e).addInfo("Unforeseen exception");
    }
    Network net = new Network(t.network.id, t.network.mainLocale, t.network.names, t.network.typCars, t.network.holidays, t.network.timezone, t.network.newsURL);
    for (API.POI poi : t.pois) {
        net.addPOI(new POI(poi.id, poi.type, poi.worldCoord, poi.webURL, poi.mainLocale, poi.names));
    }
    for (String lineid : t.network.lines) {
        API.Line l = t.lines.get(lineid);
        Line line = new Line(net, l.mainLocale, l.names, new HashSet<Stop>(), l.id, l.typCars, l.order);
        line.setColor(Color.parseColor("#" + l.color));
        boolean isFirstStationInLine = true;
        for (String sid : l.stations) {
            API.Station s = t.stations.get(sid);
            Station station = net.getStation(s.id);
            if (station == null) {
                Map<String, String> triviaURLs = new HashMap<>();
                for (Map.Entry<String, String> entry : s.triviaURLs.entrySet()) {
                    triviaURLs.put(entry.getKey(), apiEndpoint + entry.getValue());
                }
                Map<String, Map<String, String>> connURLs = new HashMap<>();
                for (Map.Entry<String, Map<String, String>> entry : s.connURLs.entrySet()) {
                    Map<String, String> urls = new HashMap<>();
                    for (Map.Entry<String, String> localeEntry : entry.getValue().entrySet()) {
                        urls.put(localeEntry.getKey(), apiEndpoint + localeEntry.getValue());
                    }
                    connURLs.put(entry.getKey(), urls);
                }
                station = new Station(net, s.id, s.name, s.altNames, new Station.Features(s.features.lift, s.features.bus, s.features.boat, s.features.train, s.features.airport), triviaURLs);
                station.setConnectionURLs(connURLs);
                // Lobbies
                for (String lid : s.lobbies) {
                    API.Lobby alobby = t.lobbies.get(lid);
                    Lobby lobby = new Lobby(alobby.id, alobby.name);
                    for (API.Exit aexit : alobby.exits) {
                        Lobby.Exit exit = new Lobby.Exit(aexit.id, aexit.worldCoord, aexit.streets, aexit.type);
                        lobby.addExit(exit);
                    }
                    for (API.Schedule asched : alobby.schedule) {
                        Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
                        lobby.addSchedule(sched);
                    }
                    station.addLobby(lobby);
                }
                // POIs
                for (String poiId : s.pois) {
                    POI poi = net.getPOI(poiId);
                    if (poi != null) {
                        station.addPOI(poi);
                    }
                }
            }
            Stop stop = new Stop(station, line);
            line.addVertex(stop);
            station.addVertex(stop);
            if (isFirstStationInLine) {
                line.setFirstStop(stop);
                isFirstStationInLine = false;
            }
            // WiFi APs
            for (API.WiFiAP w : s.wiFiAPs) {
                // take line affinity into account
                if (w.line.equals(line.getId())) {
                    WiFiLocator.addBSSIDforStop(stop, new BSSID(w.bssid));
                }
            }
        }
        for (API.Schedule asched : l.schedule) {
            Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
            line.addSchedule(sched);
        }
        for (API.WorldPath apath : l.worldPaths) {
            WorldPath path = new WorldPath(apath.id, apath.path);
            line.addPath(path);
        }
        net.addLine(line);
    }
    // Connections are within stations in the same line
    for (API.Connection c : t.connections) {
        Set<Stop> sFrom = net.getStation(c.from).vertexSet();
        Set<Stop> sTo = net.getStation(c.to).vertexSet();
        Stop from = null, to = null;
        for (Stop s : sFrom) {
            for (Stop s2 : sTo) {
                if (s.getLine().getId().equals(s2.getLine().getId())) {
                    from = s;
                    to = s2;
                }
            }
        }
        if (from != null && to != null) {
            Connection newConnection = net.addEdge(from, to);
            from.getLine().addEdge(from, to);
            newConnection.setTimes(new Connection.Times(c.typWaitS, c.typStopS, c.typS));
            newConnection.setWorldLength(c.worldLength);
            net.setEdgeWeight(newConnection, c.typS);
        }
    }
    for (API.Transfer tr : t.transfers) {
        Transfer newTransfer = new Transfer();
        // find stations with the right IDs for each line
        Station station = net.getStation(tr.station);
        for (Stop from : station.vertexSet()) {
            for (Stop to : station.vertexSet()) {
                if (from.getLine().getId().equals(tr.from) && to.getLine().getId().equals(tr.to)) {
                    net.addEdge(from, to, newTransfer);
                    net.setEdgeWeight(newTransfer, tr.typS);
                    newTransfer.setTimes(new Connection.Times(0, 0, tr.typS));
                }
            }
        }
    }
    for (API.Schedule asched : t.network.schedule) {
        Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
        net.addSchedule(sched);
    }
    net.setDatasetAuthors(t.info.authors);
    net.setDatasetVersion(t.info.version);
    return net;
}
Also used : CacheException(im.tny.segvault.disturbances.exception.CacheException) Stop(im.tny.segvault.subway.Stop) HashMap(java.util.HashMap) FileNotFoundException(java.io.FileNotFoundException) Lobby(im.tny.segvault.subway.Lobby) Network(im.tny.segvault.subway.Network) Connection(im.tny.segvault.subway.Connection) IOException(java.io.IOException) POI(im.tny.segvault.subway.POI) WorldPath(im.tny.segvault.subway.WorldPath) FileInputStream(java.io.FileInputStream) CacheException(im.tny.segvault.disturbances.exception.CacheException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) Line(im.tny.segvault.subway.Line) Station(im.tny.segvault.subway.Station) BSSID(im.tny.segvault.s2ls.wifi.BSSID) Schedule(im.tny.segvault.subway.Schedule) Transfer(im.tny.segvault.subway.Transfer) HashMap(java.util.HashMap) Map(java.util.Map) ObjectInputStream(java.io.ObjectInputStream)

Example 9 with Stop

use of im.tny.segvault.subway.Stop in project underlx by underlx.

the class Route method getShortestPath.

public static GraphPath getShortestPath(Network network, List<Stop> possibleSources, List<Stop> possibleTargets, @Nullable IEdgeWeighter weighter) {
    AStarShortestPath as = new AStarShortestPath(network);
    AStarAdmissibleHeuristic heuristic = new AStarAdmissibleHeuristic<Stop>() {

        @Override
        public double getCostEstimate(Stop sourceVertex, Stop targetVertex) {
            return 0;
        }
    };
    List<GraphPath> paths = new ArrayList<>();
    // lock on class so that if this method is called concurrently the annotations won't be messed up
    synchronized (Route.class) {
        IEdgeWeighter prevWeighter = network.getEdgeWeighter();
        if (weighter != null) {
            network.setEdgeWeighter(weighter);
        }
        for (Stop pSource : possibleSources) {
            for (Stop pTarget : possibleTargets) {
                // hackish "annotations" for the connection weighter
                pSource.putMeta("is_route_source", true);
                pTarget.putMeta("is_route_target", true);
                paths.add(as.getShortestPath(pSource, pTarget, heuristic));
                pSource.putMeta("is_route_source", null);
                pTarget.putMeta("is_route_target", null);
            }
        }
        network.setEdgeWeighter(prevWeighter);
    }
    GraphPath path = null;
    for (GraphPath p : paths) {
        if (path == null || p.getWeight() < path.getWeight()) {
            path = p;
        }
    }
    return path;
}
Also used : AStarShortestPath(org.jgrapht.alg.AStarShortestPath) Stop(im.tny.segvault.subway.Stop) GraphPath(org.jgrapht.GraphPath) ArrayList(java.util.ArrayList) AStarAdmissibleHeuristic(org.jgrapht.alg.interfaces.AStarAdmissibleHeuristic) IEdgeWeighter(im.tny.segvault.subway.IEdgeWeighter)

Example 10 with Stop

use of im.tny.segvault.subway.Stop in project underlx by underlx.

the class Route method getNextStep.

public Step getNextStep(Path currentPath) {
    if (currentPath == null) {
        return get(0);
    }
    List<Connection> cur = currentPath.getEdgeList();
    List<Connection> tar = path.getEdgeList();
    if (cur.size() == 0) {
        return get(0);
    }
    // iterate over the target path until the last edge of the current path is found
    Connection lastCur = cur.get(cur.size() - 1);
    int tarIdx;
    for (tarIdx = 0; tarIdx < tar.size(); tarIdx++) {
        if (tar.get(tarIdx) == lastCur) {
            break;
        }
    }
    if (tarIdx >= tar.size()) {
        // so at the moment the user is not following the instructions
        if (get(0) instanceof EnterStep) {
            // if user is already on a path on the right direction, do not tell him to "catch a train" he is already in
            Stop direction = null;
            if (path.getGraph() instanceof Network) {
                direction = ((Network) path.getGraph()).getDirectionForConnection(lastCur);
            } else if (path.getGraph() instanceof Line) {
                direction = ((Line) path.getGraph()).getDirectionForConnection(lastCur);
            }
            if (direction != null && ((EnterStep) get(0)).getDirection() == direction.getStation()) {
                return get(1);
            }
        }
        return get(0);
    }
    // find next step
    for (; tarIdx < tar.size(); tarIdx++) {
        if (pathIndexToStep.get(tarIdx) != null) {
            return pathIndexToStep.get(tarIdx);
        }
    }
    return null;
}
Also used : Line(im.tny.segvault.subway.Line) Stop(im.tny.segvault.subway.Stop) Network(im.tny.segvault.subway.Network) Connection(im.tny.segvault.subway.Connection)

Aggregations

Stop (im.tny.segvault.subway.Stop)15 ArrayList (java.util.ArrayList)8 Connection (im.tny.segvault.subway.Connection)6 Station (im.tny.segvault.subway.Station)5 Line (im.tny.segvault.subway.Line)4 Network (im.tny.segvault.subway.Network)4 Intent (android.content.Intent)3 S2LS (im.tny.segvault.s2ls.S2LS)3 HashSet (java.util.HashSet)3 SpannableString (android.text.SpannableString)2 View (android.view.View)2 TextView (android.widget.TextView)2 CacheException (im.tny.segvault.disturbances.exception.CacheException)2 Path (im.tny.segvault.s2ls.Path)2 BSSID (im.tny.segvault.s2ls.wifi.BSSID)2 Date (java.util.Date)2 PendingIntent (android.app.PendingIntent)1 ServiceConnection (android.content.ServiceConnection)1 GradientDrawable (android.graphics.drawable.GradientDrawable)1 NotificationCompat (android.support.v4.app.NotificationCompat)1