MATSIM
PlansCalcRouteConfigGroup.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * PlansCalcRouteConfigGroup
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2009 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 package org.matsim.core.config.groups;
21 
22 import org.apache.logging.log4j.LogManager;
23 import org.apache.logging.log4j.Logger;
26 import org.matsim.core.config.Config;
32 
33 import java.util.*;
34 
43 public final class PlansCalcRouteConfigGroup extends ConfigGroup {
44  // yy There is a certain degree of messiness in this class because of retrofitting, e.g. making beelineDistance mode-specific while
45  // being backwards compatible. This could eventually be cleaned up, maybe about a year after introducing it. kai, jun'15
46 
47  public static final String GROUP_NAME = "planscalcroute";
48 
49  private static final String BEELINE_DISTANCE_FACTOR = "beelineDistanceFactor";
50  private static final String NETWORK_MODES = "networkModes";
51  private static final String TELEPORTED_MODE_SPEEDS = "teleportedModeSpeed_";
52  private static final String TELEPORTED_MODE_FREESPEED_FACTORS = "teleportedModeFreespeedFactor_";
53 
54 
55  public static final String UNDEFINED = "undefined";
56 
57  // For config file backward compatibility.
58  // These are just hardcoded versions of the options above.
59  private static final String PT_SPEED_FACTOR = "ptSpeedFactor";
60  private static final String PT_SPEED = "ptSpeed";
61  private static final String WALK_SPEED = "walkSpeed";
62  private static final String BIKE_SPEED = "bikeSpeed";
63  private static final String UNDEFINED_MODE_SPEED = "undefinedModeSpeed";
64 
65  private static final Logger log = LogManager.getLogger(PlansCalcRouteConfigGroup.class) ;
66 
67  private Collection<String> networkModes = Collections.singletonList( TransportMode.car );
68 
70 
71  private Double beelineDistanceFactor = 1.3 ;
72 
73  public enum AccessEgressType {
74  @Deprecated none,
75 
81 
86 
90  accessEgressModeToLinkPlusTimeConstant
91  }
92 
93  private static final String ACCESSEGRESSTYPE = "accessEgressType";
94  private static final String ACCESSEGRESSTYPE_CMT = "Defines how access and egress to main mode is simulated. Either of [none, accessEgressModeToLink, walkConstantTimeToLink, accessEgressModeToLinkPlusTimeConstant], Current default=none which means no access or egress trips are simulated.";
96 
97  // ---
98  private static final String RANDOMNESS = "routingRandomness" ;
99  private double routingRandomness = 3. ;
100  // ---
101  private static final String CLEAR_MODE_ROUTING_PARAMS = "clearDefaultTeleportedModeParams";
102  private static final String CLEAR_MODE_ROUTING_PARAMS_CMT = "Some typical teleportation routing params are set by default, such as for walk and bike. " +
103  "Setting this switch to \"true\" will clear them. Note that this will also clear " +
104  "settings for helper modes such as for " + TransportMode.non_network_walk;
105  private boolean clearingDefaultModeRoutingParams = false ;
106 
110  public final static class ModeRoutingParams extends TeleportedModeParams{
111  public ModeRoutingParams( String mode ){
112  super( mode );
113  }
114 
115  // repeating the setters so that they return the right type with chaining. kai, jan'23
116  @Override public ModeRoutingParams setMode( String mode ) {
117  super.setMode( mode );
118  return this;
119  }
121  super.setTeleportedModeSpeed( teleportedModeSpeed );
122  return this;
123  }
125  super.setTeleportedModeFreespeedLimit( teleportedModeFreespeedLimit );
126  return this;
127  }
129  super.setTeleportedModeFreespeedFactor( teleportedModeFreespeedFactor );
130  return this;
131  }
132  @Override public ModeRoutingParams setBeelineDistanceFactor( Double beelineDistanceFactor ) {
133  super.setBeelineDistanceFactor( beelineDistanceFactor );
134  return this;
135  }
136  }
137  public static class TeleportedModeParams extends ReflectiveConfigGroup implements MatsimParameters {
138  public static final String SET_TYPE = "teleportedModeParameters";
139  public static final String MODE = "mode";
140  public static final String TELEPORTED_MODE_FREESPEED_FACTOR = "teleportedModeFreespeedFactor";
141 
142  private String mode = null;
143 
144  // beeline teleportation:
145  private Double teleportedModeSpeed = null;
146  private Double beelineDistanceFactorForMode = null ;
147 
148  // route computed on network:
149  private Double teleportedModeFreespeedFactor = null;
150  private Double teleportedModeFreespeedLimit = Double.POSITIVE_INFINITY ;
151 
152  private static final String TELEPORTED_MODE_FREESPEED_FACTOR_CMT = "Free-speed factor for a teleported mode. " +
153  "Travel time = teleportedModeFreespeedFactor * <freespeed car travel time>. Insert a line like this for every such mode. " +
154  "Please do not set teleportedModeFreespeedFactor as well as teleportedModeSpeed for the same mode, but if you do, +" +
155  "teleportedModeFreespeedFactor wins over teleportedModeSpeed.";
156 
157  private static final String TELEPORTED_MODE_FREESPEED_LIMIT_CMT = "When using freespeed factor, a speed limit on the free speed. "
158  + "Link travel time will be $= factor * [ min( link_freespeed, freespeed_limit) ]" ;
159 
160  public TeleportedModeParams( final String mode ) {
161  super( SET_TYPE );
162  setMode( mode );
163  }
164 
166  super( SET_TYPE );
167  }
168 
169  @Override
170  public void checkConsistency(Config config) {
171  if ( mode == null ) throw new RuntimeException( "mode for parameter set "+this+" is null!" );
172 
173  if ( teleportedModeSpeed == null && teleportedModeFreespeedFactor == null ) {
174  throw new RuntimeException( "no teleported mode speed nor freespeed factor defined for mode "+mode );
175  }
176 
177  if ( teleportedModeSpeed != null && teleportedModeFreespeedFactor != null ) {
178  // this should not happen anyway as the setters forbid it
179  throw new RuntimeException( "both teleported mode speed or freespeed factor are set for mode "+mode );
180  }
181  }
182 
183  @Override
184  public Map<String, String> getComments() {
185  final Map<String, String> map = super.getComments();
186 
187  map.put( "teleportedModeSpeed" ,
188  "Speed for a teleported mode. " +
189  "Travel time = (<beeline distance> * beelineDistanceFactor) / teleportedModeSpeed. Insert a line like this for every such mode.");
190  map.put( TELEPORTED_MODE_FREESPEED_FACTOR, TELEPORTED_MODE_FREESPEED_FACTOR_CMT);
191 
192  return map;
193  }
194 
200  public final Double getTeleportedModeFreespeedLimit() {
201  return this.teleportedModeFreespeedLimit;
202  }
203 
209  public TeleportedModeParams setTeleportedModeFreespeedLimit( Double teleportedModeFreespeedLimit ) {
210  this.teleportedModeFreespeedLimit = teleportedModeFreespeedLimit;
211  return this;
212  }
213 
214  @StringGetter(MODE)
215  public String getMode() {
216  return mode;
217  }
218 
220  public TeleportedModeParams setMode( String mode ) {
221  testForLocked() ;
222  this.mode = mode;
223  return this ;
224  }
225 
226  @StringGetter( "teleportedModeSpeed" )
227  public Double getTeleportedModeSpeed() {
228  return teleportedModeSpeed;
229  }
230 
231  @StringSetter( "teleportedModeSpeed" )
233  testForLocked() ;
234  if ( getTeleportedModeFreespeedFactor() != null && teleportedModeSpeed != null ) {
235  throw new IllegalStateException( "cannot set both speed and freespeed factor for "+getMode() );
236  }
237  this.teleportedModeSpeed = teleportedModeSpeed;
238  return this;
239  }
240 
247  }
248 
255  testForLocked() ;
256  if ( getTeleportedModeSpeed() != null && teleportedModeFreespeedFactor != null ) {
257  throw new IllegalStateException( "cannot set both speed and freespeed factor for "+getMode() );
258  }
260  return this;
261  }
262 
263  @StringSetter("beelineDistanceFactor")
265  testForLocked() ;
266  this.beelineDistanceFactorForMode = val ;
267  return this ;
268  }
269  @StringGetter("beelineDistanceFactor")
270  public Double getBeelineDistanceFactor() {
271  return this.beelineDistanceFactorForMode ;
272  }
273 
274  }
275 
277  super(GROUP_NAME);
278 
280  {
282  bike.setTeleportedModeSpeed( 15.0 / 3.6 ); // 15.0 km/h --> m/s
283  addParameterSet( bike );
284  }
285 
286  {
288  walk.setTeleportedModeSpeed( 3.0 / 3.6 ); // 3.0 km/h --> m/s
289  addParameterSet( walk );
290  }
291 
292  // the following two are deliberately different from "walk" since "walk" may become a network routing mode, but these two
293  // will not. kai, dec'15
294  {
296  walk.setTeleportedModeSpeed( 3.0 / 3.6 ); // 3.0 km/h --> m/s
297  addParameterSet( walk );
298  }
299 // {
300 // final ModeRoutingParams walk = new ModeRoutingParams( TransportMode.egress_walk );
301 // walk.setTeleportedModeSpeed( 3.0 / 3.6 ); // 3.0 km/h --> m/s
302 // addParameterSet( walk );
303 // }
304 
305  // I'm not sure if anyone needs the "undefined" mode. In particular, it doesn't do anything for modes which are
306  // really unknown, it is just a mode called "undefined". michaz 02-2012
307  //
308  // The original design idea was that some upstream module would figure out expected travel times and travel distances
309  // for any modes, and the simulation would teleport all those modes it does not know anything about.
310  // With the travel times and travel distances given by the mode. In practice, it seems that people can live better
311  // with the concept that mobsim figures it out by itself. Although it is a much less flexible design. kai, jun'2012
312 // {
313 // final ModeRoutingParams undefined = new ModeRoutingParams( UNDEFINED );
314 // undefined.setTeleportedModeSpeed( 50. / 3.6 ); // 50.0 km/h --> m/s
315 // addParameterSet( undefined );
316 // }
317 
318  {
321  addParameterSet( ride );
322  }
323 
324  {
327  addParameterSet( pt );
328  }
329 
330  // {
331 // final ModeRoutingParams transit_walk = new ModeRoutingParams( TransportMode.transit_walk ) ;
332 // transit_walk.setTeleportedModeSpeed( 3.0 / 3.6 ); // 3.0 km/h --> m/s
333 // addParameterSet( transit_walk );
334 // }
335  // one might add the above but it was not added in the original design. Not sure about the reason. kai, feb'15
336 
337  this.acceptModeParamsWithoutClearing = false;
338  }
339 
340  @Override
341  public ConfigGroup createParameterSet( final String type ) {
342  switch ( type ) {
344  return new TeleportedModeParams();
345  default:
346  throw new IllegalArgumentException( type );
347  }
348  }
349 
350  @Override
351  protected void checkParameterSet( final ConfigGroup module ) {
352  switch ( module.getName() ) {
354  if ( !(module instanceof TeleportedModeParams) ) {
355  throw new RuntimeException( "unexpected class for module "+module );
356  }
357  break;
358  default:
359  throw new IllegalArgumentException( module.getName() );
360  }
361  }
365  public void setClearingDefaultModeRoutingParams( boolean val ) {
366  if ( val ) {
368  } else if ( clearingDefaultModeRoutingParams ) {
369  throw new RuntimeException( "you cannot set the clearing of the default mode routing (= teleportation mode) params to false after you have already cleared once." ) ;
370  }
371  }
373  this.clearModeRoutingParams();
374  }
378  public void clearModeRoutingParams( ) {
379  // This is essentially a config switch, except that it cannot be set back to false once it was set to true.
380 
381  // from now on, we will accept without clearing:
383 
384  // do the clearing:
386 
387  // memorize that we have cleared; this is what will be written into the output config (once we have one):
389  }
390 
391  @Override
392  public void addParameterSet(final ConfigGroup set) {
393  if ( set.getName().equals( TeleportedModeParams.SET_TYPE ) && !this.acceptModeParamsWithoutClearing ) {
396  log.warn( "The first mode routing (= teleported mode) params that are explicitly defined clear the default mode routing (= teleported mode) params. If you want to avoid this " );
397  log.warn( " warning, use clearTeleportedModeParams(true) in code, and \"" + CLEAR_MODE_ROUTING_PARAMS + "\"=true in xml config.");
398 
399 // "This functionality was removed for " );
400 // log.warn( " some weeks in the development head, after release 11.x, and before release 12.x; it is now back. " +
401 
402  // A bit more info:
403  //
404  // (1) I wanted to keep the default teleportation routers ... since for novice users I find it better if they all use the same teleportation
405  // speeds. kai, nov'19
406  //
407  // (2) The result of "add" and "remove" in code evidently depends on the sequence. In contrast, our "config" object
408  // is a state ... as one notices when we write it out, since there we cannot play back additions and removal. So if
409  // we add to and remove from the default entries, and write the final result to file, then re-reading these entries
410  // needs to trigger removal of the defaults since otherwise they will exist in addition. kai, nov'19
411  }
413  // for the time being pushing the "global" factor into the local ones if they are not initialized by
414  // themselves. Necessary for some tests; maybe we should eventually disable them. kai, feb'15
415  if ( pars.getBeelineDistanceFactor()== null ) {
417  }
418  super.addParameterSet( set );
419  }
420 
421  public void addTeleportedModeParams( final TeleportedModeParams pars ) {
422  testForLocked() ;
423  addParameterSet( pars );
424  }
428  public void addModeRoutingParams(final TeleportedModeParams pars ) {
429  this.addTeleportedModeParams( pars );
430  }
431  public void removeTeleportedModeParams( String key ){
432  this.removeModeRoutingParams( key );
433  }
437  public void removeModeRoutingParams( String key ) {
438  testForLocked() ;
440  final String mode = ((TeleportedModeParams) pars).getMode();
441  if ( key.equals(mode) ) {
442  this.removeParameterSet(pars) ;
443  break ;
444  }
445  }
446  if ( getParameterSets( TeleportedModeParams.SET_TYPE ).isEmpty() ) {
447  log.warn( "You have removed the last mode routing (= teleported mode) parameter with the removeModeRoutingParams method. If you wrote the resulting config to " ) ;
448  log.warn(" file, and read it back in, all default teleported modes would be resurrected. The code will therefore also call " );
449  log.warn( " \"clearTeleportedModeParams()\". It would be better if you did this yourself." ) ;
450  this.clearModeRoutingParams();
451  }
452  }
453  public Map<String, TeleportedModeParams> getTeleportedModeParams() {
454  return getModeRoutingParams();
455  }
459  public Map<String, TeleportedModeParams> getModeRoutingParams() {
460  final Map<String, TeleportedModeParams> map = new LinkedHashMap< >();
461 
463  if ( this.isLocked() ) {
464  pars.setLocked();
465  }
466  final String mode = ((TeleportedModeParams) pars).getMode();
467  final TeleportedModeParams old = map.put( mode , (TeleportedModeParams) pars );
468  if ( old != null ) throw new IllegalStateException( "several parameter sets for mode "+mode );
469  }
470 
471  return map;
472  }
473 
475  TeleportedModeParams pars = getModeRoutingParams().get( mode );
476 
477  if ( pars == null ) {
479  pars.setMode( mode );
480  addParameterSet( pars );
481  }
482  if ( this.isLocked() ) {
483  pars.setLocked();
484  }
485 
486  return pars;
487  }
488 
489  @Override
490  public String getValue(final String key) {
491  throw new IllegalArgumentException(key + ": getValue access disabled; use direct getter");
492  }
493 
494  @Override
495  public void addParam(final String key, final String value) {
496  if( value.equals( "null" ) ) return; // old behavior of reader: keep defaults if null
497  if (PT_SPEED_FACTOR.equals(key)) {
498  setTeleportedModeFreespeedFactor(TransportMode.pt, Double.parseDouble(value));
499  } else if (BEELINE_DISTANCE_FACTOR.equals(key)) {
500  setBeelineDistanceFactor(Double.parseDouble(value));
501  } else if (PT_SPEED.equals(key)) {
502  setTeleportedModeSpeed(TransportMode.pt, Double.parseDouble(value));
503  } else if (WALK_SPEED.equals(key)) {
504  setTeleportedModeSpeed(TransportMode.walk, Double.parseDouble(value));
505  } else if (BIKE_SPEED.equals(key)) {
506  setTeleportedModeSpeed(TransportMode.bike, Double.parseDouble(value));
507  } else if (UNDEFINED_MODE_SPEED.equals(key)) {
508  setTeleportedModeSpeed(UNDEFINED, Double.parseDouble(value));
509  } else if (NETWORK_MODES.equals(key)) {
510  setNetworkModes(Arrays.asList(CollectionUtils.stringToArray(value)));
511  } else if (key.startsWith(TELEPORTED_MODE_SPEEDS)) {
512  setTeleportedModeSpeed(key.substring(TELEPORTED_MODE_SPEEDS.length()), Double.parseDouble(value));
513  } else if (key.startsWith(TELEPORTED_MODE_FREESPEED_FACTORS)){
514  setTeleportedModeFreespeedFactor( key.substring( TELEPORTED_MODE_FREESPEED_FACTORS.length() ), Double.parseDouble( value ) );
515  } else if ( CLEAR_MODE_ROUTING_PARAMS.equals( key ) ){
516  this.setClearingDefaultModeRoutingParams( Boolean.parseBoolean( value ) );
517  } else if (RANDOMNESS.equals( key ) ) {
518  this.setRoutingRandomness( Double.parseDouble( value ) );
519  }
520  else if (ACCESSEGRESSTYPE.equals( key ) ) {
521  this.setAccessEgressType(AccessEgressType.valueOf(value));
522  }
523  else {
524  throw new IllegalArgumentException(key);
525  }
526  }
527 
528  @Override
529  public final Map<String, String> getParams() {
530  Map<String, String> map = super.getParams();
531  map.put( NETWORK_MODES, CollectionUtils.arrayToString(this.networkModes.toArray( new String[0] ) ) );
532  map.put( CLEAR_MODE_ROUTING_PARAMS, Boolean.toString( this.clearingDefaultModeRoutingParams ) ) ;
533  map.put( RANDOMNESS, Double.toString( this.routingRandomness ) ) ;
535  return map;
536  }
537 
538  @Override
539  public final Map<String, String> getComments() {
540  Map<String,String> map = super.getComments();
541 
542  map.put(BEELINE_DISTANCE_FACTOR, "factor with which beeline distances (and therefore times) " +
543  "are multiplied in order to obtain an estimate of the network distances/times. Default is something like 1.3") ;
544  map.put(NETWORK_MODES, "All the modes for which the router is supposed to generate network routes (like car)") ;
545  map.put(RANDOMNESS, "strength of the randomness for the utility of money in routing under toll. "
546  + "Leads to Pareto-optimal route with randomly drawn money-vs-other-attributes tradeoff. "
547  + "Technically the width parameter of a log-normal distribution. 3.0 seems to be a good value. " ) ;
550  return map;
551  }
552 
553  public Collection<String> getNetworkModes() {
554  return this.networkModes;
555  }
556 
557  public void setNetworkModes(Collection<String> networkModes) {
558  this.networkModes = networkModes;
559  }
560 
561  public Map<String, Double> getTeleportedModeSpeeds() {
562  final Map<String, Double> map = new LinkedHashMap< >();
563  for ( TeleportedModeParams pars : getModeRoutingParams().values() ) {
564  if ( this.isLocked() ) {
565  pars.setLocked();
566  }
567 
568  final Double speed = pars.getTeleportedModeSpeed();
569  if ( speed != null ) map.put( pars.getMode() , speed );
570  }
571  return map;
572  }
573 
574  public Map<String, Double> getTeleportedModeFreespeedFactors() {
575  final Map<String, Double> map = new LinkedHashMap< >();
576  for ( TeleportedModeParams pars : getModeRoutingParams().values() ) {
577  if ( this.isLocked() ) {
578  pars.setLocked();
579  }
580 
581  final Double speed = pars.getTeleportedModeFreespeedFactor();
582  if ( speed != null ) map.put( pars.getMode() , speed );
583  }
584  return map;
585  }
586 
587  public Map<String,Double> getBeelineDistanceFactors() {
588  final Map<String,Double> map = new LinkedHashMap<>() ;
589  for ( TeleportedModeParams pars : getModeRoutingParams().values() ) {
590  if ( this.isLocked() ) {
591  pars.setLocked();
592  }
593 
594  final Double val = pars.getBeelineDistanceFactor() ;
595  if ( val != null ) map.put( pars.getMode() , val ) ;
596  }
597  return map ;
598  }
599 
600  @Deprecated // rather use addModeRoutingParams(...), since that allows further params (e.g. beeline distance factor). kai, nov'19
601  public void setTeleportedModeFreespeedFactor(String mode, double freespeedFactor) {
602  testForLocked() ;
603  // re-create, to trigger erasing of defaults (see acceptModeParamsWithoutClearing)
604  final TeleportedModeParams pars = new TeleportedModeParams( mode );
605  pars.setTeleportedModeFreespeedFactor( freespeedFactor );
606  addParameterSet( pars );
607  }
608 
609  @Deprecated // rather use addModeRoutingParams(...), since that allows further params (e.g. beeline distance factor). kai, nov'19
610  public void setTeleportedModeSpeed(String mode, double speed) {
611  testForLocked() ;
612  // re-create, to trigger erasing of defaults (see acceptModeParamsWithoutClearing)
613  final TeleportedModeParams pars = new TeleportedModeParams( mode );
614  pars.setTeleportedModeSpeed( speed );
615  addParameterSet( pars );
616  }
617 
618  @Deprecated // use mode-specific beeline distance factors! kai, apr'15
619  public void setBeelineDistanceFactor(double val) {
620  testForLocked() ;
621  // yyyy thinking about this: this should in design maybe not be different from the other teleportation factors (reset everything
622  // if one is set; or possibly disallow setting it at all). kai, feb'15
623 
624  // memorize the global factor for ModeRoutingParams that are added later:
625  this.beelineDistanceFactor = val ;
626 
627  // push the global factor to the local ones for all ModeRoutingParams that are already there:
628  for ( TeleportedModeParams params : this.getModeRoutingParams().values() ) {
629  params.setBeelineDistanceFactor( val );
630  }
631  }
632 
633 
636  return this.accessEgressType;
637  }
638 
642  }
643 
645  public double getRoutingRandomness() {
646  return routingRandomness;
647  }
651  }
652 
653  @Override protected void checkConsistency(Config config) {
654  super.checkConsistency(config);
655  Set<String> modesRoutedAsTeleportation = this.getModeRoutingParams().keySet();
656  Collection<String> modesRoutedAsNetworkModes = this.getNetworkModes();
657 
658  for( String mode : modesRoutedAsTeleportation ){
659  if ( modesRoutedAsNetworkModes.contains( mode ) ) {
660  throw new RuntimeException( "mode \"" + mode + "\" is defined both as teleportation (mode routing param) and for network routing. You need to remove " +
661  "one or the other.") ;
662  }
663  }
664 
665  }
666 
667  public void printModeRoutingParams(){
668  for( Map.Entry<String, TeleportedModeParams> entry : this.getModeRoutingParams().entrySet() ){
669  log.warn( "key=" + entry.getKey() + "; value=" + entry.getValue() );
670  }
671  }
672 
673 }
ConfigGroup createParameterSet(final String type)
void addParameterSet(final ConfigGroup set)
ModeRoutingParams setTeleportedModeFreespeedLimit(Double teleportedModeFreespeedLimit)
static String [] stringToArray(final String values)
final Collection<? extends ConfigGroup > clearParameterSetsForType(final String type)
TeleportedModeParams getOrCreateModeRoutingParams(final String mode)
ModeRoutingParams setTeleportedModeFreespeedFactor(Double teleportedModeFreespeedFactor)
final Map< String, ? extends Collection<? extends ConfigGroup > > getParameterSets()
TeleportedModeParams setTeleportedModeFreespeedFactor(Double teleportedModeFreespeedFactor)
final TreeMap< String, String > params
boolean removeParameterSet(final ConfigGroup set)
static String arrayToString(final String[] values)
void setTeleportedModeFreespeedFactor(String mode, double freespeedFactor)
TeleportedModeParams setTeleportedModeFreespeedLimit(Double teleportedModeFreespeedLimit)