MATSIM
Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
org.matsim.facilities.FacilitiesFromPopulation Class Reference

Public Member Functions

 FacilitiesFromPopulation (final ActivityFacilities facilities)
 
 FacilitiesFromPopulation (Scenario scenario)
 
void setFacilitiesSource (final FacilitiesSource facilitiesSource)
 
void setOneFacilityPerLink (final boolean oneFacilityPerLink)
 
void setIdPrefix (final String prefix)
 
void setAssignLinksToFacilitiesIfMissing (final Network network)
 
void setRemoveLinksAndCoordinates (final boolean doRemoval)
 
void assignOpeningTimes (final ScoringConfigGroup calcScoreConfigGroup)
 
void run (final Population population)
 
void setAddEmptyActivityOptions (boolean addEmptyActivityOptions)
 

Private Member Functions

void handleActivities (final Population population)
 
void assignOpeningTimes ()
 

Private Attributes

final ActivityFacilities facilities
 
Scenario scenario
 
FacilitiesSource facilitiesSource
 
String idPrefix = ""
 
Network network = null
 
boolean removeLinksAndCoordinates = true
 
ScoringConfigGroup scoringConfigGroup = null
 
boolean addEmptyActivityOptions = false
 

Static Private Attributes

static final Logger log = LogManager.getLogger(FacilitiesFromPopulation.class)
 

Detailed Description

Generates ActivityFacilitys from the Activities in a population and assigns the activity facilities as the activity locations in the population while removing the old locations (coord and link) from the population. If an activity already has an ActivityFacility assigned, the ActivityFacility is overwritten. If an activity only has a coordinate, different behavior is possible, see setAssignLinksToFacilitiesIfMissing(Network).

Author
mrieser

Definition at line 60 of file FacilitiesFromPopulation.java.

Constructor & Destructor Documentation

◆ FacilitiesFromPopulation() [1/2]

org.matsim.facilities.FacilitiesFromPopulation.FacilitiesFromPopulation ( final ActivityFacilities  facilities)

Definition at line 73 of file FacilitiesFromPopulation.java.

References org.matsim.facilities.FacilitiesFromPopulation.facilities.

73  {
74  // minimalistic constructor, to configure via external setters
75  this.facilities = facilities;
76  }

◆ FacilitiesFromPopulation() [2/2]

org.matsim.facilities.FacilitiesFromPopulation.FacilitiesFromPopulation ( Scenario  scenario)

Definition at line 78 of file FacilitiesFromPopulation.java.

References org.matsim.core.config.Config.facilities(), org.matsim.api.core.v01.Scenario.getActivityFacilities(), org.matsim.api.core.v01.Scenario.getConfig(), org.matsim.core.config.groups.FacilitiesConfigGroup.getFacilitiesSource(), org.matsim.core.config.groups.FacilitiesConfigGroup.getIdPrefix(), org.matsim.api.core.v01.Scenario.getNetwork(), org.matsim.facilities.FacilitiesFromPopulation.scenario, and org.matsim.core.config.Config.scoring().

78  {
79  // "fat" constructor, to configure via config etc.
81  FacilitiesConfigGroup facilityConfigGroup = scenario.getConfig().facilities();
82  this.idPrefix = facilityConfigGroup.getIdPrefix();
83 // this.removeLinksAndCoordinates = facilityConfigGroup.isRemovingLinksAndCoordinates();
84  this.removeLinksAndCoordinates = false ;
85 // this.addEmptyActivityOptions = facilityConfigGroup.isAddEmptyActivityOption();
86  this.addEmptyActivityOptions = true ;
87  this.facilitiesSource = facilityConfigGroup.getFacilitiesSource();
88  this.network = scenario.getNetwork() ;
90  this.scenario = scenario;
91  }
final ScoringConfigGroup scoring()
Definition: Config.java:407
final FacilitiesConfigGroup facilities()
Definition: Config.java:423
ActivityFacilities getActivityFacilities()
Here is the call graph for this function:

Member Function Documentation

◆ setFacilitiesSource()

void org.matsim.facilities.FacilitiesFromPopulation.setFacilitiesSource ( final FacilitiesSource  facilitiesSource)

◆ setOneFacilityPerLink()

void org.matsim.facilities.FacilitiesFromPopulation.setOneFacilityPerLink ( final boolean  oneFacilityPerLink)

Sets whether all activities on a link should be collected within one ActivityFacility. Default is true. If set to false, for each coordinate found in the population's activities a separate ActivityFacility will be created.

Parameters
oneFacilityPerLink
Deprecated:
– better use setFacilitiesSource(FacilitiesSource)

Definition at line 104 of file FacilitiesFromPopulation.java.

References org.matsim.core.config.groups.FacilitiesConfigGroup.FacilitiesSource.onePerActivityLinkInPlansFile, and org.matsim.core.config.groups.FacilitiesConfigGroup.FacilitiesSource.onePerActivityLocationInPlansFile.

◆ setIdPrefix()

void org.matsim.facilities.FacilitiesFromPopulation.setIdPrefix ( final String  prefix)

Definition at line 112 of file FacilitiesFromPopulation.java.

112  {
113  this.idPrefix = prefix;
114  }

◆ setAssignLinksToFacilitiesIfMissing()

void org.matsim.facilities.FacilitiesFromPopulation.setAssignLinksToFacilitiesIfMissing ( final Network  network)

In the case that a facility has no link assigned, the ActivityFacility can be assigned to the closest link. If there should be only one ActivityFacility per link (see setOneFacilityPerLink(boolean)), and if no link-assignment should be done, then a new ActivityFacility will be created at that coordinate and the facility will not be assigned to a link, essentially breaking the contract of setOneFacilityPerLink(boolean).

Parameters
network

Definition at line 125 of file FacilitiesFromPopulation.java.

References org.matsim.core.gbl.Gbl.assertNotNull(), and org.matsim.facilities.FacilitiesFromPopulation.network.

125  {
126  Gbl.assertNotNull( network );
127  this.network = network ;
128  }
Here is the call graph for this function:

◆ setRemoveLinksAndCoordinates()

void org.matsim.facilities.FacilitiesFromPopulation.setRemoveLinksAndCoordinates ( final boolean  doRemoval)

If set to true (which is the default), the link and coordinate attributes are nulled in the activities, as this information is now available via the facility.

Parameters
doRemoval

Definition at line 136 of file FacilitiesFromPopulation.java.

136  {
137  this.removeLinksAndCoordinates = doRemoval;
138  }

◆ assignOpeningTimes() [1/2]

void org.matsim.facilities.FacilitiesFromPopulation.assignOpeningTimes ( final ScoringConfigGroup  calcScoreConfigGroup)

Definition at line 140 of file FacilitiesFromPopulation.java.

References org.matsim.core.gbl.Gbl.assertNotNull().

140  {
141  Gbl.assertNotNull( calcScoreConfigGroup );
142  this.scoringConfigGroup = calcScoreConfigGroup ;
143  }
Here is the call graph for this function:

◆ run()

void org.matsim.facilities.FacilitiesFromPopulation.run ( final Population  population)

Definition at line 145 of file FacilitiesFromPopulation.java.

References org.matsim.facilities.FacilitiesFromPopulation.assignOpeningTimes(), and org.matsim.facilities.FacilitiesFromPopulation.handleActivities().

Referenced by org.matsim.core.controler.PrepareForSimImpl.run().

145  {
146  handleActivities(population);
147  if (this.scoringConfigGroup != null ) {
148  if (this.addEmptyActivityOptions) {
149  this.assignOpeningTimes();
150  } else{
151  log.error("Cannot assign opening times to activity facilities because switch to add empty activity option to activity facilities is set to false.");
152  }
153  }
154  }
Here is the call graph for this function:

◆ handleActivities()

void org.matsim.facilities.FacilitiesFromPopulation.handleActivities ( final Population  population)
private

Definition at line 156 of file FacilitiesFromPopulation.java.

References org.matsim.facilities.ActivityFacilities.addActivityFacility(), org.matsim.core.gbl.Gbl.assertIf(), org.matsim.core.gbl.Gbl.assertNotNull(), org.matsim.api.core.v01.Id< T >.create(), org.matsim.facilities.ActivityFacilitiesFactory.createActivityFacility(), org.matsim.core.population.PopulationUtils.decideOnCoordForActivity(), org.matsim.api.core.v01.IdMap< T, V >.get(), org.matsim.api.core.v01.BasicLocation.getCoord(), org.matsim.api.core.v01.population.Activity.getCoord(), org.matsim.facilities.ActivityFacilities.getFacilities(), org.matsim.facilities.ActivityFacilities.getFactory(), org.matsim.api.core.v01.Identifiable< T >.getId(), org.matsim.facilities.Facility.getLinkId(), org.matsim.api.core.v01.population.Activity.getLinkId(), org.matsim.core.network.NetworkUtils.getNearestLinkExactly(), org.matsim.api.core.v01.population.Population.getPersons(), org.matsim.core.config.groups.FacilitiesConfigGroup.FacilitiesSource.onePerActivityLinkInPlansFile, org.matsim.core.config.groups.FacilitiesConfigGroup.FacilitiesSource.onePerActivityLinkInPlansFileExceptWhenCoordinatesAreGiven, and org.matsim.api.core.v01.IdMap< T, V >.put().

Referenced by org.matsim.facilities.FacilitiesFromPopulation.run().

156  {
157  Gbl.assertNotNull( network ) ;
158 
159  int idxCounter = 0;
160  ActivityFacilitiesFactory factory = this.facilities.getFactory();
161  IdMap<Link, ActivityFacility> facilitiesPerLinkId = new IdMap<>(Link.class);
162  Map<Coord, ActivityFacility> facilitiesPerCoordinate = new HashMap<>();
163 
164  for (Person person : population.getPersons().values()) {
165  for (Plan plan : person.getPlans()) {
166  for (PlanElement pe : plan.getPlanElements()) {
167  if (pe instanceof Activity) {
168  Activity activity = (Activity) pe;
169 
170  Coord coord = activity.getCoord();
171  // (may be null, and we are not fixing it at this point)
172 
173  Id<Link> linkId = activity.getLinkId();
174  // (may be null, and we are not fixing it at this point)
175 
176  Gbl.assertIf( coord!=null || linkId!=null );
177  // (need one of them non-null!)
178 
179  ActivityFacility facility ;
180 
181  if ( linkId == null ) {
182  linkId = NetworkUtils.getNearestLinkExactly(this.network, coord).getId();
183  // yyyy we have been using the non-exact version in other parts of the project. kai, mar'19
184  }
185  if ( coord==null ) {
186  coord = PopulationUtils.decideOnCoordForActivity( activity, scenario );
187  }
188 
189  Gbl.assertNotNull( linkId );
190 
191  if ( this.facilitiesSource==FacilitiesSource.onePerActivityLinkInPlansFile
192  || ( this.facilitiesSource==FacilitiesSource.onePerActivityLinkInPlansFileExceptWhenCoordinatesAreGiven && coord==null )
193  ) {
194  facility = facilitiesPerLinkId.get(linkId);
195  if (facility == null) {
196  final Id<ActivityFacility> facilityId = Id.create( this.idPrefix + linkId.toString() , ActivityFacility.class );
197  final ActivityFacility preExistingFacilityIfAny = this.facilities.getFacilities().get( facilityId );
198  if ( preExistingFacilityIfAny == null ){
199  facility = factory.createActivityFacility( facilityId , coord , linkId );
200  facilitiesPerLinkId.put( linkId , facility );
201  this.facilities.addActivityFacility( facility );
202  } else {
203  if ( Objects.equals( preExistingFacilityIfAny.getLinkId() ,
204  linkId ) && Objects.equals( preExistingFacilityIfAny.getCoord() , coord ) ) {
205  // do nothing; presumably, same auto-generation has been run before
206  facility = preExistingFacilityIfAny;
207  } else {
208  throw new RuntimeException( "Facility with id=" + facilityId + " but different in coordinates and/or linkId already exists." ) ;
209  }
210  }
211  // above code is a duplicate, but they are difficult to merge because facilitiesPerLinkId is an IdMap while facilitiesPerCoord is a normal Map. kai, feb'20
212  }
213  } else if ( this.facilitiesSource==FacilitiesSource.onePerActivityLocationInPlansFile
214  || ( this.facilitiesSource==FacilitiesSource.onePerActivityLinkInPlansFileExceptWhenCoordinatesAreGiven && coord!=null )
215  ) {
216  if (coord == null) {
217  throw new RuntimeException("Coordinate for the activity "+activity+" is null, cannot collect facilities per coordinate. " +
218  "Possibly use " + FacilitiesSource.onePerActivityLinkInPlansFile + " " +
219  "instead and collect facilities per link.");
220  }
221 
222  facility = facilitiesPerCoordinate.get(coord);
223  if (facility == null) {
224  final Id<ActivityFacility> facilityId = Id.create( this.idPrefix + idxCounter++ , ActivityFacility.class );
225  final ActivityFacility preExistingFacilityIfAny = this.facilities.getFacilities().get( facilityId );
226  if ( preExistingFacilityIfAny == null ){
227  facility = factory.createActivityFacility( facilityId , coord , linkId );
228  facilitiesPerCoordinate.put( coord , facility );
229  this.facilities.addActivityFacility( facility );
230  } else {
231  if ( Objects.equals( preExistingFacilityIfAny.getLinkId() , linkId ) && Objects.equals( preExistingFacilityIfAny.getCoord() , coord ) ) {
232  // do nothing; presumably, same auto-generation has been run before
233  facility = preExistingFacilityIfAny;
234  } else {
235  throw new RuntimeException( "Facility with id=" + facilityId + " but different in coordinates and/or linkId already exists." ) ;
236  }
237  }
238  // above code is a duplicate, but they are difficult to merge because facilitiesPerLinkId is an IdMap while facilitiesPerCoord is a normal Map. kai, feb'20
239  }
240  } else {
241  throw new RuntimeException( "should never get to this location; either class/method used with invalid" +
242  " setting of facilitiesSource, or something there is " +
243  "something that was not understood while implementing " +
244  "this." );
245  }
246 
247  if (this.addEmptyActivityOptions) {
248  String actType = activity.getType();
249  ActivityOption option = facility.getActivityOptions().get(actType);
250  if (option == null) {
251  option = factory.createActivityOption(actType);
252  facility.addActivityOption(option);
253  }
254  }
255 
256  activity.setFacilityId(facility.getId());
257  if (this.removeLinksAndCoordinates) {
258  activity.setLinkId(null);
259  activity.setCoord(null);
260  }
261  }
262  }
263  }
264  }
265  }
Map< Id< ActivityFacility >, ? extends ActivityFacility > getFacilities()
void addActivityFacility(ActivityFacility facility)
ActivityFacilitiesFactory getFactory()
Here is the call graph for this function:

◆ assignOpeningTimes() [2/2]

void org.matsim.facilities.FacilitiesFromPopulation.assignOpeningTimes ( )
private

Definition at line 267 of file FacilitiesFromPopulation.java.

References org.matsim.facilities.OpeningTimeImpl.createFromOptionalTimes(), org.matsim.core.config.groups.ScoringConfigGroup.getActivityParams(), org.matsim.core.config.groups.ScoringConfigGroup.ActivityParams.getClosingTime(), org.matsim.facilities.ActivityFacilities.getFacilities(), and org.matsim.core.config.groups.ScoringConfigGroup.ActivityParams.getOpeningTime().

Referenced by org.matsim.facilities.FacilitiesFromPopulation.run().

267  {
268  Set<String> missingActTypes = new HashSet<>();
269  for (ActivityFacility af : this.facilities.getFacilities().values()) {
270  for (ActivityOption ao : af.getActivityOptions().values()) {
271  String actType = ao.getType();
272  ActivityParams params = this.scoringConfigGroup.getActivityParams(actType);
273  if (params == null) {
274  if (missingActTypes.add(actType)) {
275  log.error("No information for activity type " + actType + " found in given configuration.");
276  }
277  } else {
278  ao.addOpeningTime(OpeningTimeImpl.createFromOptionalTimes(params.getOpeningTime(),
279  params.getClosingTime()));
280  }
281  }
282  }
283  }
Map< Id< ActivityFacility >, ? extends ActivityFacility > getFacilities()
Here is the call graph for this function:

◆ setAddEmptyActivityOptions()

void org.matsim.facilities.FacilitiesFromPopulation.setAddEmptyActivityOptions ( boolean  addEmptyActivityOptions)

Member Data Documentation

◆ log

final Logger org.matsim.facilities.FacilitiesFromPopulation.log = LogManager.getLogger(FacilitiesFromPopulation.class)
staticprivate

Definition at line 62 of file FacilitiesFromPopulation.java.

◆ facilities

final ActivityFacilities org.matsim.facilities.FacilitiesFromPopulation.facilities
private

◆ scenario

Scenario org.matsim.facilities.FacilitiesFromPopulation.scenario
private

◆ facilitiesSource

FacilitiesSource org.matsim.facilities.FacilitiesFromPopulation.facilitiesSource
private

◆ idPrefix

String org.matsim.facilities.FacilitiesFromPopulation.idPrefix = ""
private

Definition at line 67 of file FacilitiesFromPopulation.java.

◆ network

Network org.matsim.facilities.FacilitiesFromPopulation.network = null
private

◆ removeLinksAndCoordinates

boolean org.matsim.facilities.FacilitiesFromPopulation.removeLinksAndCoordinates = true
private

Definition at line 69 of file FacilitiesFromPopulation.java.

◆ scoringConfigGroup

ScoringConfigGroup org.matsim.facilities.FacilitiesFromPopulation.scoringConfigGroup = null
private

Definition at line 70 of file FacilitiesFromPopulation.java.

◆ addEmptyActivityOptions

boolean org.matsim.facilities.FacilitiesFromPopulation.addEmptyActivityOptions = false
private

The documentation for this class was generated from the following file: