From f27c21a985ce22882bb7cd00db292bb0b1184831 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 12:50:44 -0500 Subject: [PATCH 01/23] make network build work with r5 7.5, #540 --- .../org/ipea/r5r/Network/NetworkBuilder.java | 27 +- .../org/ipea/r5r/Network/NetworkChecker.java | 2 +- .../r5r/Network/TransitLayerWithShapes.java | 329 ------------------ 3 files changed, 24 insertions(+), 334 deletions(-) delete mode 100644 java-r5rcore/src/org/ipea/r5r/Network/TransitLayerWithShapes.java diff --git a/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java b/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java index 5c1dec711..433f60b2d 100644 --- a/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java +++ b/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java @@ -10,7 +10,10 @@ import com.conveyal.r5.kryo.KryoNetworkSerializer; import com.conveyal.r5.streets.StreetLayer; import com.conveyal.r5.transit.TransferFinder; +import com.conveyal.r5.transit.TransitLayer; import com.conveyal.r5.transit.TransportNetwork; +import com.conveyal.r5.transit.GtfsTransferLoader; +import com.conveyal.r5.analyst.cluster.TransportNetworkConfig.TransferConfig; import org.apache.commons.io.FilenameUtils; import org.ipea.r5r.R5RCore; import org.ipea.r5r.RDataFrame; @@ -132,21 +135,32 @@ private TransportNetwork createNetwork() { network.streetLayer.parentNetwork = network; network.streetLayer.indexStreets(); - network.transitLayer = new TransitLayerWithShapes(); + network.transitLayer = new TransitLayer(); + // this replaces the old r5r TransitLayerWithShapes class; saving shapes now built in to r5. + network.transitLayer.saveShapes = true; + + // Options here are OSM_ONLY (only use OSM data to find transfers, consistent with r5r versions + // up to 2.3.0), STOP_TO_PATTERN (only use OSM data to find transfers to stops served by patterns + // that do not have a stop with an explicit transfer from the source stop), STOP_TO_STOP (use OSM + // to find transfers for all stop pairs that don't have an explicit GTFS transfer), and GTFS_ONLY + // (use only transfers specified in GTFS, almost never appropriate). + GtfsTransferLoader transferLoader = new GtfsTransferLoader(network.transitLayer, TransferConfig.OSM_ONLY); gtfsFeeds.forEach(gtfsFeed -> { - network.transitLayer.loadFromGtfs(gtfsFeed); + network.transitLayer.loadFromGtfs(gtfsFeed, transferLoader); // Is there a reason we can't push this close call down into the loader method? Maybe exception handling? gtfsFeed.close(); }); + transferLoader.logErrors(); + network.transitLayer.parentNetwork = network; network.streetLayer.associateStops(network.transitLayer); network.streetLayer.buildEdgeLists(); network.rebuildTransientIndexes(); - TransferFinder transferFinder = new TransferFinder(network); + TransferFinder transferFinder = new TransferFinder(network, transferLoader); transferFinder.findTransfers(); transferFinder.findParkRideTransfer(); @@ -166,6 +180,7 @@ private TransportNetwork createNetwork() { } } catch (DataSourceException e) { e.printStackTrace(); + throw new RuntimeException(e); } network.scenarioId = "r5r"; @@ -178,7 +193,11 @@ private TransportNetwork createNetwork() { network.transitLayer.buildDistanceTables(null); // pre-calculate transfers between transit stops - new TransferFinder(network).findTransfers(); + // TODO mwbc: why is this happening again? It does not happen twice in the R5 + // TransportNetworkCache#buildNetworkFromConfig. I don't want to remove it though due to + // https://github.com/conveyal/r5/issues/991. Maybe we should just move the entire transfer + // finding process here? + new TransferFinder(network, transferLoader).findTransfers(); return network; } diff --git a/java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java b/java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java index 57672b3af..e724a5f06 100644 --- a/java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java +++ b/java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java @@ -25,7 +25,7 @@ public class NetworkChecker { * This string should be changed to a new value each time the network storage format changes. * I considered using an ISO date string but that could get confusing when seen in filenames. */ - public static final String NETWORK_FORMAT_VERSION = "nv3"; + public static final String NETWORK_FORMAT_VERSION = "nv4"; public static final byte[] HEADER = "R5NETWORK".getBytes(); diff --git a/java-r5rcore/src/org/ipea/r5r/Network/TransitLayerWithShapes.java b/java-r5rcore/src/org/ipea/r5r/Network/TransitLayerWithShapes.java deleted file mode 100644 index 94a5a1518..000000000 --- a/java-r5rcore/src/org/ipea/r5r/Network/TransitLayerWithShapes.java +++ /dev/null @@ -1,329 +0,0 @@ -package org.ipea.r5r.Network; - -import com.conveyal.gtfs.GTFSFeed; -import com.conveyal.gtfs.model.*; -import com.conveyal.r5.transit.*; -import com.conveyal.r5.util.LocationIndexedLineInLocalCoordinateSystem; -import com.google.common.base.Strings; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import gnu.trove.list.TIntList; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.map.TObjectIntMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.linearref.LinearLocation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.time.DateTimeException; -import java.time.ZoneId; -import java.time.zone.ZoneRulesException; -import java.util.*; -import java.util.stream.DoubleStream; -import java.util.stream.StreamSupport; - -public class TransitLayerWithShapes extends TransitLayer { - - public static final boolean SAVE_SHAPES = true; - - private static final Logger LOG = LoggerFactory.getLogger(TransitLayerWithShapes.class); - - /** - * Load data from a GTFS feed. Call multiple times to load multiple feeds. - * The supplied feed is treated as read-only, and is not closed after being loaded. - * This method requires findPatterns() to have been called on the feed before it's passed in. - */ - public void loadFromGtfs (GTFSFeed gtfs, TransitLayer.LoadLevel level) throws DuplicateFeedException { - if (feedChecksums.containsKey(gtfs.feedId)) { - throw new DuplicateFeedException(gtfs.feedId); - } - - // checksum feed and add to checksum cache - feedChecksums.put(gtfs.feedId, gtfs.checksum); - - // Load stops. - // ID is the GTFS string ID, stopIndex is the zero-based index, stopVertexIndex is the index in the street layer. - TObjectIntMap indexForUnscopedStopId = new TObjectIntHashMap<>(); - stopsWheelchair = new BitSet(gtfs.stops.size()); - for (Stop stop : gtfs.stops.values()) { - int stopIndex = stopIdForIndex.size(); - String scopedStopId = String.join(":", stop.feed_id, stop.stop_id); - // This is only used while building the TransitNetwork to look up StopTimes from the same feed. - indexForUnscopedStopId.put(stop.stop_id, stopIndex); - stopIdForIndex.add(scopedStopId); - // intern zone IDs to save memory - fareZoneForStop.add(stop.zone_id); - parentStationIdForStop.add(stop.parent_station); - stopForIndex.add(stop); - if (stop.wheelchair_boarding != null && stop.wheelchair_boarding.trim().equals("1")) { - stopsWheelchair.set(stopIndex); - } - if (level == TransitLayer.LoadLevel.FULL) { - stopNames.add(stop.stop_name); - } - } - - // Load service periods, assigning integer codes which will be referenced by trips and patterns. - TObjectIntMap serviceCodeNumber = new TObjectIntHashMap<>(20, 0.5f, -1); - gtfs.services.forEach((serviceId, service) -> { - int serviceIndex = services.size(); - services.add(service); - serviceCodeNumber.put(serviceId, serviceIndex); - LOG.debug("Service {} has ID {}", serviceIndex, serviceId); - }); - - LOG.info("Creating trip patterns and schedules."); - - // These are temporary maps used only for grouping purposes. - Map tripPatternForPatternId = new HashMap<>(); - Multimap tripsForBlock = HashMultimap.create(); - - // Keyed with unscoped route_id, which is fine as this is for a single GTFS feed - TObjectIntMap routeIndexForRoute = new TObjectIntHashMap<>(); - int nTripsAdded = 0; - int nZeroDurationHops = 0; - TRIPS: for (String tripId : gtfs.trips.keySet()) { - Trip trip = gtfs.trips.get(tripId); - Route route = gtfs.routes.get(trip.route_id); - // Construct the stop pattern and schedule for this trip. - String scopedRouteId = String.join(":", gtfs.feedId, trip.route_id); - TIntList arrivals = new TIntArrayList(TYPICAL_NUMBER_OF_STOPS_PER_TRIP); - TIntList departures = new TIntArrayList(TYPICAL_NUMBER_OF_STOPS_PER_TRIP); - TIntList stopSequences = new TIntArrayList(TYPICAL_NUMBER_OF_STOPS_PER_TRIP); - - int previousDeparture = Integer.MIN_VALUE; - - int nStops = 0; - - Iterable stopTimes; - - try { - stopTimes = gtfs.getInterpolatedStopTimesForTrip(tripId); - } catch (GTFSFeed.FirstAndLastStopsDoNotHaveTimes e) { - LOG.warn("First and last stops do not both have times specified on trip {} on route {}, skipping this as interpolation is impossible", trip.trip_id, trip.route_id); - continue TRIPS; - } - - for (StopTime st : stopTimes) { - arrivals.add(st.arrival_time); - departures.add(st.departure_time); - stopSequences.add(st.stop_sequence); - - if (previousDeparture > st.arrival_time || st.arrival_time > st.departure_time) { - LOG.warn("Negative-time travel at stop {} on trip {} on route {}, skipping this trip as it will wreak havoc with routing", st.stop_id, trip.trip_id, trip.route_id); - continue TRIPS; - } - - if (previousDeparture == st.arrival_time) { //Teleportation: arrive at downstream stop immediately after departing upstream - //often the result of a stop_times input with time values rounded to the nearest minute. - //TODO check if the distance of the hop is reasonably traveled in less than 60 seconds, which may vary by mode. - nZeroDurationHops++; - } - - previousDeparture = st.departure_time; - - nStops++; - } - - if (nStops == 0) { - LOG.warn("Trip {} on route {} {} has no stops, it will not be used", trip.trip_id, trip.route_id, route.route_short_name); - continue; - } - - String patternId = gtfs.patternForTrip.get(tripId); - - TripPattern tripPattern = tripPatternForPatternId.get(patternId); - if (tripPattern == null) { - tripPattern = new TripPattern(String.format("%s:%s", gtfs.feedId, route.route_id), stopTimes, indexForUnscopedStopId); - - // if we haven't seen the route yet _from this feed_ (as IDs are only feed-unique) - // create it. - if (level == TransitLayer.LoadLevel.FULL) { - if (!routeIndexForRoute.containsKey(trip.route_id)) { - int routeIndex = routes.size(); - RouteInfo ri = new RouteInfo(route, gtfs.agency.get(route.agency_id)); - routes.add(ri); - routeIndexForRoute.put(trip.route_id, routeIndex); - } - - tripPattern.routeIndex = routeIndexForRoute.get(trip.route_id); - - if (trip.shape_id != null && SAVE_SHAPES) { - Shape shape = gtfs.getShape(trip.shape_id); - if (shape == null) LOG.warn("Shape {} for trip {} was missing", trip.shape_id, trip.trip_id); - else { - // TODO this will not work if some trips in the pattern don't have shapes - tripPattern.shape = shape.geometry; - - // project stops onto shape - boolean stopsHaveShapeDistTraveled = StreamSupport.stream(stopTimes.spliterator(), false) - .noneMatch(st -> Double.isNaN(st.shape_dist_traveled)); - boolean shapePointsHaveDistTraveled = DoubleStream.of(shape.shape_dist_traveled) - .noneMatch(Double::isNaN); - - LinearLocation[] locations; - - if (stopsHaveShapeDistTraveled && shapePointsHaveDistTraveled) { - // create linear locations from dist traveled - locations = StreamSupport.stream(stopTimes.spliterator(), false) - .map(st -> { - double dist = st.shape_dist_traveled; - - int segment = 0; - - while (segment < shape.shape_dist_traveled.length - 2 && - dist > shape.shape_dist_traveled[segment + 1] - ) segment++; - - double endSegment = shape.shape_dist_traveled[segment + 1]; - double beginSegment = shape.shape_dist_traveled[segment]; - double proportion = (dist - beginSegment) / (endSegment - beginSegment); - - return new LinearLocation(segment, proportion); - }).toArray(LinearLocation[]::new); - } else { - // naive snapping - LocationIndexedLineInLocalCoordinateSystem line = - new LocationIndexedLineInLocalCoordinateSystem(shape.geometry.getCoordinates()); - - locations = StreamSupport.stream(stopTimes.spliterator(), false) - .map(st -> { - Stop stop = gtfs.stops.get(st.stop_id); - return line.project(new Coordinate(stop.stop_lon, stop.stop_lat)); - }) - .toArray(LinearLocation[]::new); - } - - tripPattern.stopShapeSegment = new int[locations.length]; - tripPattern.stopShapeFraction = new float[locations.length]; - - for (int i = 0; i < locations.length; i++) { - tripPattern.stopShapeSegment[i] = locations[i].getSegmentIndex(); - tripPattern.stopShapeFraction[i] = (float) locations[i].getSegmentFraction(); - } - } - } - } - - tripPatternForPatternId.put(patternId, tripPattern); - tripPattern.originalId = tripPatterns.size(); - tripPatterns.add(tripPattern); - } - tripPattern.setOrVerifyDirection(trip.direction_id); - int serviceCode = serviceCodeNumber.get(trip.service_id); - - // TODO there's no reason why we can't just filter trips like this, correct? - // TODO this means that invalid trips still have empty patterns created - Collection frequencies = gtfs.getFrequencies(trip.trip_id); - TripSchedule tripSchedule = TripSchedule.create(trip, arrivals.toArray(), departures.toArray(), frequencies, stopSequences.toArray(), serviceCode); - if (tripSchedule == null) continue; - - tripPattern.addTrip(tripSchedule); - - this.hasFrequencies = this.hasFrequencies || tripSchedule.headwaySeconds != null; - this.hasSchedules = this.hasSchedules || tripSchedule.headwaySeconds == null; - - nTripsAdded += 1; - // Record which block this trip belongs to, if any. - if ( ! Strings.isNullOrEmpty(trip.block_id)) { - tripsForBlock.put(trip.block_id, tripSchedule); - } - } - LOG.info("Done creating {} trips on {} patterns.", nTripsAdded, tripPatternForPatternId.size()); - - LOG.info("{} zero-duration hops found.", nZeroDurationHops); - - LOG.info("Chaining trips together according to blocks to model interlining..."); - // Chain together trips served by the same vehicle that allow transfers by simply staying on board. - // Elsewhere this is done by grouping by (serviceId, blockId) but this is not supported by the spec. - // Discussion started on gtfs-changes. - tripsForBlock.asMap().forEach((blockId, trips) -> { - TripSchedule[] schedules = trips.toArray(new TripSchedule[trips.size()]); - Arrays.sort(schedules); // Sorts on first departure time - for (int i = 0; i < schedules.length - 1; i++) { - schedules[i].chainTo(schedules[i + 1]); - } - }); - LOG.info("Done chaining trips together according to blocks."); - - LOG.info("Sorting trips on each pattern"); - for (TripPattern tripPattern : tripPatternForPatternId.values()) { - Collections.sort(tripPattern.tripSchedules); - } - LOG.info("done sorting"); - - LOG.info("Finding the approximate center of the transport network..."); - findCenter(gtfs.stops.values()); - - //Set transportNetwork timezone - //If there are no agencies (which is strange) it is GMT - //Otherwise it is set to first valid agency timezone and warning is shown if agencies have different timezones - if (gtfs.agency.size() == 0) { - timeZone = ZoneId.of("GMT"); - LOG.warn("graph contains no agencies; API request times will be interpreted as GMT."); - } else { - for (Agency agency : gtfs.agency.values()) { - if (agency.agency_timezone == null) { - LOG.warn("Agency {} is without timezone", agency.agency_name); - continue; - } - ZoneId tz; - try { - tz = ZoneId.of(agency.agency_timezone); - } catch (ZoneRulesException z) { - LOG.error("Agency {} in GTFS with timezone '{}' wasn't found in timezone database reason: {}", agency.agency_name, agency.agency_timezone, z.getMessage()); - //timezone will be set to GMT if it is still empty after for loop - continue; - } catch (DateTimeException dt) { - LOG.error("Agency {} in GTFS has timezone in wrong format:'{}'. Expected format: area/city ", agency.agency_name, agency.agency_timezone); - //timezone will be set to GMT if it is still empty after for loop - continue; - } - //First time setting timezone - if (timeZone == null) { - LOG.info("TransportNetwork time zone set to {} from agency '{}' and agency_timezone:{}", tz, - agency.agency_name, agency.agency_timezone); - timeZone = tz; - } else if (!timeZone.equals(tz)) { - LOG.error("agency time zone {} differs from TransportNetwork time zone: {}. This will be problematic.", tz, - timeZone); - } - } - - //This can only happen if all agencies have empty timezones - if (timeZone == null) { - timeZone = ZoneId.of("GMT"); - LOG.warn( - "No agency in graph had valid timezone; API request times will be interpreted as GMT."); - } - } - - if (level == TransitLayer.LoadLevel.FULL) { - this.fares = new HashMap<>(gtfs.fares); - } - - // Will be useful in naming patterns. -// LOG.info("Finding topology of each route/direction..."); -// Multimap, TripPattern> patternsForRouteDirection = HashMultimap.create(); -// tripPatterns.forEach(tp -> patternsForRouteDirection.put(new T2(tp.routeId, tp.directionId), tp)); -// for (T2 routeAndDirection : patternsForRouteDirection.keySet()) { -// RouteTopology topology = new RouteTopology(routeAndDirection.first, routeAndDirection.second, patternsForRouteDirection.get(routeAndDirection)); -// } - - } - - // The median of all stopTimes would be best but that involves sorting a huge list of numbers. - // So we just use the mean of all stops for now. - private void findCenter (Collection stops) { - double lonSum = 0; - double latSum = 0; - for (Stop stop : stops) { - latSum += stop.stop_lat; - lonSum += stop.stop_lon; - } - // Stops is a HashMap so size() is fast. If it ever becomes a MapDB BTree, we may want to do this differently. - centerLat = latSum / stops.size(); - centerLon = lonSum / stops.size(); - } -} From 686e4e2815a79d50f6c4c504ab145e3493e9356b Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 13:30:11 -0500 Subject: [PATCH 02/23] initial work on not autobuilding jar --- .github/workflows/jar-and-R-ci.yaml | 97 ----------------------------- configure.win | 3 + java-r5rcore/build.gradle | 2 + r-package/DESCRIPTION | 1 + r-package/inst/jar/.gitkeep | 0 5 files changed, 6 insertions(+), 97 deletions(-) create mode 100644 configure.win create mode 100644 r-package/inst/jar/.gitkeep diff --git a/.github/workflows/jar-and-R-ci.yaml b/.github/workflows/jar-and-R-ci.yaml index 5c3235ed4..cd07c14ba 100644 --- a/.github/workflows/jar-and-R-ci.yaml +++ b/.github/workflows/jar-and-R-ci.yaml @@ -8,82 +8,7 @@ on: - .github/workflows/** jobs: - build-jar: - env: - GH_TOKEN: ${{ github.token }} - - runs-on: ubuntu-latest - - # don't build on merges to master - if: ${{ !github.ref_protected }} - - steps: - - uses: actions/checkout@v3 - - name: Set up R - uses: r-lib/actions/setup-r@v2 -# with: -# use-public-rspm: true # this no longer works as of September 2025 - - - name: Install R packages - run: | - # this specification is necessary for some reason as of September 2025 - options(repos = c(CRAN = "https://packagemanager.posit.co/cran/__linux__/noble/latest")) - install.packages(c('devtools', 'remotes')) - remotes::install_deps(dependencies = TRUE) - shell: Rscript {0} - working-directory: r-package - - - name: Install system dependencies - run: | - while read -r cmd - do - eval sudo $cmd - done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))') - working-directory: r-package - - - name: Set up JDK 21 - uses: actions/setup-java@v3 - with: - java-version: '21' - distribution: 'temurin' - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v2 - - name: Build with Gradle - uses: gradle/gradle-build-action@749f47bda3e44aa060e82d7b3ef7e40d953bd629 - with: - arguments: build - build-root-directory: java-r5rcore - - - name: Create pull request - # https://github.com/actions/checkout/pull/1184 - run: | - NEW_JAR="java-r5rcore/build/libs/java-r5rcore-*.jar" - TARGET_JAR="r-package/inst/jar/r5r.jar" - - new_sha=$(sha256sum $NEW_JAR | awk '{print $1}') - # ensure file exists and then compute sha - old_sha=$( [ -f "$TARGET_JAR" ] && sha256sum "$TARGET_JAR" | awk '{print $1}' || echo "" ) - - echo "NEW: $new_sha" - echo "OLD: $old_sha" - - # Only push if sha different - if [ "$new_sha" != "$old_sha" ]; then - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - echo "JAR changed — updating." - mv $NEW_JAR $TARGET_JAR - git add $TARGET_JAR - git commit -m "Rebuild JAR for commit ${GITHUB_SHA}" - git push - else - echo "JAR unchanged — skipping commit." - fi - R-CMD-check: - needs: build-jar - runs-on: ${{ matrix.config.os }} name: R-CMD-check ${{ matrix.config.os }} (R ${{ matrix.config.r }}) @@ -107,12 +32,6 @@ jobs: with: fetch-depth: 0 - - name: Sync to latest HEAD including rebuilt JAR - run: | - git fetch origin "${{ github.ref_name }}" - git checkout "${{ github.ref_name }}" - git pull origin "${{ github.ref_name }}" - - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} @@ -147,8 +66,6 @@ jobs: working-directory: r-package R-CMD-check-CRAN: - needs: build-jar - runs-on: ${{ matrix.config.os }} name: R-CMD-check-CRAN @@ -168,12 +85,6 @@ jobs: with: fetch-depth: 0 - - name: Sync to latest HEAD including rebuilt JAR - run: | - git fetch origin "${{ github.ref_name }}" - git checkout "${{ github.ref_name }}" - git pull origin "${{ github.ref_name }}" - - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} @@ -194,8 +105,6 @@ jobs: NOT_CRAN: false test-coverage: - needs: build-jar - runs-on: ubuntu-22.04 steps: @@ -203,12 +112,6 @@ jobs: with: fetch-depth: 0 - - name: Sync to latest HEAD including rebuilt JAR - run: | - git fetch origin "${{ github.ref_name }}" - git checkout "${{ github.ref_name }}" - git pull origin "${{ github.ref_name }}" - - uses: r-lib/actions/setup-r@v2 - name: Java setup diff --git a/configure.win b/configure.win new file mode 100644 index 000000000..9cff6ed2c --- /dev/null +++ b/configure.win @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +sh ./configure \ No newline at end of file diff --git a/java-r5rcore/build.gradle b/java-r5rcore/build.gradle index aa6051c93..6f4878647 100644 --- a/java-r5rcore/build.gradle +++ b/java-r5rcore/build.gradle @@ -5,6 +5,8 @@ plugins { tasks.withType(Jar).configureEach { preserveFileTimestamps = false reproducibleFileOrder = true + archiveFileName.set("r5r.jar") + destinationDirectory.set(file("$rootDir/../r-package/inst/jar")) } group 'org.ipea' diff --git a/r-package/DESCRIPTION b/r-package/DESCRIPTION index d6b82ff89..2fef008a3 100644 --- a/r-package/DESCRIPTION +++ b/r-package/DESCRIPTION @@ -80,3 +80,4 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.3 SystemRequirements: Java JDK (>= 21.0) +Biarch: true diff --git a/r-package/inst/jar/.gitkeep b/r-package/inst/jar/.gitkeep new file mode 100644 index 000000000..e69de29bb From f38de5200be0f6fc9afc8ecefb0ed3406dd40cff Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 13:30:35 -0500 Subject: [PATCH 03/23] rename workflow as it no longer builds jar --- .github/workflows/{jar-and-R-ci.yaml => ci.jar} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{jar-and-R-ci.yaml => ci.jar} (100%) diff --git a/.github/workflows/jar-and-R-ci.yaml b/.github/workflows/ci.jar similarity index 100% rename from .github/workflows/jar-and-R-ci.yaml rename to .github/workflows/ci.jar From 46ed447944cb30fdab9193019f833274b9e8a627 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 13:31:07 -0500 Subject: [PATCH 04/23] remove jar from repo --- .gitignore | 2 ++ r-package/inst/jar/r5r.jar | Bin 151392 -> 0 bytes 2 files changed, 2 insertions(+) delete mode 100644 r-package/inst/jar/r5r.jar diff --git a/.gitignore b/.gitignore index 2f0b5cec2..fe32a7962 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ java-api/out java-api/target java-r5/target r-package/.Rproj.user +r-package/inst/jar/* +!r-package/inst/jar/.gitkeep r-package/.Rhistory R5.jar r5r_core.jar diff --git a/r-package/inst/jar/r5r.jar b/r-package/inst/jar/r5r.jar deleted file mode 100644 index 8bb993853e460424512e39a9ec2b0964519e57e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151392 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 From 5ccb67f3703150b1c4426ce34d2425849ee65c95 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 14:16:58 -0500 Subject: [PATCH 05/23] put configure in correct directory --- r-package/configure | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 r-package/configure diff --git a/r-package/configure b/r-package/configure new file mode 100755 index 000000000..530c1a49c --- /dev/null +++ b/r-package/configure @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +( + cd java-r5rcore + ./gradlew build +) \ No newline at end of file From 523eab846e680042cf1750c91926903d174f776c Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 14:17:14 -0500 Subject: [PATCH 06/23] fix paths --- r-package/configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/r-package/configure b/r-package/configure index 530c1a49c..6818aa1ee 100755 --- a/r-package/configure +++ b/r-package/configure @@ -1,6 +1,6 @@ #!/usr/bin/env sh ( - cd java-r5rcore + cd ../java-r5rcore ./gradlew build ) \ No newline at end of file From 6b99a076eac59463830f2bc08856b0f189bc1fc0 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 14:34:55 -0500 Subject: [PATCH 07/23] move java code into R package src/ directory so it is available to R CMD build --- r-package/configure | 3 ++- configure.win => r-package/configure.win | 0 {java-r5rcore => r-package/src}/.gitignore | 0 .../src}/.idea/artifacts/r5r_1_1_0_jar.xml | 0 {java-r5rcore => r-package/src}/.idea/misc.xml | 0 {java-r5rcore => r-package/src}/build.gradle | 4 ++-- .../src}/gradle/wrapper/gradle-wrapper.jar | Bin .../src}/gradle/wrapper/gradle-wrapper.properties | 0 {java-r5rcore => r-package/src}/gradlew | 0 {java-r5rcore => r-package/src}/gradlew.bat | 0 .../src}/src/main/resources/logback.xml | 0 .../src}/src/org/ipea/r5r/Fares/FarePerRoute.java | 0 .../src/org/ipea/r5r/Fares/FarePerTransfer.java | 0 .../src}/src/org/ipea/r5r/Fares/FarePerType.java | 0 .../src}/src/org/ipea/r5r/Fares/FareStructure.java | 0 .../org/ipea/r5r/Fares/FareStructureBuilder.java | 0 .../src}/src/org/ipea/r5r/Fares/IntegratedFare.java | 0 .../org/ipea/r5r/Fares/R5RTransferAllowance.java | 0 .../r5r/Fares/RuleBasedInRoutingFareCalculator.java | 0 .../src}/src/org/ipea/r5r/JsonUtil.java | 0 .../org/ipea/r5r/Modifications/R5RFileStorage.java | 0 .../src/org/ipea/r5r/Network/NetworkBuilder.java | 0 .../src/org/ipea/r5r/Network/NetworkChecker.java | 0 .../src}/src/org/ipea/r5r/Planner/Trip.java | 0 .../src}/src/org/ipea/r5r/Planner/TripLeg.java | 0 .../src}/src/org/ipea/r5r/Planner/TripPlanner.java | 0 .../ipea/r5r/Process/AccessibilityEstimator.java | 0 .../ipea/r5r/Process/DetailedItineraryPlanner.java | 0 .../src}/src/org/ipea/r5r/Process/FaretoDebug.java | 0 .../r5r/Process/FastDetailedItineraryPlanner.java | 0 .../ipea/r5r/Process/ParetoFrontierCalculator.java | 0 .../ipea/r5r/Process/ParetoItineraryPlanner.java | 0 .../src/org/ipea/r5r/Process/PathOptionsTable.java | 0 .../src/org/ipea/r5r/Process/R5DataFrameProcess.jav | 0 .../org/ipea/r5r/Process/R5DataFrameProcess.java | 0 .../src}/src/org/ipea/r5r/Process/R5Process.java | 0 .../org/ipea/r5r/Process/RegularGridProcess.java | 0 .../ipea/r5r/Process/TravelTimeMatrixComputer.java | 0 .../src}/src/org/ipea/r5r/R5/R5ParetoServer.java | 0 .../src/org/ipea/r5r/R5/R5TravelTimeComputer.java | 0 .../src}/src/org/ipea/r5r/R5RCore.java | 0 .../src}/src/org/ipea/r5r/RDataFrame.java | 0 .../src}/src/org/ipea/r5r/RegularGridResult.java | 0 .../src}/src/org/ipea/r5r/RoutingProperties.java | 0 .../src/org/ipea/r5r/Scenario/DummyScenario.java | 0 .../src/org/ipea/r5r/Scenario/R5RShapefileLts.java | 0 .../org/ipea/r5r/Scenario/R5RShapefileMatcher.java | 0 .../org/ipea/r5r/Scenario/RoadCongestionOSM.java | 0 .../src}/src/org/ipea/r5r/Scenario/SetLtsOsm.java | 0 .../src}/src/org/ipea/r5r/SnapFinder.java | 0 .../src}/src/org/ipea/r5r/StreetNetwork.java | 0 .../src}/src/org/ipea/r5r/TransitNetwork.java | 0 .../src}/src/org/ipea/r5r/Utils/RMapBuilder.java | 0 .../src}/src/org/ipea/r5r/Utils/SpeedSetter.java | 0 .../src}/src/org/ipea/r5r/Utils/Utils.java | 0 r-package/tests/tests_marcus/fares.R | 6 +++--- 56 files changed, 7 insertions(+), 6 deletions(-) rename configure.win => r-package/configure.win (100%) rename {java-r5rcore => r-package/src}/.gitignore (100%) rename {java-r5rcore => r-package/src}/.idea/artifacts/r5r_1_1_0_jar.xml (100%) rename {java-r5rcore => r-package/src}/.idea/misc.xml (100%) rename {java-r5rcore => r-package/src}/build.gradle (80%) rename {java-r5rcore => r-package/src}/gradle/wrapper/gradle-wrapper.jar (100%) rename {java-r5rcore => r-package/src}/gradle/wrapper/gradle-wrapper.properties (100%) rename {java-r5rcore => r-package/src}/gradlew (100%) rename {java-r5rcore => r-package/src}/gradlew.bat (100%) rename {java-r5rcore => r-package/src}/src/main/resources/logback.xml (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/FarePerRoute.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/FarePerTransfer.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/FarePerType.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/FareStructure.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/FareStructureBuilder.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/IntegratedFare.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/R5RTransferAllowance.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/JsonUtil.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Modifications/R5RFileStorage.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Network/NetworkBuilder.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Network/NetworkChecker.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Planner/Trip.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Planner/TripLeg.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Planner/TripPlanner.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/AccessibilityEstimator.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/FaretoDebug.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/PathOptionsTable.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/R5DataFrameProcess.jav (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/R5DataFrameProcess.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/R5Process.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/RegularGridProcess.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/R5/R5ParetoServer.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/R5/R5TravelTimeComputer.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/R5RCore.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/RDataFrame.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/RegularGridResult.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/RoutingProperties.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Scenario/DummyScenario.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Scenario/R5RShapefileLts.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Scenario/SetLtsOsm.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/SnapFinder.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/StreetNetwork.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/TransitNetwork.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Utils/RMapBuilder.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Utils/SpeedSetter.java (100%) rename {java-r5rcore => r-package/src}/src/org/ipea/r5r/Utils/Utils.java (100%) diff --git a/r-package/configure b/r-package/configure index 6818aa1ee..c160edd60 100755 --- a/r-package/configure +++ b/r-package/configure @@ -1,6 +1,7 @@ #!/usr/bin/env sh +set -x ( - cd ../java-r5rcore + cd src ./gradlew build ) \ No newline at end of file diff --git a/configure.win b/r-package/configure.win similarity index 100% rename from configure.win rename to r-package/configure.win diff --git a/java-r5rcore/.gitignore b/r-package/src/.gitignore similarity index 100% rename from java-r5rcore/.gitignore rename to r-package/src/.gitignore diff --git a/java-r5rcore/.idea/artifacts/r5r_1_1_0_jar.xml b/r-package/src/.idea/artifacts/r5r_1_1_0_jar.xml similarity index 100% rename from java-r5rcore/.idea/artifacts/r5r_1_1_0_jar.xml rename to r-package/src/.idea/artifacts/r5r_1_1_0_jar.xml diff --git a/java-r5rcore/.idea/misc.xml b/r-package/src/.idea/misc.xml similarity index 100% rename from java-r5rcore/.idea/misc.xml rename to r-package/src/.idea/misc.xml diff --git a/java-r5rcore/build.gradle b/r-package/src/build.gradle similarity index 80% rename from java-r5rcore/build.gradle rename to r-package/src/build.gradle index 6f4878647..a829421d8 100644 --- a/java-r5rcore/build.gradle +++ b/r-package/src/build.gradle @@ -6,7 +6,7 @@ tasks.withType(Jar).configureEach { preserveFileTimestamps = false reproducibleFileOrder = true archiveFileName.set("r5r.jar") - destinationDirectory.set(file("$rootDir/../r-package/inst/jar")) + destinationDirectory.set(file("inst/jar")) } group 'org.ipea' @@ -16,7 +16,7 @@ version '1.1.0999-SNAPSHOT' // grab def baos = new ByteArrayOutputStream() exec { - commandLine 'R', '--no-save', '-q', '-s', '-e', 'setwd("../r-package"); devtools::load_all(quiet=T); cat(download_r5());' + commandLine 'R', '--no-save', '-q', '-s', '-e', 'setwd(".."); devtools::load_all(quiet=T); cat(download_r5());' standardOutput = baos } def r5Path = baos.toString() diff --git a/java-r5rcore/gradle/wrapper/gradle-wrapper.jar b/r-package/src/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from java-r5rcore/gradle/wrapper/gradle-wrapper.jar rename to r-package/src/gradle/wrapper/gradle-wrapper.jar diff --git a/java-r5rcore/gradle/wrapper/gradle-wrapper.properties b/r-package/src/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from java-r5rcore/gradle/wrapper/gradle-wrapper.properties rename to r-package/src/gradle/wrapper/gradle-wrapper.properties diff --git a/java-r5rcore/gradlew b/r-package/src/gradlew similarity index 100% rename from java-r5rcore/gradlew rename to r-package/src/gradlew diff --git a/java-r5rcore/gradlew.bat b/r-package/src/gradlew.bat similarity index 100% rename from java-r5rcore/gradlew.bat rename to r-package/src/gradlew.bat diff --git a/java-r5rcore/src/main/resources/logback.xml b/r-package/src/src/main/resources/logback.xml similarity index 100% rename from java-r5rcore/src/main/resources/logback.xml rename to r-package/src/src/main/resources/logback.xml diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/FarePerRoute.java b/r-package/src/src/org/ipea/r5r/Fares/FarePerRoute.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/FarePerRoute.java rename to r-package/src/src/org/ipea/r5r/Fares/FarePerRoute.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/FarePerTransfer.java b/r-package/src/src/org/ipea/r5r/Fares/FarePerTransfer.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/FarePerTransfer.java rename to r-package/src/src/org/ipea/r5r/Fares/FarePerTransfer.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/FarePerType.java b/r-package/src/src/org/ipea/r5r/Fares/FarePerType.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/FarePerType.java rename to r-package/src/src/org/ipea/r5r/Fares/FarePerType.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/FareStructure.java b/r-package/src/src/org/ipea/r5r/Fares/FareStructure.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/FareStructure.java rename to r-package/src/src/org/ipea/r5r/Fares/FareStructure.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/FareStructureBuilder.java b/r-package/src/src/org/ipea/r5r/Fares/FareStructureBuilder.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/FareStructureBuilder.java rename to r-package/src/src/org/ipea/r5r/Fares/FareStructureBuilder.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/IntegratedFare.java b/r-package/src/src/org/ipea/r5r/Fares/IntegratedFare.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/IntegratedFare.java rename to r-package/src/src/org/ipea/r5r/Fares/IntegratedFare.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/R5RTransferAllowance.java b/r-package/src/src/org/ipea/r5r/Fares/R5RTransferAllowance.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/R5RTransferAllowance.java rename to r-package/src/src/org/ipea/r5r/Fares/R5RTransferAllowance.java diff --git a/java-r5rcore/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java b/r-package/src/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java rename to r-package/src/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java diff --git a/java-r5rcore/src/org/ipea/r5r/JsonUtil.java b/r-package/src/src/org/ipea/r5r/JsonUtil.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/JsonUtil.java rename to r-package/src/src/org/ipea/r5r/JsonUtil.java diff --git a/java-r5rcore/src/org/ipea/r5r/Modifications/R5RFileStorage.java b/r-package/src/src/org/ipea/r5r/Modifications/R5RFileStorage.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Modifications/R5RFileStorage.java rename to r-package/src/src/org/ipea/r5r/Modifications/R5RFileStorage.java diff --git a/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java b/r-package/src/src/org/ipea/r5r/Network/NetworkBuilder.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java rename to r-package/src/src/org/ipea/r5r/Network/NetworkBuilder.java diff --git a/java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java b/r-package/src/src/org/ipea/r5r/Network/NetworkChecker.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Network/NetworkChecker.java rename to r-package/src/src/org/ipea/r5r/Network/NetworkChecker.java diff --git a/java-r5rcore/src/org/ipea/r5r/Planner/Trip.java b/r-package/src/src/org/ipea/r5r/Planner/Trip.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Planner/Trip.java rename to r-package/src/src/org/ipea/r5r/Planner/Trip.java diff --git a/java-r5rcore/src/org/ipea/r5r/Planner/TripLeg.java b/r-package/src/src/org/ipea/r5r/Planner/TripLeg.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Planner/TripLeg.java rename to r-package/src/src/org/ipea/r5r/Planner/TripLeg.java diff --git a/java-r5rcore/src/org/ipea/r5r/Planner/TripPlanner.java b/r-package/src/src/org/ipea/r5r/Planner/TripPlanner.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Planner/TripPlanner.java rename to r-package/src/src/org/ipea/r5r/Planner/TripPlanner.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/AccessibilityEstimator.java b/r-package/src/src/org/ipea/r5r/Process/AccessibilityEstimator.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/AccessibilityEstimator.java rename to r-package/src/src/org/ipea/r5r/Process/AccessibilityEstimator.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java b/r-package/src/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java rename to r-package/src/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/FaretoDebug.java b/r-package/src/src/org/ipea/r5r/Process/FaretoDebug.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/FaretoDebug.java rename to r-package/src/src/org/ipea/r5r/Process/FaretoDebug.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java b/r-package/src/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java rename to r-package/src/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java b/r-package/src/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java rename to r-package/src/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java b/r-package/src/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java rename to r-package/src/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/PathOptionsTable.java b/r-package/src/src/org/ipea/r5r/Process/PathOptionsTable.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/PathOptionsTable.java rename to r-package/src/src/org/ipea/r5r/Process/PathOptionsTable.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/R5DataFrameProcess.jav b/r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.jav similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/R5DataFrameProcess.jav rename to r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.jav diff --git a/java-r5rcore/src/org/ipea/r5r/Process/R5DataFrameProcess.java b/r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/R5DataFrameProcess.java rename to r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/R5Process.java b/r-package/src/src/org/ipea/r5r/Process/R5Process.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/R5Process.java rename to r-package/src/src/org/ipea/r5r/Process/R5Process.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/RegularGridProcess.java b/r-package/src/src/org/ipea/r5r/Process/RegularGridProcess.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/RegularGridProcess.java rename to r-package/src/src/org/ipea/r5r/Process/RegularGridProcess.java diff --git a/java-r5rcore/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java b/r-package/src/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java rename to r-package/src/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java diff --git a/java-r5rcore/src/org/ipea/r5r/R5/R5ParetoServer.java b/r-package/src/src/org/ipea/r5r/R5/R5ParetoServer.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/R5/R5ParetoServer.java rename to r-package/src/src/org/ipea/r5r/R5/R5ParetoServer.java diff --git a/java-r5rcore/src/org/ipea/r5r/R5/R5TravelTimeComputer.java b/r-package/src/src/org/ipea/r5r/R5/R5TravelTimeComputer.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/R5/R5TravelTimeComputer.java rename to r-package/src/src/org/ipea/r5r/R5/R5TravelTimeComputer.java diff --git a/java-r5rcore/src/org/ipea/r5r/R5RCore.java b/r-package/src/src/org/ipea/r5r/R5RCore.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/R5RCore.java rename to r-package/src/src/org/ipea/r5r/R5RCore.java diff --git a/java-r5rcore/src/org/ipea/r5r/RDataFrame.java b/r-package/src/src/org/ipea/r5r/RDataFrame.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/RDataFrame.java rename to r-package/src/src/org/ipea/r5r/RDataFrame.java diff --git a/java-r5rcore/src/org/ipea/r5r/RegularGridResult.java b/r-package/src/src/org/ipea/r5r/RegularGridResult.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/RegularGridResult.java rename to r-package/src/src/org/ipea/r5r/RegularGridResult.java diff --git a/java-r5rcore/src/org/ipea/r5r/RoutingProperties.java b/r-package/src/src/org/ipea/r5r/RoutingProperties.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/RoutingProperties.java rename to r-package/src/src/org/ipea/r5r/RoutingProperties.java diff --git a/java-r5rcore/src/org/ipea/r5r/Scenario/DummyScenario.java b/r-package/src/src/org/ipea/r5r/Scenario/DummyScenario.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Scenario/DummyScenario.java rename to r-package/src/src/org/ipea/r5r/Scenario/DummyScenario.java diff --git a/java-r5rcore/src/org/ipea/r5r/Scenario/R5RShapefileLts.java b/r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileLts.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Scenario/R5RShapefileLts.java rename to r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileLts.java diff --git a/java-r5rcore/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java b/r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java rename to r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java diff --git a/java-r5rcore/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java b/r-package/src/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java rename to r-package/src/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java diff --git a/java-r5rcore/src/org/ipea/r5r/Scenario/SetLtsOsm.java b/r-package/src/src/org/ipea/r5r/Scenario/SetLtsOsm.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Scenario/SetLtsOsm.java rename to r-package/src/src/org/ipea/r5r/Scenario/SetLtsOsm.java diff --git a/java-r5rcore/src/org/ipea/r5r/SnapFinder.java b/r-package/src/src/org/ipea/r5r/SnapFinder.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/SnapFinder.java rename to r-package/src/src/org/ipea/r5r/SnapFinder.java diff --git a/java-r5rcore/src/org/ipea/r5r/StreetNetwork.java b/r-package/src/src/org/ipea/r5r/StreetNetwork.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/StreetNetwork.java rename to r-package/src/src/org/ipea/r5r/StreetNetwork.java diff --git a/java-r5rcore/src/org/ipea/r5r/TransitNetwork.java b/r-package/src/src/org/ipea/r5r/TransitNetwork.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/TransitNetwork.java rename to r-package/src/src/org/ipea/r5r/TransitNetwork.java diff --git a/java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java b/r-package/src/src/org/ipea/r5r/Utils/RMapBuilder.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java rename to r-package/src/src/org/ipea/r5r/Utils/RMapBuilder.java diff --git a/java-r5rcore/src/org/ipea/r5r/Utils/SpeedSetter.java b/r-package/src/src/org/ipea/r5r/Utils/SpeedSetter.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Utils/SpeedSetter.java rename to r-package/src/src/org/ipea/r5r/Utils/SpeedSetter.java diff --git a/java-r5rcore/src/org/ipea/r5r/Utils/Utils.java b/r-package/src/src/org/ipea/r5r/Utils/Utils.java similarity index 100% rename from java-r5rcore/src/org/ipea/r5r/Utils/Utils.java rename to r-package/src/src/org/ipea/r5r/Utils/Utils.java diff --git a/r-package/tests/tests_marcus/fares.R b/r-package/tests/tests_marcus/fares.R index 32fd0e738..0ff54ba61 100644 --- a/r-package/tests/tests_marcus/fares.R +++ b/r-package/tests/tests_marcus/fares.R @@ -1,11 +1,11 @@ library("tidyverse") -fare_schema_df <- read_csv("../java-r5rcore/src/main/resources/fares/rio/fare_schema.csv") -routes_info_df <- read_csv("../java-r5rcore/src/main/resources/fares/rio/routes_info.csv") +fare_schema_df <- read_csv("src/src/main/resources/fares/rio/fare_schema.csv") +routes_info_df <- read_csv("src/src/main/resources/fares/rio/routes_info.csv") modes_prices_df <- routes_info_df %>% select(type, price) %>% distinct() -modes_prices_df %>% write_csv("../java-r5rcore/src/main/resources/fares/rio/price_per_mode.csv") +modes_prices_df %>% write_csv("src/src/main/resources/fares/rio/price_per_mode.csv") From f8ba5cfa0cd54c56536ef750ea916d58e7072f80 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 14:48:10 -0500 Subject: [PATCH 08/23] suggest devtools for java build --- r-package/DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/r-package/DESCRIPTION b/r-package/DESCRIPTION index 2fef008a3..56fae64ea 100644 --- a/r-package/DESCRIPTION +++ b/r-package/DESCRIPTION @@ -73,7 +73,8 @@ Suggests: patchwork, rJavaEnv, rmarkdown, - testthat + testthat, + devtools VignetteBuilder: knitr Encoding: UTF-8 From 2cfb47c75dc7ecb6e2419eb01b20f66a98589b32 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 15:02:21 -0500 Subject: [PATCH 09/23] fix jar path --- r-package/src/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/r-package/src/build.gradle b/r-package/src/build.gradle index a829421d8..4fb452ac8 100644 --- a/r-package/src/build.gradle +++ b/r-package/src/build.gradle @@ -6,7 +6,7 @@ tasks.withType(Jar).configureEach { preserveFileTimestamps = false reproducibleFileOrder = true archiveFileName.set("r5r.jar") - destinationDirectory.set(file("inst/jar")) + destinationDirectory.set(file("../inst/jar")) } group 'org.ipea' From 792a659d489f5988abcfa1734f38a6980628fbbf Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 15:05:11 -0500 Subject: [PATCH 10/23] correct file extension --- .github/workflows/{ci.jar => ci.yml} | 1 - 1 file changed, 1 deletion(-) rename .github/workflows/{ci.jar => ci.yml} (99%) diff --git a/.github/workflows/ci.jar b/.github/workflows/ci.yml similarity index 99% rename from .github/workflows/ci.jar rename to .github/workflows/ci.yml index cd07c14ba..747b755f7 100644 --- a/.github/workflows/ci.jar +++ b/.github/workflows/ci.yml @@ -3,7 +3,6 @@ name: CI on: push: paths: - - java-r5rcore/** - r-package/** - .github/workflows/** From b432814bfc0f1d8fbf7d523ee87913300b3c7302 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 15:05:31 -0500 Subject: [PATCH 11/23] update gitignore for new java location --- .gitignore | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index fe32a7962..018899afd 100644 --- a/.gitignore +++ b/.gitignore @@ -17,15 +17,16 @@ poa_osm.pbf.mapdb poa_osm.pbf.mapdb.p /r-package/inst/extdata/spo/spo_osm.pbf.mapdb /r-package/inst/extdata/spo/spo_osm.pbf.mapdb.p -java-r5rcore/out/artifacts/r5r_jar/r5r.jar -java-r5rcore/out/production/r5r/org/ipea/r5r/DetailedItineraryPlanner.class -java-r5rcore/out/production/r5r/org/ipea/r5r/R5RCore.class -java-r5rcore/out/production/r5r/org/ipea/r5r/RDataFrame.class -java-r5rcore/out/production/r5r/org/ipea/r5r/TravelTimeMatrixComputer.class -java-r5rcore/out -java-r5rcore/libs +r-package/src/out/artifacts/r5r_jar/r5r.jar +r-package/src/out/production/r5r/org/ipea/r5r/DetailedItineraryPlanner.class +r-package/src/out/production/r5r/org/ipea/r5r/R5RCore.class +r-package/src/out/production/r5r/org/ipea/r5r/RDataFrame.class +r-package/src/out/production/r5r/org/ipea/r5r/TravelTimeMatrixComputer.class +r-package/src/out +r-package/src/libs +r-package/src/build .DS_Store -java-r5rcore/target +r-package/src/target .*.swp jpa-buddy.xml r5-*.jar From 88dbb054b2edd9a78fa0d5a8aede55fd59ced27a Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 18:21:10 -0500 Subject: [PATCH 12/23] move java code to r-package/java --- r-package/configure | 2 +- r-package/{src => java}/.gitignore | 0 .../{src => java}/.idea/artifacts/r5r_1_1_0_jar.xml | 0 r-package/{src => java}/.idea/misc.xml | 0 r-package/java/README | 2 -- r-package/{src => java}/build.gradle | 0 .../{src => java}/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 r-package/{src => java}/gradlew | 0 r-package/{src => java}/gradlew.bat | 0 .../{src => java}/src/main/resources/logback.xml | 0 .../src/org/ipea/r5r/Fares/FarePerRoute.java | 0 .../src/org/ipea/r5r/Fares/FarePerTransfer.java | 0 .../src/org/ipea/r5r/Fares/FarePerType.java | 0 .../src/org/ipea/r5r/Fares/FareStructure.java | 0 .../org/ipea/r5r/Fares/FareStructureBuilder.java | 0 .../src/org/ipea/r5r/Fares/IntegratedFare.java | 0 .../org/ipea/r5r/Fares/R5RTransferAllowance.java | 0 .../r5r/Fares/RuleBasedInRoutingFareCalculator.java | 0 .../{src => java}/src/org/ipea/r5r/JsonUtil.java | 0 .../org/ipea/r5r/Modifications/R5RFileStorage.java | 0 .../src/org/ipea/r5r/Network/NetworkBuilder.java | 0 .../src/org/ipea/r5r/Network/NetworkChecker.java | 0 .../src/org/ipea/r5r/Planner/Trip.java | 0 .../src/org/ipea/r5r/Planner/TripLeg.java | 0 .../src/org/ipea/r5r/Planner/TripPlanner.java | 0 .../ipea/r5r/Process/AccessibilityEstimator.java | 0 .../ipea/r5r/Process/DetailedItineraryPlanner.java | 0 .../src/org/ipea/r5r/Process/FaretoDebug.java | 0 .../r5r/Process/FastDetailedItineraryPlanner.java | 0 .../ipea/r5r/Process/ParetoFrontierCalculator.java | 0 .../ipea/r5r/Process/ParetoItineraryPlanner.java | 0 .../src/org/ipea/r5r/Process/PathOptionsTable.java | 0 .../src/org/ipea/r5r/Process/R5DataFrameProcess.jav | 0 .../org/ipea/r5r/Process/R5DataFrameProcess.java | 0 .../src/org/ipea/r5r/Process/R5Process.java | 0 .../org/ipea/r5r/Process/RegularGridProcess.java | 0 .../ipea/r5r/Process/TravelTimeMatrixComputer.java | 0 .../src/org/ipea/r5r/R5/R5ParetoServer.java | 0 .../src/org/ipea/r5r/R5/R5TravelTimeComputer.java | 0 .../{src => java}/src/org/ipea/r5r/R5RCore.java | 0 .../{src => java}/src/org/ipea/r5r/RDataFrame.java | 0 .../src/org/ipea/r5r/RegularGridResult.java | 0 .../src/org/ipea/r5r/RoutingProperties.java | 0 .../src/org/ipea/r5r/Scenario/DummyScenario.java | 0 .../src/org/ipea/r5r/Scenario/R5RShapefileLts.java | 0 .../org/ipea/r5r/Scenario/R5RShapefileMatcher.java | 0 .../org/ipea/r5r/Scenario/RoadCongestionOSM.java | 0 .../src/org/ipea/r5r/Scenario/SetLtsOsm.java | 0 .../{src => java}/src/org/ipea/r5r/SnapFinder.java | 0 .../src/org/ipea/r5r/StreetNetwork.java | 0 .../src/org/ipea/r5r/TransitNetwork.java | 0 .../src/org/ipea/r5r/Utils/RMapBuilder.java | 0 .../src/org/ipea/r5r/Utils/SpeedSetter.java | 0 .../{src => java}/src/org/ipea/r5r/Utils/Utils.java | 0 55 files changed, 1 insertion(+), 3 deletions(-) rename r-package/{src => java}/.gitignore (100%) rename r-package/{src => java}/.idea/artifacts/r5r_1_1_0_jar.xml (100%) rename r-package/{src => java}/.idea/misc.xml (100%) delete mode 100644 r-package/java/README rename r-package/{src => java}/build.gradle (100%) rename r-package/{src => java}/gradle/wrapper/gradle-wrapper.jar (100%) rename r-package/{src => java}/gradle/wrapper/gradle-wrapper.properties (100%) rename r-package/{src => java}/gradlew (100%) rename r-package/{src => java}/gradlew.bat (100%) rename r-package/{src => java}/src/main/resources/logback.xml (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/FarePerRoute.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/FarePerTransfer.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/FarePerType.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/FareStructure.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/FareStructureBuilder.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/IntegratedFare.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/R5RTransferAllowance.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/JsonUtil.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Modifications/R5RFileStorage.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Network/NetworkBuilder.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Network/NetworkChecker.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Planner/Trip.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Planner/TripLeg.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Planner/TripPlanner.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/AccessibilityEstimator.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/FaretoDebug.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/PathOptionsTable.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/R5DataFrameProcess.jav (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/R5DataFrameProcess.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/R5Process.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/RegularGridProcess.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/R5/R5ParetoServer.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/R5/R5TravelTimeComputer.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/R5RCore.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/RDataFrame.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/RegularGridResult.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/RoutingProperties.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Scenario/DummyScenario.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Scenario/R5RShapefileLts.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Scenario/SetLtsOsm.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/SnapFinder.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/StreetNetwork.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/TransitNetwork.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Utils/RMapBuilder.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Utils/SpeedSetter.java (100%) rename r-package/{src => java}/src/org/ipea/r5r/Utils/Utils.java (100%) diff --git a/r-package/configure b/r-package/configure index c160edd60..61cb609fc 100755 --- a/r-package/configure +++ b/r-package/configure @@ -2,6 +2,6 @@ set -x ( - cd src + cd java ./gradlew build ) \ No newline at end of file diff --git a/r-package/src/.gitignore b/r-package/java/.gitignore similarity index 100% rename from r-package/src/.gitignore rename to r-package/java/.gitignore diff --git a/r-package/src/.idea/artifacts/r5r_1_1_0_jar.xml b/r-package/java/.idea/artifacts/r5r_1_1_0_jar.xml similarity index 100% rename from r-package/src/.idea/artifacts/r5r_1_1_0_jar.xml rename to r-package/java/.idea/artifacts/r5r_1_1_0_jar.xml diff --git a/r-package/src/.idea/misc.xml b/r-package/java/.idea/misc.xml similarity index 100% rename from r-package/src/.idea/misc.xml rename to r-package/java/.idea/misc.xml diff --git a/r-package/java/README b/r-package/java/README deleted file mode 100644 index 7abfa6f7a..000000000 --- a/r-package/java/README +++ /dev/null @@ -1,2 +0,0 @@ -Make CRAN quiet about: - Package has FOSS license, installs .class/.jar but has no 'java' directory. \ No newline at end of file diff --git a/r-package/src/build.gradle b/r-package/java/build.gradle similarity index 100% rename from r-package/src/build.gradle rename to r-package/java/build.gradle diff --git a/r-package/src/gradle/wrapper/gradle-wrapper.jar b/r-package/java/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from r-package/src/gradle/wrapper/gradle-wrapper.jar rename to r-package/java/gradle/wrapper/gradle-wrapper.jar diff --git a/r-package/src/gradle/wrapper/gradle-wrapper.properties b/r-package/java/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from r-package/src/gradle/wrapper/gradle-wrapper.properties rename to r-package/java/gradle/wrapper/gradle-wrapper.properties diff --git a/r-package/src/gradlew b/r-package/java/gradlew similarity index 100% rename from r-package/src/gradlew rename to r-package/java/gradlew diff --git a/r-package/src/gradlew.bat b/r-package/java/gradlew.bat similarity index 100% rename from r-package/src/gradlew.bat rename to r-package/java/gradlew.bat diff --git a/r-package/src/src/main/resources/logback.xml b/r-package/java/src/main/resources/logback.xml similarity index 100% rename from r-package/src/src/main/resources/logback.xml rename to r-package/java/src/main/resources/logback.xml diff --git a/r-package/src/src/org/ipea/r5r/Fares/FarePerRoute.java b/r-package/java/src/org/ipea/r5r/Fares/FarePerRoute.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/FarePerRoute.java rename to r-package/java/src/org/ipea/r5r/Fares/FarePerRoute.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/FarePerTransfer.java b/r-package/java/src/org/ipea/r5r/Fares/FarePerTransfer.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/FarePerTransfer.java rename to r-package/java/src/org/ipea/r5r/Fares/FarePerTransfer.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/FarePerType.java b/r-package/java/src/org/ipea/r5r/Fares/FarePerType.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/FarePerType.java rename to r-package/java/src/org/ipea/r5r/Fares/FarePerType.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/FareStructure.java b/r-package/java/src/org/ipea/r5r/Fares/FareStructure.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/FareStructure.java rename to r-package/java/src/org/ipea/r5r/Fares/FareStructure.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/FareStructureBuilder.java b/r-package/java/src/org/ipea/r5r/Fares/FareStructureBuilder.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/FareStructureBuilder.java rename to r-package/java/src/org/ipea/r5r/Fares/FareStructureBuilder.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/IntegratedFare.java b/r-package/java/src/org/ipea/r5r/Fares/IntegratedFare.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/IntegratedFare.java rename to r-package/java/src/org/ipea/r5r/Fares/IntegratedFare.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/R5RTransferAllowance.java b/r-package/java/src/org/ipea/r5r/Fares/R5RTransferAllowance.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/R5RTransferAllowance.java rename to r-package/java/src/org/ipea/r5r/Fares/R5RTransferAllowance.java diff --git a/r-package/src/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java b/r-package/java/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java rename to r-package/java/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java diff --git a/r-package/src/src/org/ipea/r5r/JsonUtil.java b/r-package/java/src/org/ipea/r5r/JsonUtil.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/JsonUtil.java rename to r-package/java/src/org/ipea/r5r/JsonUtil.java diff --git a/r-package/src/src/org/ipea/r5r/Modifications/R5RFileStorage.java b/r-package/java/src/org/ipea/r5r/Modifications/R5RFileStorage.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Modifications/R5RFileStorage.java rename to r-package/java/src/org/ipea/r5r/Modifications/R5RFileStorage.java diff --git a/r-package/src/src/org/ipea/r5r/Network/NetworkBuilder.java b/r-package/java/src/org/ipea/r5r/Network/NetworkBuilder.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Network/NetworkBuilder.java rename to r-package/java/src/org/ipea/r5r/Network/NetworkBuilder.java diff --git a/r-package/src/src/org/ipea/r5r/Network/NetworkChecker.java b/r-package/java/src/org/ipea/r5r/Network/NetworkChecker.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Network/NetworkChecker.java rename to r-package/java/src/org/ipea/r5r/Network/NetworkChecker.java diff --git a/r-package/src/src/org/ipea/r5r/Planner/Trip.java b/r-package/java/src/org/ipea/r5r/Planner/Trip.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Planner/Trip.java rename to r-package/java/src/org/ipea/r5r/Planner/Trip.java diff --git a/r-package/src/src/org/ipea/r5r/Planner/TripLeg.java b/r-package/java/src/org/ipea/r5r/Planner/TripLeg.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Planner/TripLeg.java rename to r-package/java/src/org/ipea/r5r/Planner/TripLeg.java diff --git a/r-package/src/src/org/ipea/r5r/Planner/TripPlanner.java b/r-package/java/src/org/ipea/r5r/Planner/TripPlanner.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Planner/TripPlanner.java rename to r-package/java/src/org/ipea/r5r/Planner/TripPlanner.java diff --git a/r-package/src/src/org/ipea/r5r/Process/AccessibilityEstimator.java b/r-package/java/src/org/ipea/r5r/Process/AccessibilityEstimator.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/AccessibilityEstimator.java rename to r-package/java/src/org/ipea/r5r/Process/AccessibilityEstimator.java diff --git a/r-package/src/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java b/r-package/java/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java rename to r-package/java/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java diff --git a/r-package/src/src/org/ipea/r5r/Process/FaretoDebug.java b/r-package/java/src/org/ipea/r5r/Process/FaretoDebug.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/FaretoDebug.java rename to r-package/java/src/org/ipea/r5r/Process/FaretoDebug.java diff --git a/r-package/src/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java b/r-package/java/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java rename to r-package/java/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java diff --git a/r-package/src/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java b/r-package/java/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java rename to r-package/java/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java diff --git a/r-package/src/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java b/r-package/java/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java rename to r-package/java/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java diff --git a/r-package/src/src/org/ipea/r5r/Process/PathOptionsTable.java b/r-package/java/src/org/ipea/r5r/Process/PathOptionsTable.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/PathOptionsTable.java rename to r-package/java/src/org/ipea/r5r/Process/PathOptionsTable.java diff --git a/r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.jav b/r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.jav similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.jav rename to r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.jav diff --git a/r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.java b/r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/R5DataFrameProcess.java rename to r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.java diff --git a/r-package/src/src/org/ipea/r5r/Process/R5Process.java b/r-package/java/src/org/ipea/r5r/Process/R5Process.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/R5Process.java rename to r-package/java/src/org/ipea/r5r/Process/R5Process.java diff --git a/r-package/src/src/org/ipea/r5r/Process/RegularGridProcess.java b/r-package/java/src/org/ipea/r5r/Process/RegularGridProcess.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/RegularGridProcess.java rename to r-package/java/src/org/ipea/r5r/Process/RegularGridProcess.java diff --git a/r-package/src/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java b/r-package/java/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java rename to r-package/java/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java diff --git a/r-package/src/src/org/ipea/r5r/R5/R5ParetoServer.java b/r-package/java/src/org/ipea/r5r/R5/R5ParetoServer.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/R5/R5ParetoServer.java rename to r-package/java/src/org/ipea/r5r/R5/R5ParetoServer.java diff --git a/r-package/src/src/org/ipea/r5r/R5/R5TravelTimeComputer.java b/r-package/java/src/org/ipea/r5r/R5/R5TravelTimeComputer.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/R5/R5TravelTimeComputer.java rename to r-package/java/src/org/ipea/r5r/R5/R5TravelTimeComputer.java diff --git a/r-package/src/src/org/ipea/r5r/R5RCore.java b/r-package/java/src/org/ipea/r5r/R5RCore.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/R5RCore.java rename to r-package/java/src/org/ipea/r5r/R5RCore.java diff --git a/r-package/src/src/org/ipea/r5r/RDataFrame.java b/r-package/java/src/org/ipea/r5r/RDataFrame.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/RDataFrame.java rename to r-package/java/src/org/ipea/r5r/RDataFrame.java diff --git a/r-package/src/src/org/ipea/r5r/RegularGridResult.java b/r-package/java/src/org/ipea/r5r/RegularGridResult.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/RegularGridResult.java rename to r-package/java/src/org/ipea/r5r/RegularGridResult.java diff --git a/r-package/src/src/org/ipea/r5r/RoutingProperties.java b/r-package/java/src/org/ipea/r5r/RoutingProperties.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/RoutingProperties.java rename to r-package/java/src/org/ipea/r5r/RoutingProperties.java diff --git a/r-package/src/src/org/ipea/r5r/Scenario/DummyScenario.java b/r-package/java/src/org/ipea/r5r/Scenario/DummyScenario.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Scenario/DummyScenario.java rename to r-package/java/src/org/ipea/r5r/Scenario/DummyScenario.java diff --git a/r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileLts.java b/r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileLts.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileLts.java rename to r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileLts.java diff --git a/r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java b/r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java rename to r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java diff --git a/r-package/src/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java b/r-package/java/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java rename to r-package/java/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java diff --git a/r-package/src/src/org/ipea/r5r/Scenario/SetLtsOsm.java b/r-package/java/src/org/ipea/r5r/Scenario/SetLtsOsm.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Scenario/SetLtsOsm.java rename to r-package/java/src/org/ipea/r5r/Scenario/SetLtsOsm.java diff --git a/r-package/src/src/org/ipea/r5r/SnapFinder.java b/r-package/java/src/org/ipea/r5r/SnapFinder.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/SnapFinder.java rename to r-package/java/src/org/ipea/r5r/SnapFinder.java diff --git a/r-package/src/src/org/ipea/r5r/StreetNetwork.java b/r-package/java/src/org/ipea/r5r/StreetNetwork.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/StreetNetwork.java rename to r-package/java/src/org/ipea/r5r/StreetNetwork.java diff --git a/r-package/src/src/org/ipea/r5r/TransitNetwork.java b/r-package/java/src/org/ipea/r5r/TransitNetwork.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/TransitNetwork.java rename to r-package/java/src/org/ipea/r5r/TransitNetwork.java diff --git a/r-package/src/src/org/ipea/r5r/Utils/RMapBuilder.java b/r-package/java/src/org/ipea/r5r/Utils/RMapBuilder.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Utils/RMapBuilder.java rename to r-package/java/src/org/ipea/r5r/Utils/RMapBuilder.java diff --git a/r-package/src/src/org/ipea/r5r/Utils/SpeedSetter.java b/r-package/java/src/org/ipea/r5r/Utils/SpeedSetter.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Utils/SpeedSetter.java rename to r-package/java/src/org/ipea/r5r/Utils/SpeedSetter.java diff --git a/r-package/src/src/org/ipea/r5r/Utils/Utils.java b/r-package/java/src/org/ipea/r5r/Utils/Utils.java similarity index 100% rename from r-package/src/src/org/ipea/r5r/Utils/Utils.java rename to r-package/java/src/org/ipea/r5r/Utils/Utils.java From 0649e59477e801af9110bcfbb741246ad469154f Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 18:26:35 -0500 Subject: [PATCH 13/23] validate gradle wrapper now that build is not happening in GH Actions --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 747b755f7..18274cf24 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,6 @@ name: CI on: push: - paths: - - r-package/** - - .github/workflows/** jobs: R-CMD-check: @@ -31,6 +28,9 @@ jobs: with: fetch-depth: 0 + # ensure our gradle wrapper is correct, https://github.com/gradle/actions/blob/main/docs/wrapper-validation.md + - uses: gradle/actions/wrapper-validation@v5 + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} From 9c8da648d9cf1b3a17917cd4d656cc9d663f54ed Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Thu, 1 Jan 2026 18:38:41 -0500 Subject: [PATCH 14/23] fix gitignore for renamed packages --- .gitignore | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 018899afd..35f5c5215 100644 --- a/.gitignore +++ b/.gitignore @@ -17,16 +17,16 @@ poa_osm.pbf.mapdb poa_osm.pbf.mapdb.p /r-package/inst/extdata/spo/spo_osm.pbf.mapdb /r-package/inst/extdata/spo/spo_osm.pbf.mapdb.p -r-package/src/out/artifacts/r5r_jar/r5r.jar -r-package/src/out/production/r5r/org/ipea/r5r/DetailedItineraryPlanner.class -r-package/src/out/production/r5r/org/ipea/r5r/R5RCore.class -r-package/src/out/production/r5r/org/ipea/r5r/RDataFrame.class -r-package/src/out/production/r5r/org/ipea/r5r/TravelTimeMatrixComputer.class -r-package/src/out -r-package/src/libs -r-package/src/build +r-package/java/out/artifacts/r5r_jar/r5r.jar +r-package/java/out/production/r5r/org/ipea/r5r/DetailedItineraryPlanner.class +r-package/java/out/production/r5r/org/ipea/r5r/R5RCore.class +r-package/java/out/production/r5r/org/ipea/r5r/RDataFrame.class +r-package/java/out/production/r5r/org/ipea/r5r/TravelTimeMatrixComputer.class +r-package/java/out +r-package/java/libs +r-package/java/build .DS_Store -r-package/src/target +r-package/java/target .*.swp jpa-buddy.xml r5-*.jar From 547024b704d92ff422eb7843a8c0d3e8b802e752 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 13:44:16 -0400 Subject: [PATCH 15/23] update to gradle 9 for r5 7.5 compatibility --- .gitmodules | 3 +++ .../java/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 48966 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- r-package/java/gradlew | 15 +++++------ r-package/java/gradlew.bat | 25 +++++++++--------- r-package/java/r5 | 1 + 6 files changed, 25 insertions(+), 21 deletions(-) create mode 100644 .gitmodules create mode 160000 r-package/java/r5 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..df28241c7 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "r-package/java/r5"] + path = r-package/java/r5 + url = https://github.com/conveyal/r5.git diff --git a/r-package/java/gradle/wrapper/gradle-wrapper.jar b/r-package/java/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..d997cfc60f4cff0e7451d19d49a82fa986695d07 100644 GIT binary patch delta 40580 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 AEdT%j delta 35303 zcmX7vV|$!!7lqrfv2EM7ZQFLzxWP1<*tTt(6Q?m7n~m+aecnGXAMR_dy^nRSJ;NVh z!}DNuc8H3%3cn`g#25n%eD< zG_zQ`ODc$zIGhfJv|Y3vu^7R(3!Tz9_lUNEG}euSOh73Vs}R!L?`Ex+KAMEIN}QcM zOwlIvxLIw`aRz!-!k3jBk6a}J?_(WmIFD^wmg!m%&wOU0D8-=RXrs%732>@^pqAl<-Bi(F5S(=atv72#=azm(iPZp#MnlP zo=9upJ~ke$;%57RW1=gKXz7{3r$3iho@I@2%@kc(JZwjqmzivAy&t}>UyU*4;4dE^ zat#$xTM`$dYiN;YWL1fZQ1_jgbajQp4f+7PN+fdabt+MfE6NUh|sb;w508z z@n~)ZH-<0ISiV8HR$dJ>8NaPgIB=cEqyVK9TTHvO*=dH`G~-}Y68AHAO?rBd9oA^* zRy)Cwsn1O3d9eUUjj^kTe`->n&zTXj+maSZmaVty#yEqTmlYDm)%oZrIFY~tixg0> zd!oFtB|DItnP0w%B&1w6XW+5gGv93`*1%sT8rR6x(*`-y^iIuWPSjRni&8>Dk`;MX z&_bHgn6ng^eiwZG8su-ON7XXJehj1Fw%N)#os9A$ec(KMR^NG66i4?FnjR=kJ z_!=^yvA0GBt@PJN4n9AU#n#Qs6p2Kwyh6voHpbzFSRVJ`C?kwqtoA@#Te&~AD*`)5 zz;GI(?2Q79iT128=^pYPiT;T(_fM0kBiNTOjbFk4Q)4cgDBxTXO$1$F9!##a_~*AL zh8kiA6Pt((bzAwk!NH=hWDzugUv8cq^na!}8}*W~y^(YKi8AuYGoHQ(CS5z~fr%y# zZ z3%GQ((W04ys}aq&)WVBb#+%gkDl_?MQqNRu#z{s9g8&eNw>d)}Fjk+2v<98Cnb5+E z#TuMQDq$aff8Tj#00ykzzG*`7vhuP=nKMVJ!vVSCgI@f}#z8X9XMx)e4uV+P$5;a=- z8WBY58_X5v&Ty@2ZQ(e;aKbMLP+|#d5A9GZWtXsY1yG~Ln6A7RyM!DIxZSM4S?$3e z6SZ*n5z7Jrs2s_XPT3~>7c3bFGx|~)!}!%D@%G|@_8rP{gk+sp2xdkofW14T)4&FE zGiB1}_Or~sgBqtCRPwQyk3scn=ivH~)(|uO_qnO`QkO9Mj_gm|8c&%J$0hrG$tbdQ zou`;*u2TH$t{`@$c#HEZ81hfBf2vd4JLA#+tGX75|3vpjLXl|PNDgS$uv3~hM)x-q zhHWOsx?ENX=x<^DI@FI2sV*(fqNo52KQwr3(Dk{kASk}CK#hnU-) zxLYiFBt*Vzr3Lx~asnpS=kFS3QoAb-%F*Q3@5E)Rlh`A**vaZt`1SAwxm1a(GM}q^ z)j1SUy)0@F=2cfHK$rs@e^6z#g3sca60Crdp{%+pRb|tM9_(t&At6mfi7Z-3wJ})H^I93f^~N7Msom*ly`#)3D2!>2BhZ zch(MsZq z5?{zO- zS6xJH0o>O!p3>l(96xo!qfW8jEx4jqO4X*D6JvTv&~F|Mh3Yc5$UJ)*Ssr`Mh1GE{ z`uS#FU0$xkx+ev~m|H~cfq?=Xs)9w7#<7QrH==URKB=$JL1)J}4JXIv>N&`dxw8CZ zX1H3|fDB9P?Rgx8KCVhlkv31Sest`TXNp;?PBN$Y~6ph4b_TQ2a0eot$k(7kdb<=%WQz#g9@8pmv(oLej)q8e4O3^XIV9KQ|E>UbQlSfB9kn{hymU$te;Qaj5_{ zo@f?-y_CV~z+1pzr(^yN%prrlp{!Y=sk%&hj%jfcS{mAk8B-g12ybi{Qwd?!w z%tZ^IXprp>A+Ba+A8G;gh~PO*&QbtgMWvo4yPZweJ||b(sWUIWX14W@w9-eu=PEQ? zB2|P?DbaR$_R7P8j;nl!Sx&e@gmV$TXO=jtB_{!PnyRpeA$M243mcSyib&q4l zgw|$9M~6sTUvjrPs3?-OrW=n8qhh?Q9n^`bLDrTE9R3u}JMGrw$%+z8DkVUt`r6I| zB%gxa!k@?CUIsA8<;9uV5VrQi9<5L9u|Ws*63@R5733n&~Zp6+BzHfyKa`kwmvbsAjm zo_L`65+0y{Pg$cBXRC9@D-HlmfiL6Lg56jJ85NU_z6v=txENkTp~ut=d7@5#*t@J& zfOr+Y2&qxy4eODo#WDoxuGok*=QA8_T87o8M{M3Hqx*JYMhA$Mt;;%tiboOZu zf^qvS8S8={>TsA>C<@rw7MyX(!~Q7QdgS|hC@VY zfYIgRDTD2#}vaE$p*8uMl5vSb$o>m&1yQn!RSsRahgt2-#- zDEsh?wzmT%JaZ&_toCrIi>Yi)S-%_70?(o6y82X(Xi%PK$lciN&)G3@Cfm(q<3%mh z-IKB$qK|QxlSn2sVK)F+9HXtfTr~|Q*^T+lP;236s$&&NmvVIbufwpxNp@pxxXa%t zJ+p>Q>TSCk)^WtKcHuKSr+-S#(qB-Q9MINuC{U~%dEdh#+t^ct!o?5-t!X}zB5=!`OrQ>!S3 z0f)3j-r@Hq2Al$nwGa5zcsK<8b*@3>J>8+`hO%d7&F&4vf)mOG{^7L zMlNj2mbV1y;0JiB4(;1tD7!q7mg3tdz#WA;r+)F_!T^x)<2=IZuw9sOTMY*XLsC?dG~Yb!u3Nd0iT@wh*<;2${GtcdK%3r&xx48EK+~OX*g;oWysWAIj``v zJb;raRsAVNv(kv?OfyhIbq&y8@^We#wB zv6E@0t0<((CD`}K<+XOUFRCV)C0e&#h;&eNx;IVrQCi*KOnhj2Eb6|rK{eBs?#=Z9 zL{TJsIRlk<`&5?H?L(v#dnlSnc!5>wQr7XZ0s=T@VX7S9<&CrJkaL#I#QHywb*2lC za;~_SqR3t#IlDs{7!s}dqF$VBv$Et(&-%z~xc$KlXy$ag*{&FBamrTTl?k(QSEn6zVGaUk4iC)?l?!$<6NcwIVEF{Hij~(O;&yL_dP*zC%5eNiU=p_UostN{Vs+|YWth2_rRdl~dEpR~L zR#L^|Sj$KhlpjO~$ox^l^nxu7yJ&V{1rUWM6QAXzxa^Z9w(UXV%To;8xhuKhKLVnq zj!gPG-@~i-yb=iM91-wE?7kX;=A~FZu{E_u#~O#Sp0tY*s zR3>0p)YL6!;gPhur$#?Oq#Y$xF8DE^`W9_r&x8A$b~Uei(?G-Rj9>j7?%(#)4opK@ zf%@{r6!FVn>;Mjd{^i@ZZ-22vB9a7R;v0!NAWG4g7iDV(cD36LP28Z*I?38J&^W7q zw6*i0Mtyay_*^M=AG+r}QZ6^>+D@=u3(* zv+v3lVAi*^xxJmPsJPnNQmWFX|n})V%oYsiX**RwkWa~S_qy!;N1T^B?(wSX8q~B;TpEK|E z?n_L<1X+Aga!si;17?m0A+wQvAqs(fl#xS8CEhz0MMfs=wQyVsi3W;^1uN~0)U(n{evTP ze()8mAWs}QR%&5hc?dqjJ8Oss7|8UQuq7z|5%-gdZfWjX2bOWp_bDOIKnozwPQ-Qp z8RpMi6ETrCv4>hy#vKdi63+pIF>-wR{r(cVJeLO)nO5C{SNm9(E}ze*rUbS-`!kwnrzthXP@ zw(W0H{wK0l_$0jsPM&k`%_G0f3GcNnfd3m9b080JdSs;XcdTu|na=>n0*%I&=6r>r z+XF-9tLE%tRsqSk)B((OH1qYHoRUkxH@|5*o*drhNe88(ML#vyryfg4+~G79enC~@ znqP*`PO0{pUz|eiKus7mHtnL)6C5xC$a96-!B)^x(2W@+hzm;1#_+SvrZT6y%@%OL z@B((Wl6@cpYlnlyVPp)*z$`pTv+XYUkKQKI_bI>a8&sX!b|&;-oH>kaC$9wn^TNp| z4gBdGLjYWdi-KiF{_s|PS5Lmrisu02ADoHiHyt2X`1sxUPU59$SOH_8Ejx2CTI5$` zF*S79U6ut>)HGe}419leWc9MU2?R51Ir{S(@SOT~JIkfFZT*tOOPr*^tkeZ4wPr72 z|5h4U-tb-L+{6CJ9g@|;V^J$(FKqK!W?f%>o$5;&D4wHw#1v;|# zWCaAG0Cm-#ZaE*z##6*^bW^a1VWLdMO$C65cT zX8ubSOcTaK%YPLw3;AENfTWfNIH9p16L94QCo~D4go9TSCeUU&sKynvREX1Q5KGuB z<`Mq5y-?&-?A}a1kB&orCwYTYl*WJh`bNFrl2NgaEcoQTndzOA{#WiFU_ZawvpsqE z`0%{#hVXZYVE8~AvfpWMNLwJ{Xt83lDdtqVhs&zMp z$4#u7LCJv$hlfg63>3fBHbs^}$+EN=*Wf2Dg{wh0&Awf~_a&02Z`BTB4T|P5x)T1L z3~{uBPo@_{8+014JV3|>pl;^VI#Uj%LMRgn5@~<0cU}A$;lsryA-EcI-RM_~2IX@; zb)4()w%A898An6QpsJqIFXMB!GC9}*iT}}R#wPL_kSV2wyYu52MdJ{afuYh@HqvV5 zJLMiJf(l?afA9tmw+iY)J)ph(WV66JF%Cu31JE~rskr5Q^CIidqR`fokjsIFH73LfPY<}rVhhCZ z%6Ido2j98_(?hNart=~{ZkQmO2b{v5ai4m}*DvlklG{oirx7A4q+74V{u$nz{mmYulYDobQr`vyBKGg#<%Nd=-Ga`@VF{90Epl)$5z$n zfgjq~N+lcT6r;qJRlX8`Vf7!c)6DsmDNY+ou2+M9+7?B}W8GFk7WrF8e;_Mnotl=_ ze9w5$Sesg_M1$EZLr4F$@-7lslSrcSO9Q_<#U<6mMb;*ni#Me%3xu$4PW|rlSw&@_ zM~%?>DMsYsOcjc;PJ!ly4Vcr9yPsF3%Bz2BiSf}^Aip@%?lVQLW???99EjV@4>umA z>OGg3w);!yS`7lAaEfO2r}E;srBq0+9m1F^WJ>+A6(^);!EP2c&+wn`+0bpR(mui9 zY3??;U5IQVep=q6hnU*@)FZ09L!hfZT{AtwAEr5k_F@)(Mw2ybBYL5FOK*ecSY^8- zs9vbcT44IO+5*t5#}NJ+UF`o9xPV?5pz{BkW@Xj3S@%IxnR1Jq&FPY<_DdZi96TWr;gp?c z%ybZ*dVb?MghJ^l1g|69m|A`^-Wf8DqcW*d+$g5fdR|Ds!dy6-Rp*#RAV8y(pq<63 zbHFw@b7ys_L#e&w!M*o)d;*wEWT)MJK}4`9yQl>Ed4WtB=8#<_UL^V9 zJ|ATt8A-f|M&@WFJQBr^0QAj(7_*uIUYcx|#5|pkV99Z{Ut%dDCmEjYRP7O6YM;14 z>_|LN?FRYc9V5hQHTp52Z-6LFVkAhY-#0D?4PQV@j6-irQVFalHftV%{rc@6h0D_C zd!Dpf@DaN2W1YBhT-%oKTbI7DA1@1tK`hmZO)s>~LdPI-F^VvxWkw|Q!0^R%2wXLEi0 z__)2r`sw|P)%W)nKEtph*3}Ulc3KpO1)JsMIy|NZ8$k$;bKF*T zQyLBXq0*(_p+<|>vNA99_>;waX`rKN5N#O^9!c~hEoQ%kN`At1@?hrC+gK~?1Tr-~ zZoW2XgV>j-YANZia7Fi*S-fO|Ne|f@ygrv0ttz8f`CNP+LdR&__M8bepz6<+fa4E- z=U>g*3i9QGXAl#4xt5MMD-LfEC;rD!j&ETi`yW<+!XrGAA z5uM34ZFtgfy^jHy&jvd;S`HX&3C}Zlvvrr!zBct&6Z^`B^S4i$&@S;DWX=<>T6nLB ztMyt$ODohUI^m#-)9@5A)Z9>;pJRwu2tYUc*+aprFv}z3(N=eD!+8xJ#0HJcNNBvk z-S^~~7v32>QGM$Fw*k_+v7_^ZM61?sNtVMvbUD|f69_qTIH{RG83P=@7HQ{?z~bQ{ zLzgL|GXm`m<;O41CZe(EURp zI1yAe&}nS8U|Ro zSfrumXD=oFMmi19evS!1uRNj}u7Pg=eI27o`_NIA4$fh=T4VibhM&t|7Ogf#6~j;g zXD-xV^^$KC}Q7f8zU=TQ7x}^fFrbyII9iu)7 z<%cE1Q{YH<#uWr1I0aBFGsxC$u+E$`#8AdD!!`pp|57M=o?D^+i+kRg%ZRHJwxM@q zZFAh{GL0|#uuK*uEA4vW+72_k{jlZ4I!zcKhl!0Tv@9iVW>^9nc0v;TW#2QcbbtH3 z+4?ue(Lg}X$O!y(^q!=GT2foOi)?d5U03{T#?_dLbG!-V1jEFGdd-<_kbQF_=v=+M z^1Iz+!C1ZpV|k^1#d=i=k2~asj=~}}L5&KAK}VvkRmJ@0FOLVHbGR(G6CXMeD4pOq z<99ypnhJ{kFjc}FU1!|IR+bWI)HKTE7+^`x;t$|i^ifyD;ezDvpUK&38p~5CA#3X? zIyKFCk)=}ph(1j;qIf*jMSIqm;6^kmkkcWSY~yom8^!UyS z%>aN$oa;S)aEH7_hkD2SzT1N(g5&V264;O2G}`CPJliaA^bONQRzD=ET$gNR8}adO zvb*78TvEgEfX~f5#h1r<8dY=S%K4F(|P|I=60%ZgwvMnJHIqoXxuufH}|EP7Zg z&MU?o{0)2KSO@Y`;_G?w<@d)**MQrR)gDml*oE1QLrE^AaCh0XG6v2VmSvnK`{Y+1-TE|Hq>kjZdtDHy>kQEbth5vIrSAa zvG~yRLFm)>(+04$`FvhW1b|{jNZc9Q8}Upu3URGy8DS9MCtAAM(bjH^qyVW4fLe9| z5_(7bo^4|qsq-TQi_vy``fIKe5?uVbS_-Kn1I40UWhuMB(fsLCHP?Bb0p2l7-yZvn zeP_>wC-m;`mB!jxd_WE2OF>Wl3W<;X{a@y+HMj3q%U_wHc+64>qPLjkr;r=6MGLme zI>yj4Y{)OlVkYi2I`@AeK(@VHYhz3x1X4 z9q|e%dLLkVTX_ecO>1!?i(;<@jKUjB@o7l!U!(G`Ale zG2RHvkolJ^)J7=|u}pd|4r_JTC3+GKS*|i>8LhUNltU`h4!=(k;s+H!=UY`d<+IVy zE+@3n)S!*XY}pUwdHIOow@bF`s4!u-IcYQ)l8;r5!(u%(Pw3aFMdynEahUF$*elv! zJf+2QHu&Ao`MDBk+9IRAJxlk)YFelgW(TDY$7dr&choDtK3BZ1BIRE}UcqqWv}PB` zM(Ll=Jp}uI<#D}a(wO{7$olJUKH39CLOh$3nF&xD+1MKiI`P~ zbWC!|UVS6|@*^S#5EK1QkoU@u;pAC;Ln&BGa12dbBItg*L0%F9Oas2)UGr`q$4Ykv zXlFbU8Sh64d4wHQmr4Qrk*?3ML~Y$tiWU8uO2{;-ESBloc8q)j^x#jl3)dIgwb}Ge zVfLk+-;p!**rl$-OvHx@9bYhW3Ev5M21llCEr7w_@hmW{eTAxFBKZ2Ak5+Vr`Y3c& zq1%MzIxeZCf1e{L8IkYBTK+IgH|G4n&*en(15V?GA5yCzRimNcM%mgi*&rki+t&>zc-{1MN^Z#~sl#dTEDGL%t{#deA zvs-LAT@*tsC}vq8qNWW*@6uLAhlpJ>iTx8R})TYJ-3%r-9i(<2vqC;F8{ppJP?C*&VWx{)IP3&QQ-Cw*&`; z4(~vy_gKW#TwKBz(WMQD;pdq67CW$XEfU*Z^8VP9Yd0B8AYD5Ymmp0cE=hsXXvUgi z#j>?2wC?0X61|a%8Z7+GIH@3|W<2v)QzzuSdPJTH3! zSvAL^J)R7ku({txz?#!JF9+$P&!7q&(A&UIqeE#l zh3Y??IV75|V_xu>J+ayt^RE7D0>)_(MAZIp?2EtknlBM(tU)9nML+Tc(#*?BX--I;hS!{7klklw(L?Lwhb0|I&; zrQF+4LBX-=YzZFI-H+?8kDKq0y{S%L=<~*y*Vnsr0DqdiuY`*Ttj1tErn1n?WrQNy zV;Y)L%n3x=(CfEl0de&s8Vtwb+X1-b<2t7|+TlEp2~LODaO z+EJ=w#M!vh9Nogih_E@g;37TE9Q&3Z&4?vUB*m7nIAUiev_6_JmEqc%cup7{-e^yG z$~nz#eZs6aAE0e(8{Z21O7MxUBM{5#D+MRy$)`zN-%$7$>R4kqLc*(AxAKc7*3ih4r^ zKq|?RhSyU5Wr0bM9M-$!iDLq;Qv#2_d_S)b=zc0xvHA+~uOkTk@FOIMi|A%x!u4Wc z8lTgbb`&ppV~-r$%^<%H{Bsb8<k`)#@P-QBB( zC`nZ}5Boa+lv0G6AJ(KCE+JI}cV=;2_g+Ns!V=x3)MyNU@2GhiW(Xq#Z&H#-Jj8$00zsPM4;syP3%@6kOpRxWB``iqP zq;vnZLkl_xmS66%vkhY8SpF>OOdAoE=<&aBMZPU)Nc4V%4 z7n(T{ZauZ$<^(m3*~7m&PQr<(7_1Lb2+wnW%)m!(Vw=yc)`u2e+hmi#%% zHm+Irxjn{S9@c&X4xzFCK+-c?=O4~y(TvfRvO10MgHaRukM}C$0t5#B4!^>G1gKVC z62LJmOh_JZHqal_Wytf>oPs)(*acQ}02O+$xO>eomW{7711A%llxTo!KLJjfXCM5D zT72#6SJYG+cXti<$zP8|TFYM$ucUV-o}btHOTEN@kefHRtEiWhQA% z1@dvq=U8x)B3$O^E8@oQ=jLG%6o~ntaqfq*ks88f3 zT4qvy+vt7cwK}p$-45EE-y|OMCImPN)3Apw{<3(J#nU`iuaSn6YTvmlEbOpM%~995 z63JLDI%kf9`;&7=Rz+(sZ=+aFqF3Z3sWv4V>>jc~QBmo(V^gm06-g;7X7V1=!VAEs zt7_uA)V1DKL_^VK&7&|0zioNfw%Ua>L7>x8XjI#8G$$p}_!V*q%|RTL%P=DTI8CNDI< zJGJ@1(C7QKecE*~++mcfc-r04Jzy}VKr{!NU!nc;-85o!d+guGA^i6^-^7p-V@jJRq!+vRcb*Iqza~757B!| z^^JCX5*gbeT!asUaQuB_)6#b3X%IeOHm^$aQyk2^gERJHN9(S=K0U5eN3SDB(>dVU zeO&NJj$4M6Z}u&1%{0Di`mEJ0Ja)Pwtw%rjzk~Mz77*-3Txj_F#Y8d*2ve$J>Nr7d zco}jI7a^uge|U-+FO&6?L4pp`xjNP;nwpzAP9r%|0d*j`+a~m$y%$mGWl!o=ELL*H z2(3fKNe$VS=YCrM-fYu6u_Et=XE&R`51Y;){8uo095lZub8fj=5_EU+7F zAP{5A;% zb#broP-T)*Qb;P8?8n+mg~UOIw_B?Hlu~v<(Uz9yJ%J|98rl$pst7=p z@qZ>OgACyva(*H(Wq2TKrR(Xo3D4=k!kuE4zhKzWm4ecfiC8YkTC5L)mEq+IrT`Ch z)}|tuVu_-%TF=wh+enPLBh)VG9H^^R)Y|K8TSL9c7!UR4EsbZTiJ}P~!&3vJ(v9yj z7gDJ(A@XCIp$+{S@nvu55J{>2a}dBuxx$H9)WY&i9`7ZuaSQcE1$6>>u@Afy7>pe< za@oenz!5N0+M3)zpk!`-mOCA0{AKXV-0f1bv^}jS7IufS@kELmtI_6$s^P>SYo*`U z(vsz!Pxkj6qM{MizzBBx4IXCZQ0dc+gyYMmUljGz2dzmhUBh8=DmLR`i6@`)2h2TB z$e#7C9fhdr^zL_4t-6#ID8FQjHff32Ir*44A+dMIIHgZB*64-*dU#4HgIJosTWtUT zTg*yT1^^YuP&_ID`IpdCrikkG=|PIug<;h!$=Uld&u`=#Y+Nk;W|027z4jWXt?R@U zqLecJUJP47$iqSW4js#3+u}LObnQtu>h1LfXAWiutt~FP-8APM48!fDz0^6X*4bvxsy37#`3CB@2 zDO>ljZ?qWAUCc(y_MjLO8wHO2hK?MZGXTSs;koC~U%LCNSY$ zv<^{u#uW6(Qz)1)L*(TG zeQeC#6qf@?FyRKwkY;nw{@ml%kw^iQyip5?)yOvNllWpO(y4C1=Z_O0SYhL8fQrsK zfp%>88;C9KiE{i`$sW}GI>A9RE-^d%f`zlr0pmV&IZUug2`#>IUhtEdG;%!_RF>ZH zH}|BgKfk?T^Ll7@>NMD^#d(;D3@(bFX`qalhe>#-txbB+W1aYA!0vEfK(NGgE{qAR-m*7) z^OXdp4ak41wpJ5OE4)G%z_A6e---T8hSebVm@latX^^) zh*gG%S|*y3;@_g`aeYU;EFYjH3w^d7FZvWd#r@Xy@3iDC%4WL#2PWxiB)FJ+OP=-w zs~rZ5vOoC3Z?Ro6h%?_0G=o-!{%s)jQm=BNzn&@lf0MtW!2O~pJjf3#qmy!ge+mKh|gg2E&`RG3mhZHOV^5bTIc zs@&WZ0bSr#P_XMqROY49%hj0an85K+`h3v3<-6sxb=`C3cX^FP_yeL3H_L?EcUxF# z{$u&sssHW-D5+ZU9Glk4@FlkEYMU!+=O*`FEEUf-HG$G&zxI zVG_C2OLqH<5@0JtCG8FD?_W5;o0hG|uaQd7U`W%%WSu$k^&=~BkAM|J;k*L~iEb#} zG)tEy0lWU^O@ay7~vi>rgm`f6*JAXfTEQyNCBuZE%*)z%E*9ZZ53W$vwID(z!3DRvqo8OTZJaVjI7lJrhJl> zQvmEu+Pp|yvwT+%hcxXU`y*BJn>Ru!xRrd}nf1ln1qLv6I7v|^Ns5b%gh7Wj=ZgbTRYDW1CMR;;R(a}7$6a0vs4FBV_7q`oF6 z7z|AlD~(C6NYCXy61Dlo%y%@Y^a+LcQ^%3MsuG-xG&x={yfs56T&B06SK5hQI04erVaSH(Jp$6# zullkU8U7q5l~4~#B(_%x@1WBsszfE5LhLQ*h4``=_4@;7M1Ko%eU&I}PZwcK+vchH zQ}1-W`^8X%z~OMk6{0($hAC0+cLeF@KE-uabxWVt9w(FIkezfMYGgBQ32wFl4t%p~ z1u@Z?{X9oBz9^myK8MQ4lk$?+2m!z;&0T^wKG_+%JgeKM)HK75Vu;_1%s|4GM|a+q zlv1}pv%5`BAD1FfCXxjLj(qBEDgB^yrW?ZvjdW8{Aiu<6C;Ac@4=FtNUa>tKt=TT9 z1L@Lj{M-QEk?$*iTd4gmSBVX)iMAni?D2ya)5ZO+Vpr@=i$SJO$69CWgdc#CCfW1u z;UdZ5bD|NP_{@!LB7(9qW2|tYXa6{AS^{OL;h6+2v1`Ml48O3)rVQMso{Idk$%?w) zvcip-N1%`y|7IH;KHzgji^4aIHi$Bvhibg?4QWr1DQ25YU46iLL)od}{9)VwCe)P_ zNs#gTqu|bHp*o8dWHSZzF)Bb%#zJ404mPr;p3;oUVWN!%_0Ortl5<-dpRbS2q?^%d4e+)<#h>6d~%r zv2hAgd+Lz>bW(0a!y6Vg8xyw{UNp^Th$zUtvd?{gNbxs9-;QPwWuuh12P zL$9$N&u|>GfuCEZ4Y zgu=!^f`?_$fCA`#TBHy8N2%uD+79C!iq+ODh>!XH?pW$EP) zPEVcEQGgls4asl@L;5?_Ges)swpltyzp9cG`2y%7xC7IkqT25)N5A7rbYYxgL-pQzpe%!h(NIbw(NgV*yiDmI*S5U)51eC}piK&`=Jn zrf-Nd$)y~j^2FpX2PKUj&~MHf;OYA94!ijECBD=} zi@ePf)oEA7L57@BVeGkt^tt2pDVb@Bm;AihU7U zB6;F_&rKT)&Ryrk31{zoQ^Vmu{dBtqc@YPV05Uc{=D|L@BCn+DKjBPBq1K~Pis5s} zE6`yuot$5LQ~J45J0It663t1()RV}gGGi`-wyRi^&4y>8+&wT=&)5vFZGwU6LoA!I`K6l9?)w({wl zx6l2NPFHUF!XSG6|3837b%N?FVg6PE9H{?Qj{iXQKOn#$Mhj4$a71H47buY_l|frY z&OpNEbXYi{_LEjAr_HaZ68;u9zPi_*&VA2sZUu(%7v3P%T~yG*rO-c>Rd`B@&|eK` z9qqW*Ugn18_I|-PCBE`&e`EeQl~OfO!+b66$#{D08J`!$<5~8`Eb^BBrN>H6P|uyr zsH~>CTqB!ptcSA_!m9^@I#t<6({FAH$W+e6(0?%A?Wp4ZD`zF$8`I;^2j6l z8?3YS|B-Y};gvM)HqON6#I|j7$F^-ddt%$Ror!JRww*~P#+mOwSM^kNUv*V=)wAA( zW+ch~F3b1P41~acaLwO;g@h>9q%K$6O@wmkpdpBoK2e0y zW(ooJ#qEDC2A>mG_6W>>L_e@bAYv%KK!E@B(DT^C&<5rw+3lx0F1J&yw|Tu_YkiG< zorj0+hcP>8E8$=|yGu0zJ*7GYgzdS2EheUqIf@euFEW#Z$%1GE8>tm4`A<#YE}j%) zDLcP2yn#e$)^R=I+9eX_8(tM|?_pQQ?l5pZ53Z3}s-#9#!41rbTDQ-!pi6&eL>yTBWUd4<$PrQ%KI z(;$9M!h@k(o#D~qmsNAb(U3_WL>|W5aVb=mLV3BW!w-s-@cYp@NRTXd;Ff3YB8H6o@N}k?78iJ?tXtck*(wZ zphBrhFa~&RJBqG`axMWMFXjg&Xw=avBc7I*R>h`|4EYKy4$W!O*-W5T79|GeSfMze z9|24}hGIw-&f@^Nas>s`=(o)NFGFQQ_z}pMwT-n4*_B5yj_!i+-85OU`gokVpsIW8 z;@C0%G^j;q*6rQ3ycH9e zqI*kiLOiyGn9b@{zbBnA0tIR^*6D6_!9q@oM^)fq?T$^1r8+TIQudI*;zwV=-H^YB zI#WZ%lT0Z$S`|GEf0B}v$)Bg6>)TeWa3qEe%S~2G5Y~3MIHZ}fqrXLCRE#*h#zcR! zRpze)WM>eo=5&FjT3qFj6OH8NJirYUv`!*@as3z?D}u#=jC}OWSyj+RBUWo1v`A`H zIh^&8ZapJpZ7G2m%sDSW?l>=O&g{`trcdWaSwSz$goN7BH`Z5e$`XV@^6aj3F5}}A?Tdojw=Jx1I=Q|*C>4lJIr55M%&9fpuBzt8M z)Y`-enLP(=W=!YbE0AbUlq7KYejr$h2)bD&JkrX_+%RrUX){1=@fkxKI<>L%I^ob8 zG+Yz(32H-A_>x+6N!CcRKsEz?UzX^gVAA%U5xPe9u)_1Hk@_IUrz9-1T&rk$$+*g` zHJ3wK3klc^1D0h~CD){)fJ?ApU)Qf+8-%cWaehp59SqI}Un&P7$zgA*dI4f!Wx`Yt zl`mtFpMqdELq90ZO?p$fE%KnjRKv$flFGFmIL_ZPxOwmc((6oSgUbDh`IQpVn++vQ zmNLnk22)}JL}WyY7Ck@-oTD2Y_qr^oz9&~IT@v_QidZ&PRG}9%u)og^kJO&&z4fad z%Hfmd?|?nWy&+;#Ah+0A3u9I1qpds5M=Sxt{IB`QKH@B;p z!cp`FR7&kA3^OU3+$h{z1 zvKew$#7^OS)_KjMn-#aPZK4E*_s?WbVIyE?F3ztu*luvG?H21&uQ79sSX73Pt2t<= zt(r&qeX?(X7~~d=H>4ki)DR5KOiUS@n5+r)N!;OE!nX@&?r#bd2Kju^*S~L9&M>{> z%EkAsbg_hX%H}uEKLMBejM%B1KmE)%5KnJ(9gGYLI@4PqXAYV;o=Pi_7n61NPVIp) z0z%(vfXLMAjo%X5w;1Esq5x~%F0<*TcCaDrrgMv8Htb*<{ zwpg>8JBc&I#cqs8m^ZQuu?cO48cN99`?<0+0nlfw(zn&+w9m7d3oS=~!4LKdq`$bH z3Kkw1d|kFIP`r61(Cps71V+gqgJ^&`rm#IXPI7+8_3?4&xG12GwLCznA|-EZZ5Svd z-R@V#9GSdPS>@TnHgmqm^1aen`2sdm=kAO^9}Vb@N%Kp_xkIqGsIe~dO0kX4Q%x{^ z4b`kYvd@Dx%JU}0brpckmz!@$t}q8}J?%#!H3AGHY&JM!iLP%(?(&)JBL+|rPB*uL z{>;T?kS3)EDrH24`EadPz!N8V^`^jK&P7CH7rkdoAc?1!UMN>G$+|QX)+)QAJ^S>d zYRf-NAAQRo3v%E(gDUutbFoW8bxWE7$nqj!Y~8&b%~k9C`#ia@ae z_mod_M^_3riy*nrE%jrc8nRu{@ODpzbN0B>_)r%%|Bf%FO1$=Dnual*m@-n+2p-uj z8Z=OKWNr_8O3scJ?%%09(rA!4=>=ob)Rx1nJw;ol7Q$@Y<|w5?5+K6T9vCSTJ2gJ( z6*4l3y*PZ;-;@w=8vPuk64gu9Mu6y8^D}a|tpHQBe{jXn2@YD^f2@fd`nM>7eekyv zyGdz0>-{AHQe8lh(f)yzmq!;{&Au!I#7QU|MT$Hd#HaTF>3%t%?<{o~L$b#}B{U2mJygih`bEh6;cYzz1$kuddd!MA<&yy2Qgn-u zb+W&eKY%TU+0tTXxAAjl@pnyC1^d>@@7B(mDvS5pSPmr4g62c|Exw(9*xpEczjb!| zaxOF66HcH_t_l$L*Fx(b4wRpp!tNItG`GKEgjb~S?;Y2mhOU&gxPS{%gPrNAkTRq7 zI1)%bVBk<5%r!Jc*t|WITeiGl)B&oaK3B58D&7|rYUo!r{-ks%9CrI+Xb-TIg-(C@ zJB|4(c|UFH5-h!d5TYjCG7k~sHAs?mPe;F&l)^_097_T>nMpIz?9iVFp2ZurwA5); zT$24t3!IXbzI7eHd$_D^rPVW?Rihx2WG~&d4?tr(17f|*m2isHqfKB`;;6H!ZWE8o zX`*{fIVk=XnZMoTdM+@DEAP7_A^mZ)=fJT$0lV{tPzJOD^bDc2Cbg+1xnq)|+pXmC zvzJ<8I8uQ9cC9HMfc(LSS=ykj+zC_WbefOQ1@6)|#v5=kE%_(ynJ0>1cdg$sycuo> zF}S;Z*p-MmDf_>%i>}OJ7(btAmud5RA%wcYv9DU&}IP+HcxS#^SIB^MR_MNQd-MxyIRxMX6%>E5-BdHz{gjNh7+VwRlTW~RgM(nzBK{^9%U zcIAa(gswPH{XtQ^EgP?#f9`4@={_tZn^2hS7|KNICVdqgI#XQfjS2|J_v_MJnHxc3 z;}`|LZ>newPJj*yMQVk4z9i*??|qLb=Wh>$(cdh-=zlex#Svij-eAe09{ApvF0x(X zsFpyBk8t3)L^gKXtj4ya^3&vHgIR5h-G?J^!;W1Z25~$MK5e9Tn-B6E*YU$La>k0I zwF5rF-RL*bV?_Azy7>ebPs=o&BXY6h?t5JpI=49qR{q4Eh(#Rsk^ze>KYqg2o?5_@ef( zUUQ54xN&|C#`wI9j zzrTGwUXcF$%dcV-O_;JWEhIZIg{=`T+d4Eil!7qxn_~#XoIMA4+-voL_2o0ZRBr(i zDsnz(dN4%>Z=z@#i4XQc7(H^YHeyO5xt~NJAR2y4Nlx=7tQCPS9rzMb#|$Kp9w{c_ zCYvIQ73mhAg&BWpreLK))R zSV)AI?z~R#RjlPmX65drOy|p6KR_H!1I{kvGF(#Idq+=vmC$wIGst2^fO|p>sydV& z2hY9ZD7S%YF;1rY(kpe3N-$qFYh4v_rLVxIIEuY8ekFB_H(7)_@g)>h0iPL(^w^e;m1@RUSeHdx`e$)W zW|KZ_e`g^HCjUYS2@wrByr3Q0I16zP5NAcMwMPA)sO$@0PVdXJvW>5u?@gn2tlCzQ z{5}Rs3uDF$GkOvj8K)|TAe?=1d7?yByBL~B(;n#K z2GKLDf7;ZDK=$V}FZpeNNP;(2G>jKcbRnXY(2;Qg_jgHhu4&L z-iUd`LpRLywo+3*^{s4{G;k>zr#rsJvcm6x;)JeR9Kz;3 zir%;mzrsexfd>JE+ zDW~1EE@6lCpATQj5!oMCh_90q&w)%GiA_}pUVcKGznz7gW) zzsCB5a!6gJ1f)A2P%5Lu@YLq*+b7OuRJtl}$TEhPFYAGsC{^!~wA|Hr7_7U=}w=kbYUXrr%(0wpwzL&X!!xRA9%_&)_6=vD~F7fnXTq1hlOyavi1kIv8e z{Me811YCfGPrdfnoZ+ACSr3mjZeaDe`HXA%%krh#1mtPj>dhy>Unzy>Yk`{lie zyZH$ec*veb9WLXlR3nZdF;HP@ZvN!X!-I(=)le4?$@P5dLDQwg#En&HMM7-jKB|s1 z=0|nb;;T+|Kov0Rtxge?feYT;pH4XaYY3&p3K+q5i1zea{9)id@#U5A@=DZt_29fo z)p}UHs7fyaN5UO&=pyV7>+N+)@3(0P zk{A!M$+BB`X`$=OJkvj%QA_Z~(>S^)LFyBmF)G^8HuzoPZaD7|2>bL`8Uw zvwu1I5|e-^wu8M3k~q_W;_u=ZybJpxbqeDjmam}GSD)rE{a}~iHnBa>VDYZI+%f|U zx$g4yaZ(5ZOfXIVX~$cRG|MoAFqL?n;p^or_I~{=`skM$Lohh-`STIM+=C@gRyTNA zR;kAHn9)A@@bT+d2UcGYZWdK?agx6!E(G0(?=M6i2*%m63|QtYjx*ArWW8|-rN7lRPX{uK4Ge# z^6vU^+7TY+NmlQ@nelVIsO17}yyo*raunuKgSjoc0((;)AE%2xHkhn<{bWv=W+nYE zf}Ljh>Rr;e1&-PL$`}}#eWA7Eb^GdLfye*;3@zd{4>Fa=Qa_Y*9AK1G1SzZ%Vo@pz z1sJCzT(e8t|He%aQq=4;l$rq3v$vFhnNQKuDG5PFLaN6l7l^MY+IUV&9&s{Je-;i< z#sz8UN5?_ynrIl=4O>Z2-91a9I=UCEs|^A%AZe>Qa2&Fpj!Py5Xdlh#Z(Wx_Z6_<0 zD%8qtaUZt4D$7l z){;(>JZ99MwK&2WT2wpNKAS*kSMR{BKGk0JzHA>~Hs;sS)zO2>y{@hQ+cn_U=l#?M zf9Vx;NpbAV=it0;-oFdn?@-}OnM}c7`7OF`$KRQp{`X459$kTrS?Oa{h_`0MoK(6g z3$H29lx6O2Xk1*>(#KwG@PUDi=Q&=YyyQ{(&zv7y)J@s?BYURk?7Z$ud16($%p03m zNtjixYh-1~s8x>%Gri-BRe=fQD_*l}t_eQ9bJN^w>~_-{vydzhkGiApUi}a6j<78L zZZYoYu4Tqm{&AxS?Gd+Yfv!01F$m<5cV)`z0*x2{^0=HTqk*{aD>D0-l6A5}Y1C2N zytP;Q%GmSb@E^D)^)FUEl3tO^qgBgp7iv4l+QOI_qL6GIt0Y!H8c$ux^bEY-37<$B z@2;p$_Ont_RbnQmo=wHD8)b9Hj-*}fsa4g2%x1EVRp%cJYYqKk{E5jqj1#vrS(4HJ zXPs8v@(_KagMh?P|5wRK^ydaH`uJq=Z`5usbT`@u)!J=zYfE6q)qqncv#i7<+9}&7 zZ9dsc+qbuCaq5$hkVJw7ZUj)3tGdEYG0>x9=i4(0DX9|3>j&1~*` zefgiapT74z2>c^zZ36EC!a(UzsvzBUorX7#)70HB_UR?~lyR!zJ=B0J>Y+87bvVoT zi;>XA>O=W%o8h?L1NqYg{3t)3vG?gCOzD(xt`>@5idq_5d65@=z$qTW>7wZDH5a5U zu8+0eYE9W>;35e4>(doUckD(G200G5n>v>3(a54!(pKqfbO^$+b!Ztih#{IdXsyCx zSf|Q~nHC#6FFWn{QQ3hP@3!5otM!*zhcJ?H5~qynibPCazkAf`;x6uQ-duP&e;P>& z7xdA!XSz;V`mIHVCAHWM<-AdlEbLgFwIPruy5|(93>LfY zN_&0v0exa$nft?JfRj2cup63E+Ce-7*blIO3-8Zva%Bkpp^4OrmrINylYyZ~>wfh- zcl^1f+zhHY{a@e#7hataXeC4`zWMrz<4lcA=6tvjZTX7g-~op5YUOD3J#KLv+Ha7H zbS-|bOh4qf9}tzXe4b=>66g(@(d2Y?)Hntfc1rU^`8?`x$yk*2zi{cW($hEtO^T&f zA+?BSWLbrAq+=Vet`{19c5&g9-Q83a*Jc?oPLehjl z7pcw1e%2an?mb=kG4*O36^e}(N<7k1Lwc{7`g8rXxXSL(CRZs9(YOSt%le)lc3gQk zo@w?HNi9Gp#8=_l(q!uCG$t&fp#=`blCeR>ehQfmef@A{ajMxg8T2E#`GWn!w(tS$ z0}H+Be_-E2qW5qdM?jy(-2@oj3;GR{i1sO#c^1aOAU(RdrWp}}?lFZbDQ@j*_Og1&E7XFt$+$%9?kfts#&XYL^+>#-PjH~BSGH}7q9s0X&Jqgs|z5D zEotM*oLR3oR~8peOygzT5lo;hYMhlPy5IpUb4OO`_|>=AAi-71QAs7bRYAs7)aZIT zzo$qaTC6sVwpZfjBLSbd^nxjQ5ejh2`9sh5^E0`I-=79LSx&ITbt*}8J)YV#lrM3v zGx{%wTE@ECA?&cH!w1-`^$WK@cP((u8AnO_8+Jfrll!>6)B{7|9Vy|PGE^2n#W`YYURkC^? zDzSa|yuOoEiZsW2V8a%)JB={PB z{HCaL%e)6nsdX_jeKKKiM}~#WTV0CER}grklyga890!L&;dYNR*_(QAMP?P(btw*z zL!<7WD0kdbfydujzSQNv?f^ygcHP@-Pct)7{1Y|G3&RzxT_t1J)PvLX^0Q`ebla@F zt)C(zj1ws+!pDZTIER=0G|V9QweTq{t>CDxGmX;*nO=c>1ak(j6k_+mVqm30H;^z7O$xY0G#6L$@s~V6a*SL! z=J6Yrcc{!Q`3Y%XorU!}3cZIp+MyW<&pYsu7H>!hmKR*W4Ewp!ILLGaMBkQ?k){jW z$8SP_Pn%XDBrwvntUgEu+xT`T@AySg5kEoMuTlZdR0KsTPdC{m@jwU>r$2X&qSQ0F z>E}RP7_go(&c|9*OEfulAuoY=@I?)FHtipZEaz@;O~p@y z;OFKl3y~5i(cCrWrc~Z==H5`QyX|yWXnSu z^xtODzZMlx29p+)74jd!8zq`z_j(Hk!tUg$fJYCm!CNI^8?Y0>mJe*0rDDQfMv|NH zipquQ%H-rSZw(D)-i(#LA!f$%iu9g8WT-Tc zo~Z4PHVTu|B?EZpcz%sPRvBVGoSRr1YO0n&DD}#u(-;{tp1i>}_T0NBN4z;{DeCAY z0a0Z)j?E&Fx$4**Z^Jb)52grF5qw^F@kd#l0*n260NLpBAGWr=kURD&NW6-MYBBbrQfu*F4@;L( z`rosA zatMs4Q+( zzG~9(4)(H@RgBkKeQ@*rKW!P?ellPX4g{nF;~yW!7WfxLeE6p@I=Zm%9m{r(ebGAj zc#Ho3OrS!3=>L}jz@>wMf-^St@p_^lwIis%3u0?1zjwdC-{p1MV(KU=eRk6(yjjyJ zjB6n?saq0(RYu%kFO}3Zl!b5AoiExSb3L-MZ6#}0abuoqc4{fesfvi3`b1W_z zp8d5|!W;+Zo2#LH$@`v{5FLxwMA7h%_ET}48S1M=jScJ{meBQEn-8j(b%%rE+43dE z4-YL%*^ZB?|vhQIg26L9G8#QBMC~!F(Cb3{*LF6NHvd^+iG2#3mt#Fm{Y5pFBZf zVuq=(lQO0w7)GuX5~(e*c@K20^SQ;?GcDMbc)Dn*wd=s_2&LORu$Ap>47f_he6nsd z)9bX?>$GTP*J^dEtMw67eiO_i(`hkVu={v9-@1LD@#uNTc@T`7t@FD~T8*%TJ56WE z1@d}Wj{ak&d7mU3ndx-sunf{))8p_8nxDANHr1H!%;2VbL}wRtLSag}ac1DKvy^R# z?AVW4XLJEL?M)9vhek&#zi_ z6=shEk1VwPl?7`&PF!t@ANuB`Ne>|_Vk;Od;-aw;7c*63KB=4AlBkoLXEnKXW?5>g zhTA&3;8&JM)&aG9nPn;Z{29^v9q+EP8fC648(kLt2*?^9byojuPD&+BTIcRkfjrCF zeC0kx{IxbmVa{tiPfSUSD^HH;sSD0AflGbK9|l&q#S}5>ilXTQO~tujO)LQ7%Cx%8 zf#P}NS8ar}bL-VmxhxLmn58b|bt_(#38T_&>aY~a3BRCRA`^>EdJYGwMS+0A7l)y{ zH|LH^7WUzdO4Ew*9HWk$n|L2dV8+1mC{zU`1Jg`q?I{f!KWZt$QsumNM^uGY112Bq z>bk|Lb050n1r+s&s>9J}*FE|ZGrPLHYBoz4_+j!~dCW$C=3q2lC>pM@-KhC4F93gu z`m|qPj#b$kPg3I`s7bu2=AeGKv~$xnKlnO2%t}Xk@_J5t7OZ8uVQC8lxJKQ&F8n<9 zWnWtI+YNr98z8*6O^OAx$Y8Apc%J_R#0i!I2&MzanZsb6&(B8GJxthae%dcJc3Y0L z@NG90cCaJ1B+8fWyNf+%;}7?6j3-grDJN4^s+Gc5b>njIQQkOshV+oUzp$I$T> zf8K6|J%&WLZsIYMNl74kGPR0CrGUPl;98`9D(XN1OctbLB+k(nE3L2JY8nEeQ9^T( zl=T}2ZI5L=f3r6NEvpmp>p5(GM#d5vjDZBKHRuNvNra|9KO+qQ-ecpWa@r8gjdQ)&){x z6k4?V2VRZ22dVVoDlGbU3I78!FMhqCkYM@z^CFUTyM)6YFedao?EKfzU7VpzzVW`l zjfvlbM;b;z{PRLw1jDVUna-Lh+||dgD_}377g>)s+5;`5QmIMel3w`Zu&*#Y=?sCZ2~)u$@hS95 z+X2?cOduIdAMb7zp=C?Q=( z`sn+(1#dqFD9SbhPR?-!fATQSj}F}vA}!9&&)Qg~2?P+)X)2_LU-Me8rHPG()=fsUC#Gq%%>!(k#ZSjA0ho4Kd}u1U8wU zj-vUB!4C3LPxe$?@j>lyEV};;Y!PMD3iSedNv?V$r}z~v`4wIGqM$>ILMD={Ik&frK(&n11R- zt7omprmjkEuPWt@ZI`#n#?Nq4To{y(n4w|hg^1`~l~eCNfL66mtEY=wn@93{S<{i< z%kXBFp8*mE#e!lEr7}~GGz6#(s&Nk&`_4E8+`h{Rx>M1$CMDZB@ogMSzFzV$I@_IN-TglzFXG zS8?z$4=m+7|GSbQ47w8R71$R?fEp(;2%L;&K-Wy&cO&3lsspou86p(hY3y3yb@8gU zleY+ZXC~^8g1`c?$~S?JQ4R+O*}bVW#X2DBh|uX;3e-hfgVT@WqFB6c;NF-b2=!tP zV_)$c&rWPHywy=#@Wja;nxvi0X`CYB6!DuCaHdjon_n=7g|6K*kIC{pzOt(z0`5YE zlf25(H^|Hqku7n*TdWXSvDeLW4cH`r-SM3->#;7X2(b$t&>#QF*lBd$4GAVzesS*+ zr3*OKA-&6>KAKy>b3!PyfIuDG0#h~g;?HLMEzOR9u=1}QLdiDvlX!x?OSJsp%nLD9 zmM|9{t|i$87QEF-_Yj-X5O++_1jt*4SX90Sc_e;=@Dl*mgW~6?H1PoUGsz6D*y{d86>46b6d;qGwDgDHIL5r!OjR zuCi_fgkEgrXXYUjLSIbK1NA(XXxn*k;qFZqc2+E7t4QCRA}qT?eZ5-ghj2!akxjf zf-lzbypnzoBp ze_8IzLdODyKeEn+5EkWuc*lcf0*5}CU1TCSnk%qSDr*tEPI-H1+F__}e#O-~@usI| zvUPj+%HWx=CW`aDwYU>p{Gvlhn)_-vBH(56k)sq2{Vy;x@Ep|O-O$9r zH=7q{YhgS*zV*R>HJ=o zkaF`xNpYToFnO+0a3eIth{>C@qyJ3DPC*K4;G&n1oBgZ#9DLd>iXmdXH!=Dp%C%N% zH|X=U0hpNkWQW8Cow%A;7HjHaXal~@$0>d*?P2l|chD0>`gNQY`S?|Y99Mxvz)$!~ zv}caNnW6X@h;>fMAXFmOA(ggwb*duFEc52sx{F2lNC^dg9ppCNKav;wB8%xwjPU+( zg-|k#pqZbczR0mm|_nM0><_Vh)mLadHWrltR|f|ChhcnM`Ya+gdY}j+BadHGcr!j zB8Zg(Lp`t6FtrQLXd-DgL~0^OEISLI=NQDF=k&!@T!rREU3KRVUBOn!7pyerl^QYV z=X}sp4EB8l{WRwj4cK15*M=@gj$-T7Y{T30C$OQ>u2mja(-z+k&uP(7ipk~K{QVNY zFn@rC;(ikdULW5Ahmi7Bi-FX?DHPbgvW!20x92H8xuW*+cuXC})ptdL%h9kv^Ap=& zWPJE)M7)TUObyP(3_Hi_kD#;KYRP2UFBazi2wziXas?-qdRis?q~WPvXFQQOG0tmC z>ipcoSEQ>#Mn71-$#25|d2RGeUWM5}(fA`s@6_*s=_QJ`>sB~+t>LMXaI4;{Cw_AS zL}VM<`|uO*ap>&rp;g^25eK`5g)|Z?=N$GE_unJo?@`vlu|^d1>!L08*jE`Hh4p7L z_@0ua?ozgS68xMJ*G|!;PLj|#gDqofR;K+^AXUG;iU$=hCX%*-k=gdTB}BG%ok!FP z=&bukMy3$p8<(^vBk7kS@(LleKk(QCzG18pBZZSHWpe2>y80$c+N;X?hlqeZyP)*?_R~5HIVc88oRJ|lRGgXI+2zhu zHYnocl~8(tkBF=qe=v9p$AnD0h`*)d!lm4go;Ut$8pP_N|BYe1RsT08p>b|wO{Y5I zPzajbpcuVAiol|-I&!^LG9qG@y>F46The9;@wSUtEg%uaB`z>yI7K5%PqN$kKioi8 zl&B@|Uo1z@&;RM16ml7W@Bd{Bj`Su>icqIIqtQ{-wzkw)i_76!1K=ZIq=QCqqdz#e z`E9YDl%E2bB?yAc6pPYd!jSevac1X8$eN5Oc{^QB-g6u%EKX*34SGSV`_Z`sc)V3U zi#bc06#{DNE>~)M3Uvy0-T5=x{Tr2^v`THTRP^)V zN3c*SN@;>Pqh1`u$>11sj?@N01|iA1y^86I=xBk|V1D0FE?;sfCHScC@)jxWJQE$0 zAAw)LnBiopBrZ?_A{0?M4HdM3l<8v%Ve6>9&(Nu?iJnQ3&dwrX_%A%$QRA4QExPE~ zLo^l-80+wx*N#Ntlak6-2s@j=2+S+4c{+^BQ^q-wy=9NN-vGLFZ|X3@RE#m^1DFaw z1THL?whm+$QIt5qqW+gom#J3=et;y_YU6yOQV^mtEFG{i<)WLz0F9|mgn`}}rsGdH zZT(8x_STh+W;^bM(W{V_z|jB}=bL%%yWlFRuok)INu~WAHTu}{>zrMQe^Oy9tYnBy zrLbZ0ZWj&9ZWQs?tZ}wakmT>S5rnbi-R~i>eQ1ha5q>X#QAZWED|`DN4*&t_0|IB7 zg5x`&Ef~P7XH-EuRxzu)a~%!r4sdF-FwYnU)_y0N@`B1#=?ne!zeRPCRlm;n&#Ii@f9@ZN1?<4t|LpWeEabk2w8is;)>UZb zM5{s+#gY4y@~Iws)&WU&oLTi*D?$Hr(}N-K1tFBl4kySCd42JJpQd|%{rd$9VzOp( z*SNkVslbQn96_?Y-wlSpy`X#M=0p4HGsbIkZ5VLD$tL8NV_Txio2yF)^Npb)AQzn3Za-iPf< z5SfzVS;NM{MPrLws!oPGC`mhkYUfE=d9}bjWfIeZfB^Ll*MM1oNrB*S2su%SKo3>p z@-JPhf3M!-0Zma{(}Dl}_Kg)vzfSNn5Ge=(9b7rC z$?F4Zdv#X`p{4H~>OXX;%m8tNEXkmd7?dd~zz7ql;^pFMW~b=v;ArOTYGvjkWn^z^ zYv#;gVr%5$qNWN7@(+pnSK3#Vb@|Vr$o^2Q)>cO92WTt0iRDGw0fo>d&m1%x8-v#z zwv;&GqjpcKxam0QI1Hc^@C~KqI+>cnx0lg)RvUHm_VbM~Gxsun$jeoGR&(KX<}i2E z;|6#O?ES##W5b2dQplyl;#5|%uZAs4r74N_rpaU3GM{YpGHj1sakU9_R9Fjq4@^e5 zv5^qPuJZ3ZFOzYze<#Va&d^S3Ws@B#*Q=G&%cxDP(b&4LYqiS)>FsZ(Mh!91jz!Kr zP7khynJxSMgHc{Tlg^sGA@z+Kb|hbYs|9Ego|Q_E-B@dZ35Z*@RnmO+tRn9cIc^{f zKe3x7C$0|`9K~1mfhB<-M0&+#T-#!XlU)uQ_<;`39GywRbvEos%)k4)Wh;=+mf|;k z3-~0%lv8g*pAIWLC1L=qYG^@KstIHs6MQl2^FjDwdL;IaarpD7DifeIwO0>5V+R;# z0#QUGzehGW-aY5zMa@-WtSfi~7eVvc$8OVu|UC@L`u`7FEhXK&Rc+lMsMN%d;z7JByQ;n}ST!>&{7cJ2Iz!M2=;odLQ87(3mwXJZ@-36SD6xE5tG$Ng}u3AYN~6xw41CQ zSL>3zWWV&PP1AMwK}mfsbzy3gb~4V>@T85t`yngqDX0iMi={m}?!NFWh2J6>OL zXg__JMJB&GsA9Oe(5pUMhbHxg-VJ$ShM09z^bvn0cf`CbKg6T(zJ)QZ7uK?fza9Vi z(*B&fj4=0r0RQnn6{B~x{9X1xgBN+I|7lhk%E*Cs|8hQ%M=c8Gl;ajKk&9`Z!~K3K z>kw4`qEeuNiL`2kQ0P&|fw7r#=^;x6f{LTBl zdv!B)Q@1PV4<-cF^24{IYsyS898#OlB9p8(d^nMd60<5Lvrt*3!g^dr&6ul>HAN}N zs2%`}F>RQNJeBA+4yPrr#I=>L9v_FTA;-uS)lOcJ%>c9hTRoU|Q5lIQkwLM@Wtv%S z8GRl}acCQK4pkfSu>KnIYO8FFa9@P<0~FY!y&84ZUdRGAU&&Brnj=Fat9RCOI`2*rfn6`ua_(moAuJPEk^kL*+}1?Y*2vS&%(*bo zpVH&a`FlAQX$10aFb4E22nH-jzT)Kzo^T6Os6NmG@`vUQKWHeO0y@zT;+t(OBKW~A zA0fjr!;`0!g%D#6n^Df=AkbO`WbD+siyE-#p#%G2JdUlQq6T}rk9yu_wfPyml`GG% zCkGt}?53H{UnGaPDEfj&aXC+~F;4+NjE2+((iNiMgjM|O;asC2Q3;PBw9VtNOrf*8 zjwjL>EW?49xFIy&6DvNQmkpwr(?17rqgX>afdu={1!j<&h#MS+o5Y*O4?37SaU9_U zJ8U2J2bQ3}QJdz6=I6)9J+R?+twqRu%V3hWvJQ4!sc>xvqRU|B>-vEIxRhH!dE`)n z5Aa7y^DL&zp;IEOQBliRFuw=~!zjd_ zt4Iaz7g7)3iT>ZUFHJ#$?xSV+zL4sAcNw$po(Q?F`zTkjL3M*FSbP_Ivxb8Rtv{ol zQG5C4-l6|H<*W{t>2Lqt4-`TF?Sy~%>eiL~z+Aa3IPZ+YEr-!km_ z-S#}s_HurM)nm5eFk}mCZ+f$E5s^c+XTsYfQYiO3G8LG)G?HXAmP#~gCoXo)U@!o2 zvN2f`QKU^hjpxQJV)jmwi?R9erbvFrV*XCi453wHyUe8*b|RL`&9^-pd0{`moPm#>Rh6Vi;MG34CELD_$wv4 zv6u7Uv0HA@lz&P~JNJ##eN=H13nPKWrA6D|l3oL@MX`Wm*BCarjGypuJhnMq)U@-t z5wG;{zh$*!7uRD;tHp=Y*)C8sGZPo#G-E-W@-3Ac(Q}c6r|uI|!m!QHb!BeI(rd3*F+xK}N@Gz!nN?Ih zqmXFpl|j@|h^D6rq)#i)?|55(P_Z0{qKOPRv5MMg&2UIIT085dBpaW!Sa=aJqEdc~ zL0pq7JCTZr%X1A%%fMGvVHN=S4nzPnoJH?Go7AOL>OS*t|`bG%_Jq^k_OLq7x zQ8c#s5J_eeyl3!UcRvQZTuU$-_68}0Rlqq|r_kBBqX{VqaLYou?B-IY9ELgi`RuyA zMpV<_AF9$ZVfbRNNs{rCP|p&kqM>=qD2On9*RIL#hEyG9ygN<)QvY+VuxC$ASg~Kj zp0waUGt^`oe;ler(u@7H50!fslm2GQzQV|UOr$l@)_BiWd|s61CO$P@(rr`e249k; z8t~^nMW??RT2fe)Sbt zaxKkFbi~Z$k}<|@lT_o<$huGNr8F!>O@vxDHOQrqBu^W)sa9cJ zcZ DXCq1=I}UsJbRvJ{yFn`zvq45d7g95`+MH`ev5={ooq+-KJ7ydS*GtOJ(Jd| zDg_kddez=G?tKrrShOWAvrSb@;6QV=io^GftFe zQ{M|_m4;G-j;C#jGD{r6or$Zq*BtHSX)&wDz2e^F2F`4^u6KMyeHc@EWyRCOxP(c9 zPR+1|U3X=yJ2lmvwlTMCblQm}jJ!1GY4@xu!~1jy$es8(n(D@&(?{_10|K60!TbRG zs}X;Tp1jM~(7BJ}2XX})szvs?0YP~IUS9p-JuiIvHx>H)#us^%B(2+*;s1d{e>|l2 zw)Dj@8Pk4BrKErLMf+)^N41%X(*?w-kwU*8GIftd3tXmrOdwaVp z!kf6g?{MAS7{0!%vVDz?PIcj|Gcw-9vR`#bNPRipn7o40t{i6f`eDp%k2|KvU2cEw zjywM@P8c$#yNCLzT6(~+o}(z-{IsKoCl#UMxr@cs$g}6Yi^wi&a~Dz0YHN>4;oEY5 zA$2|FC+0WJ%CxwUl1f8PE80lh{pm?V>cFm5EuQh*a_eWK-ppSA%lvpXD|TRx!6+O! z(kCm+bs6g&4PxGWdp+CDbEo;enbUsee)88?raPvCUFiB}=1Pg(&9t%aExP2%Yr{w9 z3HSQEaKz4kgkZ2jg0;wSHl%>GaZ0uI8%qyt8)oU%Ob_D0Gbn)E4t9``bq7pcq{tqo9A zc=g^uic>NePjenlr9J6tN!KWiWA0JXvJ1B5>hlxAMUP*H9+sO*q(vVc5}e2&PNw%e zbmd9Eyx+C5IA(&WHc4qPj98iSH<1>7g4mosPY!3*QpjO@z4*l*@#<5zM82sFR)+JY zotInJ>kCPnTJt|nX;NoC?ik35xImncUVSO*+=<>lC2pj_exrP;)jhN#+6_@s)?CX# zfN>hHfPyng^ZnI5GAAfRrrou9^`~v@kaZQN+Wtpm_8s#7Oep^v|@#CgUsb|m?jvsB4gPbb7 zWjGZ(cUZuyCI(bqVFlXLrlQI4Dk>EI7y>fl<<#QQr~s8$fsk&c0hm8gZFLNOU{%3y zZ(10Lsf0ii=6GnZQ3-S%88`ER!CKfl#ux)CDZ?NI`cz2;(J*iT*p7kzz$4JXDiiR( znW;N4&`A{-@&eJQ%jGHp4Mb&kwTUE>4hY3m<8iSR?XYu{^ijA?;wpjOAxi22LL_HrDn`vfDGl=X@aQZ_VUs3%%Q2DGw9zy;S~ zIx_XBDI@@xVBis(B{+v~1THuhi4BVYfP?`#c8eepQAC|{mJgTehJc)UGY~ag0RS3C zZJh@KWwR-W8v5@70MNyNEH4CXXj}s^0~8S$-J}EnWDH!vL10FcG_>)|8Zj&(-e?1r z-6h~Uqn5riPXQ4jv}y?e8W^Fgrxsx?5UoN1fI0@clng`LBo~S;_nPoH$_1p=M3Wwf zF46$N0Mn`{O$_1xw /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/r-package/java/gradlew.bat b/r-package/java/gradlew.bat index 6689b85be..e509b2dd8 100644 --- a/r-package/java/gradlew.bat +++ b/r-package/java/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,21 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/r-package/java/r5 b/r-package/java/r5 new file mode 160000 index 000000000..81a25c8c5 --- /dev/null +++ b/r-package/java/r5 @@ -0,0 +1 @@ +Subproject commit 81a25c8c562069a236d28f486e4f2bc78ac19fdc From 0c1be8b4e6049d3b8aac09a76f41a4d50a884453 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 14:18:38 -0400 Subject: [PATCH 16/23] get r5 building --- r-package/java/build.gradle | 71 +++++++++++++++++++++++++--------- r-package/java/settings.gradle | 1 + 2 files changed, 54 insertions(+), 18 deletions(-) create mode 100644 r-package/java/settings.gradle diff --git a/r-package/java/build.gradle b/r-package/java/build.gradle index 4fb452ac8..5c792cdd7 100644 --- a/r-package/java/build.gradle +++ b/r-package/java/build.gradle @@ -10,25 +10,16 @@ tasks.withType(Jar).configureEach { } group 'org.ipea' -version '1.1.0999-SNAPSHOT' - -// Build against the version of R5 that the current r5r download_r5 function will -// grab -def baos = new ByteArrayOutputStream() -exec { - commandLine 'R', '--no-save', '-q', '-s', '-e', 'setwd(".."); devtools::load_all(quiet=T); cat(download_r5());' - standardOutput = baos -} -def r5Path = baos.toString() +version '2.4.0-SNAPSHOT' -def rjava_baos = new ByteArrayOutputStream() -exec { +// Project.exec is removed in gradle 9 so this needs to be its own task +def getRJavaPath = { + def result = providers.exec { commandLine 'R', '--no-save', '-q', '-s', '-e', 'cat(system.file("jri/JRI.jar", package="rJava"))' - standardOutput = rjava_baos -} -def rJavaPath = rjava_baos.toString() + } -println(rJavaPath) + result.standardOutput.asText.get() +} sourceSets { main { @@ -39,6 +30,50 @@ sourceSets { } dependencies { - implementation files(r5Path) - implementation files(rJavaPath) + // GeoTools provides GIS functionality on top of JTS topology suite. + def geotoolsVersion = '25.2' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-main' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-opengis' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-referencing' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-shapefile' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-coverage' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geojsondatastore' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geopkg' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geotiff' + // Provides the EPSG coordinate reference system catalog as an HSQL database. + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-epsg-hsql' + + implementation 'net.sf.trove4j:trove4j:3.0.3' + + implementation 'com.conveyal:r5:7.5' + + // Provides our logging API + implementation 'org.slf4j:slf4j-api:2.0.7' + + // Implementation of the logging API + implementation 'ch.qos.logback:logback-classic:1.4.11' + + // JSON serialization and deserialization from and to Java objects + implementation 'com.fasterxml.jackson.core:jackson-core:2.10.3' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.3' + + // Provides some Kryo serializers for Guava and Trove collecitons. + // Also provides classes for testing that a round trip through serialization reproduces the same network. + // This is an external dependency (not merged into backend) because it's also used by OTP2. + implementation 'com.conveyal:kryo-tools:1.6.0' + + // Ensure the versions of the next three dependencies match the transitive dependencies of kryo-tools. + implementation 'com.esotericsoftware:kryo:5.5.0' + + implementation files(getRJavaPath()) +} + +repositories { + // copied from r5 build.gradle + // Do not use mavenLocal() which is only for interoperability with Maven, let Gradle manage its own cache. + // Put Open Source Geospatial before Maven Central to get JAI core, see https://stackoverflow.com/a/26993223 + maven { url 'https://repo.osgeo.org/repository/release/' } + mavenCentral() + // Polyline encoder 0.2 is now in Maven repo + maven { url 'https://maven.conveyal.com' } } \ No newline at end of file diff --git a/r-package/java/settings.gradle b/r-package/java/settings.gradle new file mode 100644 index 000000000..12aa99c76 --- /dev/null +++ b/r-package/java/settings.gradle @@ -0,0 +1 @@ +includeBuild 'r5' \ No newline at end of file From bc67811fc2bc17307298a98a34ed1ec76d3eb099 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 15:18:01 -0400 Subject: [PATCH 17/23] build shadowJar of r5r --- configure | 6 ++++++ r-package/java/{ => r5r}/build.gradle | 14 +++++++++++--- .../java/{ => r5r}/src/main/resources/logback.xml | 0 .../src/org/ipea/r5r/Fares/FarePerRoute.java | 0 .../src/org/ipea/r5r/Fares/FarePerTransfer.java | 0 .../src/org/ipea/r5r/Fares/FarePerType.java | 0 .../src/org/ipea/r5r/Fares/FareStructure.java | 0 .../org/ipea/r5r/Fares/FareStructureBuilder.java | 0 .../src/org/ipea/r5r/Fares/IntegratedFare.java | 0 .../org/ipea/r5r/Fares/R5RTransferAllowance.java | 0 .../Fares/RuleBasedInRoutingFareCalculator.java | 0 .../java/{ => r5r}/src/org/ipea/r5r/JsonUtil.java | 0 .../org/ipea/r5r/Modifications/R5RFileStorage.java | 0 .../src/org/ipea/r5r/Network/NetworkBuilder.java | 0 .../src/org/ipea/r5r/Network/NetworkChecker.java | 0 .../{ => r5r}/src/org/ipea/r5r/Planner/Trip.java | 0 .../src/org/ipea/r5r/Planner/TripLeg.java | 0 .../src/org/ipea/r5r/Planner/TripPlanner.java | 0 .../ipea/r5r/Process/AccessibilityEstimator.java | 0 .../ipea/r5r/Process/DetailedItineraryPlanner.java | 0 .../src/org/ipea/r5r/Process/FaretoDebug.java | 0 .../r5r/Process/FastDetailedItineraryPlanner.java | 0 .../ipea/r5r/Process/ParetoFrontierCalculator.java | 0 .../ipea/r5r/Process/ParetoItineraryPlanner.java | 0 .../src/org/ipea/r5r/Process/PathOptionsTable.java | 0 .../org/ipea/r5r/Process/R5DataFrameProcess.jav | 0 .../org/ipea/r5r/Process/R5DataFrameProcess.java | 0 .../src/org/ipea/r5r/Process/R5Process.java | 0 .../org/ipea/r5r/Process/RegularGridProcess.java | 0 .../ipea/r5r/Process/TravelTimeMatrixComputer.java | 0 .../src/org/ipea/r5r/R5/R5ParetoServer.java | 0 .../src/org/ipea/r5r/R5/R5TravelTimeComputer.java | 0 .../java/{ => r5r}/src/org/ipea/r5r/R5RCore.java | 0 .../{ => r5r}/src/org/ipea/r5r/RDataFrame.java | 0 .../src/org/ipea/r5r/RegularGridResult.java | 0 .../src/org/ipea/r5r/RoutingProperties.java | 0 .../src/org/ipea/r5r/Scenario/DummyScenario.java | 0 .../src/org/ipea/r5r/Scenario/R5RShapefileLts.java | 0 .../org/ipea/r5r/Scenario/R5RShapefileMatcher.java | 0 .../org/ipea/r5r/Scenario/RoadCongestionOSM.java | 0 .../src/org/ipea/r5r/Scenario/SetLtsOsm.java | 0 .../{ => r5r}/src/org/ipea/r5r/SnapFinder.java | 0 .../{ => r5r}/src/org/ipea/r5r/StreetNetwork.java | 0 .../{ => r5r}/src/org/ipea/r5r/TransitNetwork.java | 0 .../src/org/ipea/r5r/Utils/RMapBuilder.java | 0 .../src/org/ipea/r5r/Utils/SpeedSetter.java | 0 .../{ => r5r}/src/org/ipea/r5r/Utils/Utils.java | 0 r-package/java/settings.gradle | 2 +- 48 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 configure rename r-package/java/{ => r5r}/build.gradle (91%) rename r-package/java/{ => r5r}/src/main/resources/logback.xml (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/FarePerRoute.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/FarePerTransfer.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/FarePerType.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/FareStructure.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/FareStructureBuilder.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/IntegratedFare.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/R5RTransferAllowance.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/JsonUtil.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Modifications/R5RFileStorage.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Network/NetworkBuilder.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Network/NetworkChecker.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Planner/Trip.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Planner/TripLeg.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Planner/TripPlanner.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/AccessibilityEstimator.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/FaretoDebug.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/PathOptionsTable.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/R5DataFrameProcess.jav (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/R5DataFrameProcess.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/R5Process.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/RegularGridProcess.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/R5/R5ParetoServer.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/R5/R5TravelTimeComputer.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/R5RCore.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/RDataFrame.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/RegularGridResult.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/RoutingProperties.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Scenario/DummyScenario.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Scenario/R5RShapefileLts.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Scenario/SetLtsOsm.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/SnapFinder.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/StreetNetwork.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/TransitNetwork.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Utils/RMapBuilder.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Utils/SpeedSetter.java (100%) rename r-package/java/{ => r5r}/src/org/ipea/r5r/Utils/Utils.java (100%) diff --git a/configure b/configure new file mode 100644 index 000000000..153bd9496 --- /dev/null +++ b/configure @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +( + cd src + ./gradlew build +) \ No newline at end of file diff --git a/r-package/java/build.gradle b/r-package/java/r5r/build.gradle similarity index 91% rename from r-package/java/build.gradle rename to r-package/java/r5r/build.gradle index 5c792cdd7..27d7d90ea 100644 --- a/r-package/java/build.gradle +++ b/r-package/java/r5r/build.gradle @@ -1,12 +1,13 @@ plugins { id 'java' + id 'com.gradleup.shadow' version '9.4.1' } tasks.withType(Jar).configureEach { preserveFileTimestamps = false reproducibleFileOrder = true archiveFileName.set("r5r.jar") - destinationDirectory.set(file("../inst/jar")) + destinationDirectory.set(file("../../inst/jar")) } group 'org.ipea' @@ -45,8 +46,6 @@ dependencies { implementation 'net.sf.trove4j:trove4j:3.0.3' - implementation 'com.conveyal:r5:7.5' - // Provides our logging API implementation 'org.slf4j:slf4j-api:2.0.7' @@ -66,6 +65,8 @@ dependencies { implementation 'com.esotericsoftware:kryo:5.5.0' implementation files(getRJavaPath()) + + implementation project(':r5') } repositories { @@ -76,4 +77,11 @@ repositories { mavenCentral() // Polyline encoder 0.2 is now in Maven repo maven { url 'https://maven.conveyal.com' } +} + +shadowJar { + filesMatching("META-INF/services/**") { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + } + mergeServiceFiles() } \ No newline at end of file diff --git a/r-package/java/src/main/resources/logback.xml b/r-package/java/r5r/src/main/resources/logback.xml similarity index 100% rename from r-package/java/src/main/resources/logback.xml rename to r-package/java/r5r/src/main/resources/logback.xml diff --git a/r-package/java/src/org/ipea/r5r/Fares/FarePerRoute.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerRoute.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/FarePerRoute.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerRoute.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/FarePerTransfer.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerTransfer.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/FarePerTransfer.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerTransfer.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/FarePerType.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerType.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/FarePerType.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/FarePerType.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/FareStructure.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/FareStructure.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/FareStructure.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/FareStructure.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/FareStructureBuilder.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/FareStructureBuilder.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/FareStructureBuilder.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/FareStructureBuilder.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/IntegratedFare.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/IntegratedFare.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/IntegratedFare.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/IntegratedFare.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/R5RTransferAllowance.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/R5RTransferAllowance.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/R5RTransferAllowance.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/R5RTransferAllowance.java diff --git a/r-package/java/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java b/r-package/java/r5r/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java rename to r-package/java/r5r/src/org/ipea/r5r/Fares/RuleBasedInRoutingFareCalculator.java diff --git a/r-package/java/src/org/ipea/r5r/JsonUtil.java b/r-package/java/r5r/src/org/ipea/r5r/JsonUtil.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/JsonUtil.java rename to r-package/java/r5r/src/org/ipea/r5r/JsonUtil.java diff --git a/r-package/java/src/org/ipea/r5r/Modifications/R5RFileStorage.java b/r-package/java/r5r/src/org/ipea/r5r/Modifications/R5RFileStorage.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Modifications/R5RFileStorage.java rename to r-package/java/r5r/src/org/ipea/r5r/Modifications/R5RFileStorage.java diff --git a/r-package/java/src/org/ipea/r5r/Network/NetworkBuilder.java b/r-package/java/r5r/src/org/ipea/r5r/Network/NetworkBuilder.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Network/NetworkBuilder.java rename to r-package/java/r5r/src/org/ipea/r5r/Network/NetworkBuilder.java diff --git a/r-package/java/src/org/ipea/r5r/Network/NetworkChecker.java b/r-package/java/r5r/src/org/ipea/r5r/Network/NetworkChecker.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Network/NetworkChecker.java rename to r-package/java/r5r/src/org/ipea/r5r/Network/NetworkChecker.java diff --git a/r-package/java/src/org/ipea/r5r/Planner/Trip.java b/r-package/java/r5r/src/org/ipea/r5r/Planner/Trip.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Planner/Trip.java rename to r-package/java/r5r/src/org/ipea/r5r/Planner/Trip.java diff --git a/r-package/java/src/org/ipea/r5r/Planner/TripLeg.java b/r-package/java/r5r/src/org/ipea/r5r/Planner/TripLeg.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Planner/TripLeg.java rename to r-package/java/r5r/src/org/ipea/r5r/Planner/TripLeg.java diff --git a/r-package/java/src/org/ipea/r5r/Planner/TripPlanner.java b/r-package/java/r5r/src/org/ipea/r5r/Planner/TripPlanner.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Planner/TripPlanner.java rename to r-package/java/r5r/src/org/ipea/r5r/Planner/TripPlanner.java diff --git a/r-package/java/src/org/ipea/r5r/Process/AccessibilityEstimator.java b/r-package/java/r5r/src/org/ipea/r5r/Process/AccessibilityEstimator.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/AccessibilityEstimator.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/AccessibilityEstimator.java diff --git a/r-package/java/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java b/r-package/java/r5r/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/DetailedItineraryPlanner.java diff --git a/r-package/java/src/org/ipea/r5r/Process/FaretoDebug.java b/r-package/java/r5r/src/org/ipea/r5r/Process/FaretoDebug.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/FaretoDebug.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/FaretoDebug.java diff --git a/r-package/java/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java b/r-package/java/r5r/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/FastDetailedItineraryPlanner.java diff --git a/r-package/java/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java b/r-package/java/r5r/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/ParetoFrontierCalculator.java diff --git a/r-package/java/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java b/r-package/java/r5r/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/ParetoItineraryPlanner.java diff --git a/r-package/java/src/org/ipea/r5r/Process/PathOptionsTable.java b/r-package/java/r5r/src/org/ipea/r5r/Process/PathOptionsTable.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/PathOptionsTable.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/PathOptionsTable.java diff --git a/r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.jav b/r-package/java/r5r/src/org/ipea/r5r/Process/R5DataFrameProcess.jav similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.jav rename to r-package/java/r5r/src/org/ipea/r5r/Process/R5DataFrameProcess.jav diff --git a/r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.java b/r-package/java/r5r/src/org/ipea/r5r/Process/R5DataFrameProcess.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/R5DataFrameProcess.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/R5DataFrameProcess.java diff --git a/r-package/java/src/org/ipea/r5r/Process/R5Process.java b/r-package/java/r5r/src/org/ipea/r5r/Process/R5Process.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/R5Process.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/R5Process.java diff --git a/r-package/java/src/org/ipea/r5r/Process/RegularGridProcess.java b/r-package/java/r5r/src/org/ipea/r5r/Process/RegularGridProcess.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/RegularGridProcess.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/RegularGridProcess.java diff --git a/r-package/java/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java b/r-package/java/r5r/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java rename to r-package/java/r5r/src/org/ipea/r5r/Process/TravelTimeMatrixComputer.java diff --git a/r-package/java/src/org/ipea/r5r/R5/R5ParetoServer.java b/r-package/java/r5r/src/org/ipea/r5r/R5/R5ParetoServer.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/R5/R5ParetoServer.java rename to r-package/java/r5r/src/org/ipea/r5r/R5/R5ParetoServer.java diff --git a/r-package/java/src/org/ipea/r5r/R5/R5TravelTimeComputer.java b/r-package/java/r5r/src/org/ipea/r5r/R5/R5TravelTimeComputer.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/R5/R5TravelTimeComputer.java rename to r-package/java/r5r/src/org/ipea/r5r/R5/R5TravelTimeComputer.java diff --git a/r-package/java/src/org/ipea/r5r/R5RCore.java b/r-package/java/r5r/src/org/ipea/r5r/R5RCore.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/R5RCore.java rename to r-package/java/r5r/src/org/ipea/r5r/R5RCore.java diff --git a/r-package/java/src/org/ipea/r5r/RDataFrame.java b/r-package/java/r5r/src/org/ipea/r5r/RDataFrame.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/RDataFrame.java rename to r-package/java/r5r/src/org/ipea/r5r/RDataFrame.java diff --git a/r-package/java/src/org/ipea/r5r/RegularGridResult.java b/r-package/java/r5r/src/org/ipea/r5r/RegularGridResult.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/RegularGridResult.java rename to r-package/java/r5r/src/org/ipea/r5r/RegularGridResult.java diff --git a/r-package/java/src/org/ipea/r5r/RoutingProperties.java b/r-package/java/r5r/src/org/ipea/r5r/RoutingProperties.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/RoutingProperties.java rename to r-package/java/r5r/src/org/ipea/r5r/RoutingProperties.java diff --git a/r-package/java/src/org/ipea/r5r/Scenario/DummyScenario.java b/r-package/java/r5r/src/org/ipea/r5r/Scenario/DummyScenario.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Scenario/DummyScenario.java rename to r-package/java/r5r/src/org/ipea/r5r/Scenario/DummyScenario.java diff --git a/r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileLts.java b/r-package/java/r5r/src/org/ipea/r5r/Scenario/R5RShapefileLts.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileLts.java rename to r-package/java/r5r/src/org/ipea/r5r/Scenario/R5RShapefileLts.java diff --git a/r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java b/r-package/java/r5r/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java rename to r-package/java/r5r/src/org/ipea/r5r/Scenario/R5RShapefileMatcher.java diff --git a/r-package/java/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java b/r-package/java/r5r/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java rename to r-package/java/r5r/src/org/ipea/r5r/Scenario/RoadCongestionOSM.java diff --git a/r-package/java/src/org/ipea/r5r/Scenario/SetLtsOsm.java b/r-package/java/r5r/src/org/ipea/r5r/Scenario/SetLtsOsm.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Scenario/SetLtsOsm.java rename to r-package/java/r5r/src/org/ipea/r5r/Scenario/SetLtsOsm.java diff --git a/r-package/java/src/org/ipea/r5r/SnapFinder.java b/r-package/java/r5r/src/org/ipea/r5r/SnapFinder.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/SnapFinder.java rename to r-package/java/r5r/src/org/ipea/r5r/SnapFinder.java diff --git a/r-package/java/src/org/ipea/r5r/StreetNetwork.java b/r-package/java/r5r/src/org/ipea/r5r/StreetNetwork.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/StreetNetwork.java rename to r-package/java/r5r/src/org/ipea/r5r/StreetNetwork.java diff --git a/r-package/java/src/org/ipea/r5r/TransitNetwork.java b/r-package/java/r5r/src/org/ipea/r5r/TransitNetwork.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/TransitNetwork.java rename to r-package/java/r5r/src/org/ipea/r5r/TransitNetwork.java diff --git a/r-package/java/src/org/ipea/r5r/Utils/RMapBuilder.java b/r-package/java/r5r/src/org/ipea/r5r/Utils/RMapBuilder.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Utils/RMapBuilder.java rename to r-package/java/r5r/src/org/ipea/r5r/Utils/RMapBuilder.java diff --git a/r-package/java/src/org/ipea/r5r/Utils/SpeedSetter.java b/r-package/java/r5r/src/org/ipea/r5r/Utils/SpeedSetter.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Utils/SpeedSetter.java rename to r-package/java/r5r/src/org/ipea/r5r/Utils/SpeedSetter.java diff --git a/r-package/java/src/org/ipea/r5r/Utils/Utils.java b/r-package/java/r5r/src/org/ipea/r5r/Utils/Utils.java similarity index 100% rename from r-package/java/src/org/ipea/r5r/Utils/Utils.java rename to r-package/java/r5r/src/org/ipea/r5r/Utils/Utils.java diff --git a/r-package/java/settings.gradle b/r-package/java/settings.gradle index 12aa99c76..7cf13e34a 100644 --- a/r-package/java/settings.gradle +++ b/r-package/java/settings.gradle @@ -1 +1 @@ -includeBuild 'r5' \ No newline at end of file +include('r5r', 'r5') \ No newline at end of file From 674947f9000be24d9bf9f1415b7e6ee319f43d1c Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 16:54:04 -0400 Subject: [PATCH 18/23] fix JAI/elevation issues --- r-package/NAMESPACE | 2 - r-package/R/download_r5.R | 103 -------------------- r-package/R/onLoad.R | 20 ---- r-package/R/r5r_cache.R | 72 -------------- r-package/R/utils.R | 31 ------ r-package/configure | 2 +- r-package/java/r5r/build.gradle | 12 +++ r-package/tests/testthat/test-download_r5.R | 28 ------ 8 files changed, 13 insertions(+), 257 deletions(-) delete mode 100644 r-package/R/download_r5.R delete mode 100644 r-package/R/r5r_cache.R delete mode 100644 r-package/tests/testthat/test-download_r5.R diff --git a/r-package/NAMESPACE b/r-package/NAMESPACE index 5cb46f69f..228b6be49 100644 --- a/r-package/NAMESPACE +++ b/r-package/NAMESPACE @@ -5,13 +5,11 @@ export(arrival_travel_time_matrix) export(build_network) export(check_transit_availability) export(detailed_itineraries) -export(download_r5) export(expanded_travel_time_matrix) export(find_snap) export(get_gtfs_errors) export(isochrone) export(pareto_frontier) -export(r5r_cache) export(r5r_sitrep) export(read_fare_structure) export(setup_fare_structure) diff --git a/r-package/R/download_r5.R b/r-package/R/download_r5.R deleted file mode 100644 index 4d5f8825c..000000000 --- a/r-package/R/download_r5.R +++ /dev/null @@ -1,103 +0,0 @@ -#' Download `R5.jar` -#' -#' Downloads `R5.jar` and saves it locally, inside the package directory. -#' -#' @param version A string. The version of R5 to be downloaded. When `NULL`, it -#' defaults to the latest version. -#' @param quiet A logical. Whether to show informative messages when downloading -#' the file. Defaults to `FALSE`. -#' @param force_update A logical. Whether to overwrite a previously downloaded -#' `R5.jar` in the local directory. Defaults to `FALSE`. -#' @param temp_dir A logical. Whether the file should be saved in a temporary -#' directory. Defaults to `FALSE`. -#' -#' @return The path to the downloaded file. -#' -#' @family Build network -#' -#' @examplesIf identical(tolower(Sys.getenv("NOT_CRAN")), "true") -#' library(r5r) -#' -#' download_r5(temp_dir = TRUE) -#' @export -download_r5 <- function(version = NULL, - quiet = FALSE, - force_update = FALSE, - temp_dir = FALSE) { - - # R5 version - if (is.null(version)) {version = r5r_env$r5_jar_version} - - - # check inputs ---------------------------------------------------------- - - checkmate::assert_logical(quiet) - checkmate::assert_logical(force_update) - checkmate::assert_logical(temp_dir) - - - # set timeout options --------------------------------------------------- - - old_options <- options() - on.exit(options(old_options), add = TRUE) - - options(timeout = max(600, getOption("timeout"))) - - - # download R5 jar ----------------------------------------------------- - - if (!dir.exists(r5r_env$cache_dir)) {dir.create(r5r_env$cache_dir, recursive = TRUE)} - - file_url <- fileurl_from_metadata(version) - filename <- basename(file_url) - - jar_file <- data.table::fifelse( - temp_dir, - file.path(tempdir(), filename), - file.path( r5r_env$cache_dir , filename) - ) - - # check if the file exists and is not corrupted - if (file.exists(jar_file) && file.info(jar_file)$size < r5r_env$r5_jar_size && isFALSE(force_update)) { - stop(message("R5 Jar file is corrupted. To fix this problem, download it again with 'r5r::download_r5(force_update = TRUE)'")) - } - - # check if the file exists, and returns its path if it does. otherwise, - # download it from IPEA's server - if there's no internet connection "fail - # gracefully" (i.e invisibly returns NULL and outputs a informative message)" - if (file.exists(jar_file) && (force_update == FALSE)) { - if (!quiet) message("Using cached R5 version from ", jar_file) - return(jar_file) - } - - # download JAR - message("Downloading R5 jar file to ", jar_file) - - try(silent = TRUE, - utils::download.file( - url = file_url, - destfile = jar_file, - mode = "wb", - # method = "curl", - # extra = "--insecure", - quiet = quiet - ) - ) - - # try(silent = TRUE, - # httr::GET(url=file_url, - # if(isFALSE(quiet)){ httr::progress()}, - # httr::write_disk(jar_file, overwrite = TRUE), - # config = httr::config(ssl_verifypeer = FALSE)) - # ) - - -# Halt function if download failed (file must exist and be larger than 60 MB) -if (!file.exists(jar_file) | file.info(jar_file)$size < r5r_env$r5_jar_size) { - message('Internet connection not working properly.') - return(invisible(NULL)) - } - - return(jar_file) - -} diff --git a/r-package/R/onLoad.R b/r-package/R/onLoad.R index cca53e077..b9e08c073 100644 --- a/r-package/R/onLoad.R +++ b/r-package/R/onLoad.R @@ -13,23 +13,3 @@ # package global variables r5r_env <- new.env(parent = emptyenv()) - -.onLoad <- function(lib, pkg) { # nocov start - - # JAR version - r5r_env$r5_jar_version <- "7.4.0" # "7.5.0" - r5r_env$r5_jar_size <- 63866633 # 64430357 - - # create dir to store R5 Jar - cache_d <- paste0('r5r/r5_jar_v', r5r_env$r5_jar_version) - r5r_env$cache_dir <- tools::R_user_dir(cache_d, which = 'cache') - if (!dir.exists(r5r_env$cache_dir)) dir.create(r5r_env$cache_dir, recursive = TRUE) - # gsub("\\\\", "/", r5r_env$cache_dir) - - ## delete any JAR files from old releases - dir_above <- dirname(r5r_env$cache_dir) - all_cache <- list.files(dir_above, pattern = 'r5',full.names = TRUE) - old_cache <- all_cache[!grepl(r5r_env$r5_jar_version, all_cache)] - if(length(old_cache)>0){ unlink(old_cache, recursive = TRUE) } - -} # nocov end diff --git a/r-package/R/r5r_cache.R b/r-package/R/r5r_cache.R deleted file mode 100644 index b618654b9..000000000 --- a/r-package/R/r5r_cache.R +++ /dev/null @@ -1,72 +0,0 @@ -#' Manage cached files from the r5r package -#' -#' @param list_files Logical. Whether to print a message with the address of r5r -#' JAR files cached locally. Defaults to `TRUE`. -#' @param delete_file String. The file name (basename) of a JAR file cached -#' locally that should be deleted. Defaults to `NULL`, so that no -#' file is deleted. If `delete_file = "all"`, then all cached files are -#' deleted. -#' -#' @return A message indicating which file exist and/or which ones have been -#' deleted from local cache directory. -#' @export -#' @family Cache data -#' @examplesIf identical(tolower(Sys.getenv("NOT_CRAN")), "true") -#' # download r5 JAR -#' r5r::download_r5() -#' -#' # list all files cached -#' r5r_cache(list_files = TRUE) -#' -#' # delete r5 JAR -#' r5r_cache(delete_file = 'r5-v7.0') -#' -r5r_cache <- function(list_files = TRUE, - delete_file = NULL){ - - # check inputs - checkmate::assert_logical(list_files) - checkmate::assert_character(delete_file, null.ok = TRUE) - - # find / create local dir - if (!dir.exists(r5r_env$cache_dir)) { dir.create(r5r_env$cache_dir, recursive=TRUE) } - - # list cached files - files <- list.files(dirname(r5r_env$cache_dir), full.names = TRUE, recursive = TRUE) - - # if wants to delete file - # delete_file = "r5-v7.0-all.jar" - if (!is.null(delete_file)) { - - # IF file does not exist, print message - if (!any(grepl(delete_file, files)) & delete_file != "all") { - message(paste0("The file '", delete_file, "' is not cached.")) - } - - # IF file exists, delete file - if (any(grepl(delete_file, files))) { - f <- files[grepl(delete_file, files)] - unlink(f, recursive = TRUE, force = TRUE) - message(paste0("The file '", delete_file, "' has been removed.")) - } - - # Delete ALL file - if (delete_file=='all') { - - # delete any files from censobr, current and old data releases - dir_above <- dirname(r5r_env$cache_dir) - unlink(dir_above, recursive = TRUE, force = TRUE) - message(paste0("All files have been removed.")) - - } - } - - # list cached files - files <- list.files(r5r_env$cache_dir, full.names = TRUE) - - # print file names - if(isTRUE(list_files)){ - message('Files currently cached:') - message(paste0(files, collapse = '\n')) - } -} diff --git a/r-package/R/utils.R b/r-package/R/utils.R index 7f0cca73c..da0676505 100644 --- a/r-package/R/utils.R +++ b/r-package/R/utils.R @@ -127,37 +127,6 @@ start_r5r_java <- function(data_path, # r5r jar r5r_jar <- system.file("jar/r5r.jar", package = "r5r") rJava::.jaddClassPath(path = r5r_jar) - - # r5r jar - # check if the most recent JAR release is stored already. - fileurl <- fileurl_from_metadata( r5r_env$r5_jar_version ) - filename <- basename(fileurl) - - if (is.null(getOption("r5r.r5jar"))) { - jar_file <- data.table::fifelse( - temp_dir, - file.path(tempdir(), filename), - file.path( r5r_env$cache_dir, filename) - ) - - # If there isn't a JAR already larger than 60MB, download it - if (checkmate::test_file_exists(jar_file) && file.info(jar_file)$size > r5r_env$r5_jar_size) { - if (!verbose) message("Using cached R5 version from ", jar_file) - } else { - check <- download_r5(temp_dir = temp_dir, quiet = !verbose) - if (is.null(check)) { return(invisible(NULL)) } - } - } else { - jar_file <- getOption("r5r.r5jar") - if (checkmate::test_file_exists(jar_file)) { - message("Overriding default R5 with option r5r.r5jar, using ", jar_file) - } else { - stop(paste0("Cannot find r5 jar \"", jar_file, "\", specified in options(r5r.r5jar)")) - } - } - - # R5 jar - rJava::.jaddClassPath(path = jar_file) } # nocov end diff --git a/r-package/configure b/r-package/configure index 61cb609fc..6c21296fd 100755 --- a/r-package/configure +++ b/r-package/configure @@ -3,5 +3,5 @@ set -x ( cd java - ./gradlew build + ./gradlew shadowJar ) \ No newline at end of file diff --git a/r-package/java/r5r/build.gradle b/r-package/java/r5r/build.gradle index 27d7d90ea..66576e4f9 100644 --- a/r-package/java/r5r/build.gradle +++ b/r-package/java/r5r/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geojsondatastore' implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geopkg' implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-geotiff' + implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-image' // Provides the EPSG coordinate reference system catalog as an HSQL database. implementation group: 'org.geotools', version: geotoolsVersion, name: 'gt-epsg-hsql' @@ -79,6 +80,17 @@ repositories { maven { url 'https://maven.conveyal.com' } } +jar { + // For Java 11+ Modules, specify a module name to avoid errors instantiating JAI classes + manifest { + attributes 'Automatic-Module-Name': 'org.ipea.r5r', + 'Build-Jdk-Spec': java.toolchain.languageVersion, + 'Implementation-Title': 'R5R', + 'Implementation-Vendor': 'Ipea', + 'Implementation-Version': project.version + } +} + shadowJar { filesMatching("META-INF/services/**") { duplicatesStrategy = DuplicatesStrategy.INCLUDE diff --git a/r-package/tests/testthat/test-download_r5.R b/r-package/tests/testthat/test-download_r5.R deleted file mode 100644 index 629dc3762..000000000 --- a/r-package/tests/testthat/test-download_r5.R +++ /dev/null @@ -1,28 +0,0 @@ -context("download_r5") - -# skips tests on CRAN -testthat::skip_on_cran() - -# expected behavior -test_that("download_r5 - expected behavior", { - - testthat::expect_vector(download_r5(force_update = TRUE, temp_dir = TRUE)) - testthat::expect_vector(download_r5(force_update = TRUE, temp_dir = FALSE)) - testthat::expect_vector(download_r5(force_update = FALSE, temp_dir = TRUE)) - testthat::expect_vector(download_r5(force_update = FALSE, quiet = TRUE)) - - # testthat::expect_vector(download_r5()) - # file.remove(file.path(.libPaths()[1], "r5r", "jar", "r5r_v4.9.0.jar")) - # testthat::expect_vector(download_r5(version='4.9.0')) - -}) - -# Expected errors -test_that("download_r5 - expected errors", { - - testthat::expect_error( download_r5(version = "0") ) - testthat::expect_error(download_r5(force_update = 'a')) - testthat::expect_error(download_r5(quiet = 'a')) - testthat::expect_error(download_r5(temp_dir = 'a')) - - }) From cb108d520237f32ec509bb9aa72ea3deab0957a1 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 16:54:26 -0400 Subject: [PATCH 19/23] rebuild docs --- r-package/man/accessibility.Rd | 2 +- r-package/man/arrival_travel_time_matrix.Rd | 2 +- r-package/man/build_network.Rd | 3 +- r-package/man/check_transit_availability.Rd | 2 +- r-package/man/congestion_poly2geojson.Rd | 2 +- r-package/man/detailed_itineraries.Rd | 2 +- r-package/man/download_r5.Rd | 45 -------------------- r-package/man/expanded_travel_time_matrix.Rd | 2 +- r-package/man/find_snap.Rd | 2 +- r-package/man/get_gtfs_errors.Rd | 2 +- r-package/man/isochrone.Rd | 2 +- r-package/man/lts_lines2shp.Rd | 2 +- r-package/man/pareto_frontier.Rd | 2 +- r-package/man/r5r_cache.Rd | 37 ---------------- r-package/man/r5r_sitrep.Rd | 2 +- r-package/man/read_fare_structure.Rd | 2 +- r-package/man/setup_fare_structure.Rd | 2 +- r-package/man/setup_r5.Rd | 5 +-- r-package/man/stop_r5.Rd | 2 +- r-package/man/street_network_bbox.Rd | 2 +- r-package/man/street_network_to_sf.Rd | 2 +- r-package/man/transit_network_to_sf.Rd | 2 +- r-package/man/travel_time_matrix.Rd | 2 +- r-package/man/write_fare_structure.Rd | 2 +- 24 files changed, 23 insertions(+), 107 deletions(-) delete mode 100644 r-package/man/download_r5.Rd delete mode 100644 r-package/man/r5r_cache.Rd diff --git a/r-package/man/accessibility.Rd b/r-package/man/accessibility.Rd index c5915c937..d278ad9fe 100644 --- a/r-package/man/accessibility.Rd +++ b/r-package/man/accessibility.Rd @@ -370,7 +370,7 @@ transit routing. Transportation Science, 49(3), 591-604. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) data_path <- system.file("extdata/poa", package = "r5r") diff --git a/r-package/man/arrival_travel_time_matrix.Rd b/r-package/man/arrival_travel_time_matrix.Rd index c7b5b9fd7..3c6aa5bee 100644 --- a/r-package/man/arrival_travel_time_matrix.Rd +++ b/r-package/man/arrival_travel_time_matrix.Rd @@ -276,7 +276,7 @@ transit routing. Transportation Science, 49(3), 591-604. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/build_network.Rd b/r-package/man/build_network.Rd index c14c68e46..2d72382a5 100644 --- a/r-package/man/build_network.Rd +++ b/r-package/man/build_network.Rd @@ -71,7 +71,7 @@ information and analysis. 93 (1). \url{https://escholarship.org/uc/item/05r820mz } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # directory with street network and gtfs files @@ -82,7 +82,6 @@ r5r_network <- build_network(data_path) } \seealso{ Other Build network: -\code{\link{download_r5}()}, \code{\link{setup_r5}()} } \concept{Build network} diff --git a/r-package/man/check_transit_availability.Rd b/r-package/man/check_transit_availability.Rd index 8e14b35da..8e0c19f59 100644 --- a/r-package/man/check_transit_availability.Rd +++ b/r-package/man/check_transit_availability.Rd @@ -50,7 +50,7 @@ You can specify the dates to check in two ways: You must use one of these two methods, but not both in the same function call. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) data_path <- system.file("extdata/poa", package = "r5r") r5r_network <- build_network(data_path) diff --git a/r-package/man/congestion_poly2geojson.Rd b/r-package/man/congestion_poly2geojson.Rd index d94c78643..fda7d6dd2 100644 --- a/r-package/man/congestion_poly2geojson.Rd +++ b/r-package/man/congestion_poly2geojson.Rd @@ -17,7 +17,7 @@ Support function that checks the input of speeds polygon passed to \code{build_custom_network()} and saves it to a \code{.geojson} temporary file. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # read polygons with new speeds congestion_poly <- readRDS( diff --git a/r-package/man/detailed_itineraries.Rd b/r-package/man/detailed_itineraries.Rd index e110d9c23..c1640f385 100644 --- a/r-package/man/detailed_itineraries.Rd +++ b/r-package/man/detailed_itineraries.Rd @@ -312,7 +312,7 @@ Information Science, 33(9), 1759-1787. \doi{10.1080/13658816.2019.1605075} } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/download_r5.Rd b/r-package/man/download_r5.Rd deleted file mode 100644 index b9be19d00..000000000 --- a/r-package/man/download_r5.Rd +++ /dev/null @@ -1,45 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/download_r5.R -\name{download_r5} -\alias{download_r5} -\title{Download \code{R5.jar}} -\usage{ -download_r5( - version = NULL, - quiet = FALSE, - force_update = FALSE, - temp_dir = FALSE -) -} -\arguments{ -\item{version}{A string. The version of R5 to be downloaded. When \code{NULL}, it -defaults to the latest version.} - -\item{quiet}{A logical. Whether to show informative messages when downloading -the file. Defaults to \code{FALSE}.} - -\item{force_update}{A logical. Whether to overwrite a previously downloaded -\code{R5.jar} in the local directory. Defaults to \code{FALSE}.} - -\item{temp_dir}{A logical. Whether the file should be saved in a temporary -directory. Defaults to \code{FALSE}.} -} -\value{ -The path to the downloaded file. -} -\description{ -Downloads \code{R5.jar} and saves it locally, inside the package directory. -} -\examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} -library(r5r) - -download_r5(temp_dir = TRUE) -\dontshow{\}) # examplesIf} -} -\seealso{ -Other Build network: -\code{\link{build_network}()}, -\code{\link{setup_r5}()} -} -\concept{Build network} diff --git a/r-package/man/expanded_travel_time_matrix.Rd b/r-package/man/expanded_travel_time_matrix.Rd index 79b58cef3..e4c714c46 100644 --- a/r-package/man/expanded_travel_time_matrix.Rd +++ b/r-package/man/expanded_travel_time_matrix.Rd @@ -281,7 +281,7 @@ transit routing. Transportation Science, 49(3), 591-604. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/find_snap.Rd b/r-package/man/find_snap.Rd index 3649cdded..60c0b3424 100644 --- a/r-package/man/find_snap.Rd +++ b/r-package/man/find_snap.Rd @@ -47,7 +47,7 @@ because some network edges are not available to specific modes (e.g. a pedestrian-only street cannot be used to snap car trips). } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) path <- system.file("extdata/poa", package = "r5r") diff --git a/r-package/man/get_gtfs_errors.Rd b/r-package/man/get_gtfs_errors.Rd index 52d0f6c21..36cd72786 100644 --- a/r-package/man/get_gtfs_errors.Rd +++ b/r-package/man/get_gtfs_errors.Rd @@ -20,7 +20,7 @@ network build fails, you won't have a network object, so you can also call this with the \code{data_path} to where the network is stored. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # directory with street network and gtfs files diff --git a/r-package/man/isochrone.Rd b/r-package/man/isochrone.Rd index 544888be0..f02a41ef2 100644 --- a/r-package/man/isochrone.Rd +++ b/r-package/man/isochrone.Rd @@ -255,7 +255,7 @@ transit routing. Transportation Science, 49(3), 591-604. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} options(java.parameters = "-Xmx2G") library(r5r) library(ggplot2) diff --git a/r-package/man/lts_lines2shp.Rd b/r-package/man/lts_lines2shp.Rd index d3babef5f..cb9a94c63 100644 --- a/r-package/man/lts_lines2shp.Rd +++ b/r-package/man/lts_lines2shp.Rd @@ -17,7 +17,7 @@ Support function that checks the input of LTS lines passed to and saves it to a \code{.shp} temporary file. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # read lines with new speeds new_lts_lines <- readRDS( diff --git a/r-package/man/pareto_frontier.Rd b/r-package/man/pareto_frontier.Rd index fe9392726..d4ddd76ca 100644 --- a/r-package/man/pareto_frontier.Rd +++ b/r-package/man/pareto_frontier.Rd @@ -267,7 +267,7 @@ Information Science, 33(9), 1759-1787. \doi{10.1080/13658816.2019.1605075} } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/r5r_cache.Rd b/r-package/man/r5r_cache.Rd deleted file mode 100644 index d5f044549..000000000 --- a/r-package/man/r5r_cache.Rd +++ /dev/null @@ -1,37 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/r5r_cache.R -\name{r5r_cache} -\alias{r5r_cache} -\title{Manage cached files from the r5r package} -\usage{ -r5r_cache(list_files = TRUE, delete_file = NULL) -} -\arguments{ -\item{list_files}{Logical. Whether to print a message with the address of r5r -JAR files cached locally. Defaults to \code{TRUE}.} - -\item{delete_file}{String. The file name (basename) of a JAR file cached -locally that should be deleted. Defaults to \code{NULL}, so that no -file is deleted. If \code{delete_file = "all"}, then all cached files are -deleted.} -} -\value{ -A message indicating which file exist and/or which ones have been -deleted from local cache directory. -} -\description{ -Manage cached files from the r5r package -} -\examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} -# download r5 JAR -r5r::download_r5() - -# list all files cached -r5r_cache(list_files = TRUE) - -# delete r5 JAR -r5r_cache(delete_file = 'r5-v7.0') -\dontshow{\}) # examplesIf} -} -\concept{Cache data} diff --git a/r-package/man/r5r_sitrep.Rd b/r-package/man/r5r_sitrep.Rd index 22ddddfa4..aad6915ca 100644 --- a/r-package/man/r5r_sitrep.Rd +++ b/r-package/man/r5r_sitrep.Rd @@ -21,7 +21,7 @@ The function reports a list with the following information: } } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} r5r_sitrep() \dontshow{\}) # examplesIf} } diff --git a/r-package/man/read_fare_structure.Rd b/r-package/man/read_fare_structure.Rd index bb2284ede..b0b36cbbc 100644 --- a/r-package/man/read_fare_structure.Rd +++ b/r-package/man/read_fare_structure.Rd @@ -22,7 +22,7 @@ A fare structure object. Read a fare structure object from a file } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} path <- system.file("extdata/poa/fares/fares_poa.zip", package = "r5r") fare_structure <- read_fare_structure(path) \dontshow{\}) # examplesIf} diff --git a/r-package/man/setup_fare_structure.Rd b/r-package/man/setup_fare_structure.Rd index afe36c4bb..32b412b1e 100644 --- a/r-package/man/setup_fare_structure.Rd +++ b/r-package/man/setup_fare_structure.Rd @@ -70,7 +70,7 @@ manually edited and adjusted to the existing rules in your study area, as long as they stick to some basic premises. Please see the \href{../doc/fare_structure.html}{fare-structure vignette} for more information. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) data_path <- system.file("extdata/poa", package = "r5r") diff --git a/r-package/man/setup_r5.Rd b/r-package/man/setup_r5.Rd index e22860818..57b40fb63 100644 --- a/r-package/man/setup_r5.Rd +++ b/r-package/man/setup_r5.Rd @@ -67,7 +67,7 @@ information and analysis. 93 (1). \url{https://escholarship.org/uc/item/05r820mz } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # directory with street network and gtfs files @@ -79,7 +79,6 @@ r5r_network <- build_network(data_path) } \seealso{ Other Build network: -\code{\link{build_network}()}, -\code{\link{download_r5}()} +\code{\link{build_network}()} } \concept{Build network} diff --git a/r-package/man/stop_r5.Rd b/r-package/man/stop_r5.Rd index d7910d349..3c92b2c50 100644 --- a/r-package/man/stop_r5.Rd +++ b/r-package/man/stop_r5.Rd @@ -17,7 +17,7 @@ No return value, called for side effects. Stops running r5r network } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) path <- system.file("extdata/poa", package = "r5r") diff --git a/r-package/man/street_network_bbox.Rd b/r-package/man/street_network_bbox.Rd index 4dc4c1f49..eac91cfe8 100644 --- a/r-package/man/street_network_bbox.Rd +++ b/r-package/man/street_network_bbox.Rd @@ -31,7 +31,7 @@ routable transport network built with \code{\link[=build_network]{build_network( memory-efficient alternative to \code{sf::st_bbox(street_network_to_sf(r5r_net))}. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) library(sf) diff --git a/r-package/man/street_network_to_sf.Rd b/r-package/man/street_network_to_sf.Rd index 0857af73e..427be8053 100644 --- a/r-package/man/street_network_to_sf.Rd +++ b/r-package/man/street_network_to_sf.Rd @@ -21,7 +21,7 @@ Extracts the OpenStreetMap network in \code{sf} format from a routable transport network built with \code{\link[=build_network]{build_network()}}). } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/transit_network_to_sf.Rd b/r-package/man/transit_network_to_sf.Rd index e7fd4c726..a102881d0 100644 --- a/r-package/man/transit_network_to_sf.Rd +++ b/r-package/man/transit_network_to_sf.Rd @@ -28,7 +28,7 @@ Extracts the transit network in \code{sf} format from a routable transport netwo built with \code{\link[=build_network]{build_network()}}). } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/travel_time_matrix.Rd b/r-package/man/travel_time_matrix.Rd index 2fd8876e4..e6695e35b 100644 --- a/r-package/man/travel_time_matrix.Rd +++ b/r-package/man/travel_time_matrix.Rd @@ -289,7 +289,7 @@ transit routing. Transportation Science, 49(3), 591-604. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) # build transport network diff --git a/r-package/man/write_fare_structure.Rd b/r-package/man/write_fare_structure.Rd index 7bf1bb824..505a03821 100644 --- a/r-package/man/write_fare_structure.Rd +++ b/r-package/man/write_fare_structure.Rd @@ -24,7 +24,7 @@ Writes a fare structure object do disk. Fare structure is saved as a collection of \code{.csv} files inside a \code{.zip} file. } \examples{ -\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) withAutoprint(\{ # examplesIf} +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(r5r) data_path <- system.file("extdata/poa", package = "r5r") From e6a6b609b86ad6dd7a5fcdfd8b03d5bf17796c41 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 17:35:51 -0400 Subject: [PATCH 20/23] rm r5r_cache from vignettes, no longer used --- r-package/vignettes/r5r.Rmd | 7 ------- r-package/vignettes/travel_time_matrix.Rmd | 6 ------ 2 files changed, 13 deletions(-) diff --git a/r-package/vignettes/r5r.Rmd b/r-package/vignettes/r5r.Rmd index 042f52329..7dc277354 100644 --- a/r-package/vignettes/r5r.Rmd +++ b/r-package/vignettes/r5r.Rmd @@ -394,13 +394,6 @@ knitr::include_graphics("https://github.com/ipeaGIT/r5r/blob/master/r-package/in r5r::stop_r5(r5r_network) rJava::.jgc(R.gc = TRUE) ``` - -```{r, eval = TRUE, include = FALSE, message = FALSE} -# clean cache (CRAN policy) -r5r::r5r_cache(delete_file = 'all') - -``` - If you have any suggestions or want to report an error, please visit [the package GitHub page](https://github.com/ipeaGIT/r5r). diff --git a/r-package/vignettes/travel_time_matrix.Rmd b/r-package/vignettes/travel_time_matrix.Rmd index a04f96357..6abb15cc8 100644 --- a/r-package/vignettes/travel_time_matrix.Rmd +++ b/r-package/vignettes/travel_time_matrix.Rmd @@ -204,12 +204,6 @@ r5r::stop_r5(r5r_network) rJava::.jgc(R.gc = TRUE) ``` -```{r, eval = TRUE, include = FALSE, message = FALSE} -# clean cache (CRAN policy) -r5r::r5r_cache(delete_file = 'all') - -``` - If you have any suggestions or want to report an error, please visit [the package GitHub page](https://github.com/ipeaGIT/r5r). ## References From 8d52bd4200122a9defef6bf72f8073b504e05d14 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 17:46:13 -0400 Subject: [PATCH 21/23] checkout submodules on GH actions --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18274cf24..feffcc6b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,9 +24,10 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 with: fetch-depth: 0 + submodules: true # ensure our gradle wrapper is correct, https://github.com/gradle/actions/blob/main/docs/wrapper-validation.md - uses: gradle/actions/wrapper-validation@v5 From 8f8ec2059d41e353e5967741e9d454c1439ad449 Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 18:23:43 -0400 Subject: [PATCH 22/23] clean up build files to exclude big files as much as possible --- r-package/.Rbuildignore | 12 +++++++++++- r-package/.Rinstignore | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 r-package/.Rinstignore diff --git a/r-package/.Rbuildignore b/r-package/.Rbuildignore index d7a7296f9..3f2544467 100644 --- a/r-package/.Rbuildignore +++ b/r-package/.Rbuildignore @@ -13,6 +13,16 @@ ^inst/extdata/.*/.*\.mapdb\.p$ ^\.github$ ^inst/img -^inst/jar/r5-.*\.jar$ +# The JAR will be included in the binary package, because it is not in .Rinstignore +^inst/jar$ ^man/figures ^cran-comments\.md$ +^java/r5r/build$ +^java/r5/build$ +^java/build$ +^java/r5r/.gradle$ +^java/r5/.gradle$ +^java/.gradle$ + +# lots of big files used in r5 tests, which we don't need to run +^java/r5/src/test$ \ No newline at end of file diff --git a/r-package/.Rinstignore b/r-package/.Rinstignore new file mode 100644 index 000000000..3ce0a16d0 --- /dev/null +++ b/r-package/.Rinstignore @@ -0,0 +1,3 @@ +^extdata/.*/.*\.dat$ +^extdata/.*/.*\.log$ +^extdata/.*/.*\.mapdb\.p$ \ No newline at end of file From 5dd61df2b0684704c55b9f93de51c110f347ef3d Mon Sep 17 00:00:00 2001 From: Matt Bhagat-Conway Date: Sat, 28 Mar 2026 19:03:29 -0400 Subject: [PATCH 23/23] remove r5r_cache and download_r5 from tests --- r-package/tests/testthat/test-z_r5r_cache.R | 56 --------------------- 1 file changed, 56 deletions(-) delete mode 100644 r-package/tests/testthat/test-z_r5r_cache.R diff --git a/r-package/tests/testthat/test-z_r5r_cache.R b/r-package/tests/testthat/test-z_r5r_cache.R deleted file mode 100644 index fa8c2cfe4..000000000 --- a/r-package/tests/testthat/test-z_r5r_cache.R +++ /dev/null @@ -1,56 +0,0 @@ -context("r5r_cache") - -# skip tests because they take too much time -skip_if(Sys.getenv("TEST_ONE") != "") -testthat::skip_on_cran() - -try(silent = TRUE, r5r::stop_r5()) - -# Reading the data ----------------------- - -test_that("r5r_cache", { - - # simply list files - testthat::expect_message( r5r::r5r_cache() ) - - ## delete existing - - # download - r5r::download_r5(force_update = FALSE) - - # cache dir - cache_d <- paste0('r5r/r5_jar_v', r5r_env$r5_jar_version) - cache_dir <- tools::R_user_dir(cache_d, which = 'cache') - - # list cached files - fname_full <- list.files(cache_dir, full.names = TRUE) - fname <- basename(fname_full) - - testthat::expect_true( file.exists(fname_full) ) - testthat::expect_message( r5r::r5r_cache(delete_file = fname) ) - # testthat::expect_false( file.exists(fname_full) ) - - ## delete ALL - # download - r5r::download_r5(force_update = FALSE) - - testthat::expect_true( file.exists(fname_full) ) - testthat::expect_message( r5r::r5r_cache(delete_file = 'all') ) - # testthat::expect_true( length(list.files(cache_dir)) == 0 ) - - # if file does not exist, simply print message - testthat::expect_message( r5r::r5r_cache(delete_file ='aaa') ) - - }) - - -# ERRORS and messages ----------------------- -test_that("r5r_cache", { - - testthat::expect_error(r5r_cache(list_files= 999)) - testthat::expect_error(r5r_cache(delete_file = 999)) - }) - - -# clean cache -r5r_cache(delete_file = 'all')