Skip to content

Commit 08ae728

Browse files
committed
networkDesign: replace SimulationAlgorithmDescriptor with UserDefinedConfigSchema
completes #1580 Remove the previous `SimulationAlgorithmDescriptor` interface, to be replaced with the new `UserDefinedConfigSchema`. Rename the classes' methods to match the new interface (`getOptions` becomes `getFields`, `validateOptions` becomes `validateFields`). Update a few translation strings to use the new `networkDesign:` namespace instead of `simulation`.
1 parent f1e0476 commit 08ae728

19 files changed

Lines changed: 325 additions & 424 deletions

File tree

locales/en/transit.json

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,62 @@
847847
"ErrorExportingGtfs": "An error occurred while generating the GTFS file."
848848
}
849849
},
850+
"networkDesign": {
851+
"evolutionaryAlgorithm": {
852+
"LineAndNumberOfVehiclesGASimulation": "Genetic algorithm with lines and number of vehicles",
853+
"PopulationSizeMin": "Minimum population size",
854+
"PopulationSizeMax": "Maximum population size",
855+
"NumberOfElites": "Number of elites per generation",
856+
"NumberOfRandoms": "Number of random per generation",
857+
"CrossoverNumberOfCuts": "Number of cuts in crossover",
858+
"CrossoverProbability": "Probability of crossover",
859+
"MutationProbability": "Probability of mutation",
860+
"TournamentSize": "Tournament selection size",
861+
"TournamentProbability": "Tournament probability",
862+
"NumberOfGenerations": "Number of generations",
863+
"ShuffleGenes": "Shuffle genes before reproduction",
864+
"KeepGenerations": "Number of generations to keep",
865+
"KeepCandidates": "Number of candidates to keep in generations",
866+
"PopulationSizeMinInvalid": "Minimum population size must be greater than 0",
867+
"PopulationSizeMaxInvalid": "Maximum population size must be greater than 0",
868+
"NumberOfElitesInvalid": "Number of elites per generation must be greater than 0",
869+
"NumberOfRandomsInvalid": "Number of random per generation must be greater or equal to 0",
870+
"CrossoverNumberOfCutsInvalid": "Number of cuts in crossover must be greater than 0",
871+
"CrossoverProbabilityInvalid": "Probability of crossover must be between 0 and 1",
872+
"MutationProbabilityInvalid": "Probability of mutation must be between 0 and 1",
873+
"TournamentSizeInvalid": "Tournament selection size must be greater than 0",
874+
"TournamentProbabilityInvalid": "Tournament probability must be between 0 and 1",
875+
"NumberOfGenerationsInvalid": "Number of generations must be greater than 0",
876+
"KeepGenerationsInvalid": "Number of generations to keep must be greater than 0",
877+
"KeepCandidatesInvalid": "Number of candidates to keep in generations must be greater than 0",
878+
"help": {
879+
"PopulationSizeMin": "Minimum number of candidates in each generation",
880+
"PopulationSizeMax": "Maximum number of candidates in each generation",
881+
"NumberOfElites": "Number of best candidates to copy directly to the next generation",
882+
"NumberOfRandoms": "Number of entirely random new candidates to add in each generation",
883+
"CrossoverNumberOfCuts": "Number of points where parent genes are cut to create offspring",
884+
"CrossoverProbability": "Probability that a pair of parents undergoes crossover to create offspring",
885+
"MutationProbability": "Probability that a gene undergoes mutation, i.e. is randomly modified. For this algorithm, a probability of 8% (0.08) is suggested.",
886+
"TournamentSize": "Number of candidates among the best of the generation that will compete for reproduction after each generation.",
887+
"TournamentProbability": "The initial probability that there will be a tournament for parent selection rather than selecting the best. This probability should not be too high, otherwise only the best will reproduce.",
888+
"ShuffleGenes": "Shuffling genes avoids proximity effects in the chromosome, where 2 lines positioned side by side will always have the same values. This helps diversify the population.",
889+
"KeepGenerations": "Number of last generations to keep for analysis after algorithm execution",
890+
"KeepCandidates": "Number of best candidates to keep for each of the generations to keep"
891+
},
892+
"errors": {
893+
"PopulationSizeMinGreaterThanMax": "Minimum population size is greater than maximum",
894+
"CandidatesToKeepGreaterThanPopulation": "Number of candidates to keep is greater than population",
895+
"GenerationsToKeepGreaterThanGenerations": "Number of generations to keep is greater than number of generations"
896+
}
897+
},
898+
"simulationMethods": {
899+
"accessibilityMap": {
900+
"Title": "Using accessibility maps",
901+
"AccessMapDataSources": "Data sources for places",
902+
"AccessMapMaxSampleRatio": "Maximum sample ratio to test (between 0 and 1)"
903+
}
904+
}
905+
},
850906
"simulation": {
851907
"Simulation": "Simulation",
852908
"Simulations": "Simulations",
@@ -859,25 +915,11 @@
859915
"NumberOfThreads": "Number of threads",
860916
"NumberOfLinesMin": "Minimum number of lines",
861917
"NumberOfLinesMax": "Maximum number of lines",
862-
"PopulationSizeMin": "Minimum population size",
863-
"PopulationSizeMax": "Maximum population size",
864-
"VehiclesCount": "Number of vehicles (fleet size)",
865918
"MaxIntervalMinutes": "Maximum period (minutes)",
866919
"MaxIntervalMinutesHelp": "The maximum time between departures for a line. For optimal service, it is suggested to keep it lower than 15 minutes. But times up to 60 minutes are accepted.",
867920
"MinIntervalMinutes": "Minimum period (minutes)",
868921
"MinIntervalMinutesHelp": "The minimum time between departures for a line. The minimum value should be higher than 3, less than that will have no effect on the calculations.",
869-
"NumberOfElites": "Number of elites per generation",
870-
"NumberOfRandoms": "Number of random per generation",
871-
"CrossoverNumberOfCuts": "Number of cuts in crossover",
872-
"CrossoverProbability": "Probability of crossover",
873-
"MutationProbability": "Probability of mutation",
874-
"TournamentSize": "Tournament selection size",
875-
"TournamentProbability": "Tournament probability",
876-
"ShuffleGenes": "Shuffle genes before reproduction",
877-
"KeepGenerations": "Number of generations to keep",
878-
"KeepCandidates": "Number of candidates to keep in generations",
879922
"OdTripsSampleRatio": "Percentage of OD trips to include",
880-
"NumberOfGenerations": "Number of generations",
881923
"Color": "Color",
882924
"Edit": "Simulation",
883925
"Delete": "Delete simulation",
@@ -905,9 +947,6 @@
905947
"Results": "Results",
906948
"Parameters": "Parameters",
907949
"RuntimeOptions": "Runtime Configuration",
908-
"simulationClasses": {
909-
"LineAndNumberOfVehiclesGASimulation": "Genetic algorithm with lines and number of vehicles"
910-
},
911950
"simulationMethods": {
912951
"SelectSimulationFunctions": "Select functions to use for simulation",
913952
"OdTrips": "OD trips",
@@ -966,10 +1005,7 @@
9661005
"MinTimeHigherThanMax": "The minimum time between passages is greater than maximum",
9671006
"MinTimeBetweenPassagesTooHigh": "The minimum time between passages is too high",
9681007
"UnknownAlgorithm": "The selected algorithm is unavailable",
969-
"SimulatedAgenciesIsEmpty": "At least one agency to simulate must be selected",
970-
"PopulationSizeMinGreaterThanMax": "Minimum population size is greater than maximum",
971-
"CandidatesToKeepGreaterThanPopulation": "Number of candidates to keep is greater than population",
972-
"GenerationsToKeepGreaterThanGenerations": "Number of generations to keep is greater than number of generations"
1008+
"SimulatedAgenciesIsEmpty": "At least one agency to simulate must be selected"
9731009
}
9741010
},
9751011
"jobs": {

locales/fr/transit.json

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,62 @@
847847
"ErrorExportingGtfs": "Une erreur s'est produite lors de la génération de l'archive GTFS."
848848
}
849849
},
850+
"networkDesign": {
851+
"evolutionaryAlgorithm": {
852+
"LineAndNumberOfVehiclesGASimulation": "Algorithme génétique avec lignes et nombre de véhicules",
853+
"PopulationSizeMin": "Taille minimale de la population",
854+
"PopulationSizeMax": "Taille maximale de la population",
855+
"NumberOfElites": "Nombre d'élites par génération",
856+
"NumberOfRandoms": "Nombre d'aléatoires par génération",
857+
"CrossoverNumberOfCuts": "Nombre de coupures d'entrecroisement",
858+
"CrossoverProbability": "Probabilité d'entrecroisement",
859+
"MutationProbability": "Probabilité de mutation",
860+
"TournamentSize": "Taille du tournoi de sélection",
861+
"TournamentProbability": "Probabilité du tournoi",
862+
"NumberOfGenerations": "Nombre de générations",
863+
"ShuffleGenes": "Mélanger les gènes avant la reproduction",
864+
"KeepGenerations": "Nombre de générations à conserver",
865+
"KeepCandidates": "Nombre de candidats à conserver",
866+
"PopulationSizeMinInvalid": "La taille minimale de la population doit être supérieure à 0",
867+
"PopulationSizeMaxInvalid": "La taille maximale de la population doit être supérieure à 0",
868+
"NumberOfElitesInvalid": "Le nombre d'élites par génération doit être supérieur à 0",
869+
"NumberOfRandomsInvalid": "Le nombre d'aléatoires par génération doit être supérieur ou égal à 0",
870+
"CrossoverNumberOfCutsInvalid": "Le nombre de coupures d'entrecroisement doit être supérieur à 0",
871+
"CrossoverProbabilityInvalid": "La probabilité d'entrecroisement doit être entre 0 et 1",
872+
"MutationProbabilityInvalid": "La probabilité de mutation doit être entre 0 et 1",
873+
"TournamentSizeInvalid": "La taille du tournoi de sélection doit être supérieure à 0",
874+
"TournamentProbabilityInvalid": "La probabilité du tournoi doit être entre 0 et 1",
875+
"NumberOfGenerationsInvalid": "Le nombre de générations doit être supérieur à 0",
876+
"KeepGenerationsInvalid": "Le nombre de générations à conserver doit être supérieur à 0",
877+
"KeepCandidatesInvalid": "Le nombre de candidats à conserver doit être supérieur à 0",
878+
"help": {
879+
"PopulationSizeMin": "Nombre minimal de candidats dans chaque génération",
880+
"PopulationSizeMax": "Nombre maximal de candidats dans chaque génération",
881+
"NumberOfElites": "Nombre de meilleurs candidats à copier directement dans la génération suivante",
882+
"NumberOfRandoms": "Nombre de nouveaux candidats entièrement aléatoires à ajouter dans chaque génération",
883+
"CrossoverNumberOfCuts": "Nombre de points où les gènes des parents sont coupés pour créer des enfants",
884+
"CrossoverProbability": "Probabilité qu'un couple de parents subisse l'entrecroisement pour créer des enfants",
885+
"MutationProbability": "Probabilité qu'un gène subisse une mutation, ie soit modifié aléatoirement. Pour cet algorithme, une probabilité de 8% (0.08) est suggérée.",
886+
"TournamentSize": "Nombre de candidats parmi les meilleurs de la génération qui s'affronteront pour la reproduction après chaque génération.",
887+
"TournamentProbability": "La probabilité initiale qu'il y ait un tournoi pour la sélection des parents plutôt que sélectionner le meilleur. Cette probabilité ne doit pas être trop élevée, sinon seuls les meilleurs se reproduiront.",
888+
"ShuffleGenes": "Mélanger les gènes évite les effets de proximité dans le chromosome, où 2 lignes positionnées côte à côte auront toujours les mêmes valeurs. Cela aide à diversifier la population.",
889+
"KeepGenerations": "Nombre de dernières générations à conserver pour analyse après l'exécution de l'algorithme",
890+
"KeepCandidates": "Nombre des meilleurs candidats à conserver pour chacune des générations à conserver"
891+
},
892+
"errors": {
893+
"PopulationSizeMinGreaterThanMax": "La taille de la population minimale est plus grande que la maximale",
894+
"CandidatesToKeepGreaterThanPopulation": "Le nombre de candidats à conserver est supérieur à la population",
895+
"GenerationsToKeepGreaterThanGenerations": "Le nombre générations à conserver est supérieur au nombre de génération"
896+
}
897+
},
898+
"simulationMethods": {
899+
"accessibilityMap": {
900+
"Title": "Par carte d'accessibilité",
901+
"AccessMapDataSources": "Sources de données pour les lieux",
902+
"AccessMapMaxSampleRatio": "Ratio d'échantillonnage maximal à tester (entre 0 et 1)"
903+
}
904+
}
905+
},
850906
"simulation": {
851907
"Simulation": "Simulation",
852908
"Simulations": "Simulations",
@@ -859,25 +915,12 @@
859915
"NumberOfThreads": "Nombre de processus parallèles",
860916
"NumberOfLinesMin": "Nombre minimal de lignes",
861917
"NumberOfLinesMax": "Nombre maximal de lignes",
862-
"PopulationSizeMin": "Taille minimale de la population",
863-
"PopulationSizeMax": "Taille maximale de la population",
864918
"VehiclesCount": "Nombre de véhicules (flotte)",
865919
"MaxIntervalMinutes": "Intervalle maximal (minutes)",
866920
"MaxIntervalMinutesHelp": "Le temps maximum entre les départs sur une ligne. Pour un service optimal, il est suggéré de le garder en-dessous de 15 minutes. Des temps jusqu'à 60 mintues sont acceptés.",
867921
"MinIntervalMinutes": "Intervalle minimal (minutes)",
868922
"MinIntervalMinutesHelp": "Le temps minimal entre les départs sur une ligne. La valeur ne devrait pas être supérieure à 3. Moins que ça n'aurait pas d'effet sur les calculs.",
869-
"NumberOfElites": "Nombre d'élites par génération",
870-
"NumberOfRandoms": "Nombre d'aléatoires par génération",
871-
"CrossoverNumberOfCuts": "Nombre de coupures d'entrecroisement",
872-
"CrossoverProbability": "Probabilité d'entrecroisement",
873-
"MutationProbability": "Probabilité de mutation",
874-
"TournamentSize": "Taille du tournoi de sélection",
875-
"TournamentProbability": "Probabilité du tournoi",
876-
"ShuffleGenes": "Mélanger les gènes avant la reproduction",
877-
"KeepGenerations": "Nombre de générations à conserver",
878-
"KeepCandidates": "Nombre de candidats à conserver",
879923
"OdTripsSampleRatio": "Pourcentage des déplacements OD à inclure",
880-
"NumberOfGenerations": "Nombre de générations",
881924
"Color": "Color",
882925
"Edit": "Simulation",
883926
"Delete": "Supprimer la simulation",
@@ -905,9 +948,6 @@
905948
"Results": "Résultats",
906949
"Parameters": "Paramètres",
907950
"RuntimeOptions": "Configuration de l'exécution",
908-
"simulationClasses": {
909-
"LineAndNumberOfVehiclesGASimulation": "Algorithme génétique avec lignes et nombre de véhicules"
910-
},
911951
"simulationMethods": {
912952
"SelectSimulationFunctions": "Sélectionner les fonctions à utiliser pour la simulation",
913953
"OdTrips": "Chargement OD",
@@ -966,10 +1006,7 @@
9661006
"MinTimeHigherThanMax": "Le temps minimal entre les passages est plus élevé que le temps maximal",
9671007
"MinTimeBetweenPassagesTooHigh": "Le temps minimal entre les passages est trop élevé",
9681008
"UnknownAlgorithm": "L'algorithme sélectionné n'est pas disponible",
969-
"SimulatedAgenciesIsEmpty": "Au moins une agence à simuler doit être sélectionnée",
970-
"PopulationSizeMinGreaterThanMax": "La taille de la population minimale est plus grande que la maximale",
971-
"CandidatesToKeepGreaterThanPopulation": "Le nombre de candidats à conserver est supérieur à la population",
972-
"GenerationsToKeepGreaterThanGenerations": "Le nombre générations à conserver est supérieur au nombre de génération"
1009+
"SimulatedAgenciesIsEmpty": "Au moins une agence à simuler doit être sélectionnée"
9731010
}
9741011
},
9751012
"jobs": {

packages/transition-backend/src/services/simulation/__tests__/TransitNetworkDesignAlgorithmDescriptorStub.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
* This file is licensed under the MIT License.
55
* License text available at https://opensource.org/licenses/MIT
66
*/
7-
import { TransitNetworkDesignAlgorithm, SimulationAlgorithmDescriptor } from 'transition-common/lib/services/networkDesign/transit/TransitNetworkDesignAlgorithm';
7+
import { TransitNetworkDesignAlgorithm } from 'transition-common/lib/services/networkDesign/transit/TransitNetworkDesignAlgorithm';
8+
import { UserDefinedConfigSchema } from 'transition-common/lib/utils/userDefinedConfig';
89

910
type AlgorithmStubOptions = {
1011
numericOption: number;
@@ -25,20 +26,20 @@ export class SimulationAlgorithmStub implements TransitNetworkDesignAlgorithm {
2526

2627
}
2728

28-
export class SimulationAlgorithmDescriptorStub implements SimulationAlgorithmDescriptor<AlgorithmStubOptions> {
29+
export class SimulationAlgorithmDescriptorStub implements UserDefinedConfigSchema<AlgorithmStubOptions> {
2930

3031
getTranslatableName = () => "string"
3132

32-
getOptions = () => ({
33+
getFields = () => ({
3334
numericOption: { i18nName: 'numOption', type: 'number' as const, validate: (value: number) => value > 0 },
3435
stringOption: { i18nName: 'stringOption', type: 'string' as const },
3536
booleanOption: { i18nName: 'boolOption', type: 'boolean' as const }
3637
});
3738

38-
validateOptions = (options: Partial<AlgorithmStubOptions>) => {
39+
validateFields = (fields: Partial<AlgorithmStubOptions>) => {
3940
let valid = true;
4041
let errors: string[] = [];
41-
if (options.stringOption === undefined) {
42+
if (fields.stringOption === undefined) {
4243
valid = false;
4344
errors.push('StringOptionMandatory');
4445
}

packages/transition-backend/src/services/simulation/methods/SimulationMethod.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
* This file is licensed under the MIT License.
55
* License text available at https://opensource.org/licenses/MIT
66
*/
7-
import { SimulationAlgorithmDescriptor } from 'transition-common/lib/services/networkDesign/transit/TransitNetworkDesignAlgorithm';
87
import { SimulationRunDataAttributes } from 'transition-common/lib/services/simulation/SimulationRun';
98
import { TransitRoutingBaseAttributes } from 'chaire-lib-common/lib/services/routing/types';
9+
import { UserDefinedConfigSchema } from 'transition-common/lib/utils/userDefinedConfig';
1010

1111
/**
1212
* Interface for simulation method implementations. A simulation method will be
@@ -36,5 +36,5 @@ export interface SimulationMethod {
3636
export interface SimulationMethodFactory<TOptionsType extends Record<string, unknown>> {
3737
create: (options: TOptionsType, simulationDataAttributes: SimulationRunDataAttributes) => SimulationMethod;
3838

39-
getDescriptor: () => SimulationAlgorithmDescriptor<TOptionsType>;
39+
getDescriptor: () => UserDefinedConfigSchema<TOptionsType>;
4040
}

0 commit comments

Comments
 (0)