MATSIM
ExecutedPlansServiceImpl.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * ExperiencedPlansWriter.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2014 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.withinday.controller;
22 
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
25 import org.matsim.api.core.v01.Id;
26 import org.matsim.api.core.v01.IdMap;
27 import org.matsim.api.core.v01.Scenario;
32 import org.matsim.core.config.Config;
36 import org.matsim.core.gbl.Gbl;
46 
47 import jakarta.inject.Inject;
48 import jakarta.inject.Singleton;
49 import java.util.Map;
50 
58 @Singleton
60  // I renamed this from ExperiencedPlansWriter into ExecutedPlansWriter since we also have an ExperiencedPlansService that
61  // reconstructs experienced plans from events. kai, jun'16
62 
63  private static final Logger log = LogManager.getLogger( ExecutedPlansServiceImpl.class );
64 
65  public static final String EXECUTEDPLANSFILE = "executedPlans.xml.gz";
66 
68 
69  private Scenario scenario;
70 
72 
74 
75  @Inject
76  ExecutedPlansServiceImpl( Scenario scenario, MobsimDataProvider mobsimDataProvider, OutputDirectoryHierarchy controlerIO ) {
77  this.scenario = scenario;
78  this.mobsimDataProvider = mobsimDataProvider;
79  this.controlerIO = controlerIO;
80  }
81 
82  @Override
83  public void notifyAfterMobsim(AfterMobsimEvent event) {
84  Gbl.assertNotNull(scenario);
85  final Config config = scenario.getConfig();
86  Scenario experiencedScenario = ScenarioUtils.createScenario(config);
87  experiencedPopulation = experiencedScenario.getPopulation();
88 
89  for (Person person : scenario.getPopulation().getPersons().values()) {
90 
91  MobsimAgent agent = this.mobsimDataProvider.getAgent(person.getId());
92 
93  if (agent == null || !(agent instanceof PersonDriverAgentImpl)) experiencedPopulation.addPerson(person);
94  else {
95  Person experiencedPerson = experiencedPopulation.getFactory().createPerson(person.getId());
96 
97  // add experienced plan
98  final Plan plan = WithinDayAgentUtils.getModifiablePlan(agent);
99  experiencedPerson.addPlan(plan);
100  experiencedPerson.setSelectedPlan(plan);
101 
102  // copy attributes
103  PersonUtils.setAge(experiencedPerson, PersonUtils.getAge(person));
104  PersonUtils.setCarAvail(experiencedPerson, PersonUtils.getCarAvail(person));
105  PersonUtils.setEmployed(experiencedPerson, PersonUtils.isEmployed(person));
106  PersonUtils.setLicence(experiencedPerson, PersonUtils.getLicense(person));
107  PersonUtils.setSex(experiencedPerson, PersonUtils.getSex(person));
108 
109  experiencedPopulation.addPerson(experiencedPerson);
110  }
111  }
112 
113  // write this in every iteration in order to be consistent with previous design. I think this should be changed. kai, jun'16
114  // as a quick fix, writing this as often as the base plans file. kai, jun'23
115  if ( event.getIteration() % scenario.getConfig().controller().getWritePlansInterval() == 0 ){
116  String outputFile = controlerIO.getIterationFilename( event.getIteration(), EXECUTEDPLANSFILE );
117  writeExecutedPlans( outputFile );
118  }
119  }
120 
121  @Override
122  public void writeExecutedPlans(String outputFile) {
123  final Config config = scenario.getConfig();
124  final String inputCRS = config.plans().getInputCRS();
125  final String internalCRS = config.global().getCoordinateSystem();
126 
127  if ( inputCRS == null ) {
128  new PopulationWriter(experiencedPopulation, scenario.getNetwork()).write(outputFile);
129  }
130  else {
131  log.info( "re-projecting \"experienced\" population from "+internalCRS+" to "+inputCRS+" for export" );
132 
133  final CoordinateTransformation transformation =
135  internalCRS,
136  inputCRS );
137 
138  new PopulationWriter(transformation, experiencedPopulation, scenario.getNetwork()).write(outputFile);
139  }
140  }
141 
142  @Override
143  public Map<Id<Person>, Plan> getExecutedPlans() {
144  IdMap<Person, Plan> map = new IdMap<>(Person.class) ;
145  for ( Person pp : this.experiencedPopulation.getPersons().values() ) {
146  map.put( pp.getId(), pp.getSelectedPlan() ) ;
147  }
148  return map ;
149  }
150 }
final String getIterationFilename(final int iteration, final String filename)
static void setLicence(Person person, final String licence)
static String getCarAvail(Person person)
static CoordinateTransformation getCoordinateTransformation(final String fromSystem, final String toSystem)
final MobsimAgent getAgent(Id< Person > agentId)
Map< Id< Person >,? extends Person > getPersons()
static Boolean isEmployed(Person person)
static String getSex(Person person)
static void setAge(Person person, final Integer age)
final PlansConfigGroup plans()
Definition: Config.java:415
static void assertNotNull(Object obj)
Definition: Gbl.java:212
abstract void setSelectedPlan(T selectedPlan)
static void setCarAvail(Person person, final String carAvail)
V put(Id< T > key, V value)
Definition: IdMap.java:141
final ControllerConfigGroup controller()
Definition: Config.java:399
static Integer getAge(Person person)
static void setSex(Person person, final String sex)
final GlobalConfigGroup global()
Definition: Config.java:395
static Scenario createScenario(final Config config)
static String getLicense(Person person)
static void setEmployed(Person person, final Boolean employed)