Skip to content

Commit 2136a1a

Browse files
authored
feat(server): specify routing parameters for the whole batch (#220)
1 parent 24e9d71 commit 2136a1a

4 files changed

Lines changed: 100 additions & 35 deletions

File tree

server/src/main/java/org/eqasim/server/api/TransitRouterEndpoint.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import org.eqasim.server.services.router.transit.TransitRouterRequest;
1212
import org.eqasim.server.services.router.transit.TransitRouterResponse;
1313
import org.eqasim.server.services.router.transit.TransitRouterService;
14+
import org.eqasim.server.services.router.transit.TransitUtilities;
1415

1516
import com.fasterxml.jackson.core.JsonProcessingException;
1617

1718
import io.javalin.http.Context;
19+
import jakarta.annotation.Nullable;
1820

1921
public class TransitRouterEndpoint extends AbstractEndpoint {
2022
private final ExecutorService executor;
@@ -25,11 +27,11 @@ public TransitRouterEndpoint(ExecutorService executor, TransitRouterService serv
2527
this.service = service;
2628
}
2729

28-
private Collection<TransitRouterResponse> process(List<TransitRouterRequest> requests)
29-
throws InterruptedException, ExecutionException {
30+
private Collection<TransitRouterResponse> process(List<TransitRouterRequest> requests,
31+
@Nullable TransitUtilities utilities) throws InterruptedException, ExecutionException {
3032
List<Callable<TransitRouterResponse>> tasks = new LinkedList<>();
3133
for (TransitRouterRequest request : requests) {
32-
tasks.add(() -> service.processRequest(request));
34+
tasks.add(() -> service.processRequest(request, utilities));
3335
}
3436

3537
List<TransitRouterResponse> response = new LinkedList<>();
@@ -44,14 +46,16 @@ public void post(Context ctx) throws JsonProcessingException, InterruptedExcepti
4446
Request request = readRequest(ctx, Request.class);
4547

4648
if (request.request != null) {
47-
writeResponse(ctx, process(Collections.singletonList(request.request)).iterator().next());
49+
writeResponse(ctx,
50+
process(Collections.singletonList(request.request), request.utilities).iterator().next());
4851
} else {
49-
writeResponse(ctx, process(request.batch));
52+
writeResponse(ctx, process(request.batch, request.utilities));
5053
}
5154
}
5255

5356
static public class Request {
5457
public TransitRouterRequest request = null;
5558
public List<TransitRouterRequest> batch = new LinkedList<>();
59+
public TransitUtilities utilities = null;
5660
}
5761
}

server/src/main/java/org/eqasim/server/services/router/transit/TransitRouterRequest.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,5 @@ public class TransitRouterRequest {
2828
public boolean provideGeometry = false;
2929

3030
@JsonProperty("utilities")
31-
public Utilities utilities = null;
32-
33-
public class Utilities {
34-
public Double rail_u_h = null;
35-
public Double subway_u_h = null;
36-
public Double bus_u_h = null;
37-
public Double tram_u_h = null;
38-
public Double other_u_h = null;
39-
public Double wait_u_h = null;
40-
public Double walk_u_h = null;
41-
public Double transfer_u = null;
42-
}
31+
public TransitUtilities utilities = null;
4332
}

server/src/main/java/org/eqasim/server/services/router/transit/TransitRouterService.java

Lines changed: 78 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import ch.sbb.matsim.routing.pt.raptor.RaptorUtils;
4646
import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptor;
4747
import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptorData;
48+
import jakarta.annotation.Nullable;
4849

4950
public class TransitRouterService {
5051
private final static GeometryFactory geometryFactory = new GeometryFactory();
@@ -72,7 +73,7 @@ public class TransitRouterService {
7273
this.schedule = schedule;
7374
}
7475

75-
public TransitRouterResponse processRequest(TransitRouterRequest request) {
76+
public TransitRouterResponse processRequest(TransitRouterRequest request, @Nullable TransitUtilities utilities) {
7677
TransitRouterResponse response = new TransitRouterResponse();
7778
response.requestIndex = request.requestIndex;
7879

@@ -89,7 +90,10 @@ public TransitRouterResponse processRequest(TransitRouterRequest request) {
8990
Facility fromFacility = FacilitiesUtils.wrapLinkAndCoord(fromLink, fromCoord);
9091
Facility toFacility = FacilitiesUtils.wrapLinkAndCoord(toLink, toCoord);
9192

92-
RaptorParameters parameters = createParameters(config, configuration, walkConfiguration, request, schedule);
93+
TransitUtilities appliedUtilities = mergeUtilities(utilities, request.utilities);
94+
95+
RaptorParameters parameters = createParameters(config, configuration, walkConfiguration, appliedUtilities,
96+
schedule);
9397
SwissRailRaptor router = new SwissRailRaptor(data, person -> parameters, routeSelector, stopFinder,
9498
inVehicleCostCalculator, transferCostCalculator);
9599

@@ -410,7 +414,7 @@ static public WalkParameters createWalkParameters(Config config, WalkConfigurati
410414
}
411415

412416
static private RaptorParameters createParameters(Config config, TransitConfiguration configuration,
413-
WalkConfiguration walkConfiguration, TransitRouterRequest request, TransitSchedule schedule) {
417+
WalkConfiguration walkConfiguration, @Nullable TransitUtilities utilities, TransitSchedule schedule) {
414418
RaptorParameters parameters = RaptorUtils.createParameters(config);
415419

416420
EqasimRaptorConfigGroup raptorConfig = (EqasimRaptorConfigGroup) config.getModules()
@@ -424,35 +428,35 @@ static private RaptorParameters createParameters(Config config, TransitConfigura
424428
parameters.setDirectWalkFactor(configuration.directWalkFactor);
425429
}
426430

427-
if (request.utilities != null) {
431+
if (utilities != null) {
428432
parameters.setUseTransportModeUtilities(true);
429433

430-
if (request.utilities.rail_u_h != null) {
431-
parameters.setMarginalUtilityOfTravelTime_utl_s("rail", request.utilities.rail_u_h / 3600.0);
434+
if (utilities.rail_u_h != null) {
435+
parameters.setMarginalUtilityOfTravelTime_utl_s("rail", utilities.rail_u_h / 3600.0);
432436
}
433437

434-
if (request.utilities.subway_u_h != null) {
435-
parameters.setMarginalUtilityOfTravelTime_utl_s("subway", request.utilities.subway_u_h / 3600.0);
438+
if (utilities.subway_u_h != null) {
439+
parameters.setMarginalUtilityOfTravelTime_utl_s("subway", utilities.subway_u_h / 3600.0);
436440
}
437441

438-
if (request.utilities.bus_u_h != null) {
439-
parameters.setMarginalUtilityOfTravelTime_utl_s("bus", request.utilities.bus_u_h / 3600.0);
442+
if (utilities.bus_u_h != null) {
443+
parameters.setMarginalUtilityOfTravelTime_utl_s("bus", utilities.bus_u_h / 3600.0);
440444
}
441445

442-
if (request.utilities.tram_u_h != null) {
443-
parameters.setMarginalUtilityOfTravelTime_utl_s("tram", request.utilities.tram_u_h / 3600.0);
446+
if (utilities.tram_u_h != null) {
447+
parameters.setMarginalUtilityOfTravelTime_utl_s("tram", utilities.tram_u_h / 3600.0);
444448
}
445449

446-
if (request.utilities.wait_u_h != null) {
447-
parameters.setMarginalUtilityOfWaitingPt_utl_s(request.utilities.wait_u_h / 3600.0);
450+
if (utilities.wait_u_h != null) {
451+
parameters.setMarginalUtilityOfWaitingPt_utl_s(utilities.wait_u_h / 3600.0);
448452
}
449453

450-
if (request.utilities.walk_u_h != null) {
451-
parameters.setMarginalUtilityOfTravelTime_utl_s("walk", request.utilities.walk_u_h / 3600.0);
454+
if (utilities.walk_u_h != null) {
455+
parameters.setMarginalUtilityOfTravelTime_utl_s("walk", utilities.walk_u_h / 3600.0);
452456
}
453457

454-
if (request.utilities.transfer_u != null) {
455-
parameters.setTransferPenaltyFixCostPerTransfer(-request.utilities.transfer_u);
458+
if (utilities.transfer_u != null) {
459+
parameters.setTransferPenaltyFixCostPerTransfer(-utilities.transfer_u);
456460
}
457461
}
458462

@@ -484,4 +488,60 @@ static public TransitRouterService create(Config config, Network network, Transi
484488

485489
return new TransitRouterService(data, config, network, configuration, walkConfiguration, schedule);
486490
}
491+
492+
static public TransitUtilities mergeUtilities(TransitUtilities globalUtilities, TransitUtilities requestUtilities) {
493+
if (globalUtilities == null && requestUtilities == null) {
494+
return null;
495+
}
496+
497+
if (globalUtilities == null) {
498+
return requestUtilities;
499+
}
500+
501+
TransitUtilities copy = new TransitUtilities();
502+
copy.rail_u_h = globalUtilities.rail_u_h;
503+
copy.subway_u_h = globalUtilities.subway_u_h;
504+
copy.bus_u_h = globalUtilities.bus_u_h;
505+
copy.tram_u_h = globalUtilities.tram_u_h;
506+
copy.other_u_h = globalUtilities.other_u_h;
507+
copy.wait_u_h = globalUtilities.wait_u_h;
508+
copy.walk_u_h = globalUtilities.walk_u_h;
509+
copy.transfer_u = globalUtilities.transfer_u;
510+
511+
if (requestUtilities != null) {
512+
if (requestUtilities.rail_u_h != null) {
513+
copy.rail_u_h = requestUtilities.rail_u_h;
514+
}
515+
516+
if (requestUtilities.subway_u_h != null) {
517+
copy.subway_u_h = requestUtilities.subway_u_h;
518+
}
519+
520+
if (requestUtilities.bus_u_h != null) {
521+
copy.bus_u_h = requestUtilities.bus_u_h;
522+
}
523+
524+
if (requestUtilities.tram_u_h != null) {
525+
copy.tram_u_h = requestUtilities.tram_u_h;
526+
}
527+
528+
if (requestUtilities.other_u_h != null) {
529+
copy.other_u_h = requestUtilities.other_u_h;
530+
}
531+
532+
if (requestUtilities.wait_u_h != null) {
533+
copy.wait_u_h = requestUtilities.wait_u_h;
534+
}
535+
536+
if (requestUtilities.walk_u_h != null) {
537+
copy.walk_u_h = requestUtilities.walk_u_h;
538+
}
539+
540+
if (requestUtilities.transfer_u != null) {
541+
copy.transfer_u = requestUtilities.transfer_u;
542+
}
543+
}
544+
545+
return copy;
546+
}
487547
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.eqasim.server.services.router.transit;
2+
3+
public class TransitUtilities {
4+
public Double rail_u_h = null;
5+
public Double subway_u_h = null;
6+
public Double bus_u_h = null;
7+
public Double tram_u_h = null;
8+
public Double other_u_h = null;
9+
public Double wait_u_h = null;
10+
public Double walk_u_h = null;
11+
public Double transfer_u = null;
12+
}

0 commit comments

Comments
 (0)