Skip to content

Commit e11c18b

Browse files
refactor_multimodelmacro
1 parent 5f8b75f commit e11c18b

File tree

4 files changed

+84
-98
lines changed

4 files changed

+84
-98
lines changed

library/build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import sbt.enablePlugins
44
val geotoolsVersion = "27.0"
55

66
lazy val commonSettings = Seq(
7-
scalaVersion := "3.3.1",
7+
scalaVersion := "3.6.2",
88
organization := "org.openmole.library",
99
// trick to remove maven central (added again: change order for jai to be found in the continuous integration (sbt tries first resolver only in CI) since mavenCentral jai is broken (pom but no jar)
1010
externalResolvers := Resolver.combineDefaultResolvers(resolvers.value.toVector, mavenCentral = false),

library/src/main/scala/org/openmole/spatialdata/application/multimodelmacro/RealData.scala

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,9 @@ object RealData {
3434
}
3535
}
3636

37-
def runRealDataMultiModelMacro(
38-
populationsFile: String,
39-
distancesFile: String,
40-
datesFile: String,
41-
finalTime: Int,
42-
seed: Long,
43-
innovationWeight: Double,
44-
innovationGravityDecay: Double,
45-
innovationInnovationDecay: Double,
46-
innovationMutationRate: Double,
47-
innovationNewInnovationHierarchy: Double,
48-
innovationEarlyAdoptersRate: Double,
49-
innovationUtilityStd: Double,
50-
innovationUtilityDistrib: String,
51-
ecoWeight: Double,
52-
ecoSizeEffectOnDemand: Double,
53-
ecoSizeEffectOnSupply: Double,
54-
ecoGravityDecay: Double,
55-
ecoWealthToPopulationExponent: Double,
56-
ecoPopulationToWealthExponent: Double,
57-
coevolWeight: Double,
58-
coevolGamma: Double,
59-
coevolGravityDecay: Double,
60-
coevolNetworkGmax: Double,
61-
coevolNetworkExponent: Double,
62-
coevolNetworkThresholdQuantile: Double
63-
)(implicit rng: Random): Result = {
37+
def setupRealData(populationsFile: String,
38+
distancesFile: String,
39+
datesFile: String): (Matrix, Matrix, Array[Double]) = {
6440
implicit val m: MatrixImplementation = Matrix.defaultImplementation
6541
rng.setSeed(seed)
6642

@@ -73,24 +49,7 @@ object RealData {
7349
val rawdates: Seq[String] = CSV.readCSV(datesFile, withHeader = false).values.toSeq.head
7450
val dates: Array[Double] = rawdates.map(_.toDouble).toArray
7551

76-
val distrib = innovationUtilityDistrib match {case "normal" => Innovation.InnovationUtilityNormalDistribution(); case "log-normal" => Innovation.InnovationUtilityLogNormalDistribution()}
77-
val innovModel = Innovation(populationMatrix, distancesMatrix, dates, rng, 0.0, innovationWeight, innovationGravityDecay, innovationInnovationDecay,
78-
Innovation.mutationInnovation(_, _, _, innovationMutationRate, innovationNewInnovationHierarchy, innovationEarlyAdoptersRate, innovationUtilityStd, distrib),
79-
1.0
80-
)
81-
val innovInitialState = Innovation.initialState(innovModel)
82-
83-
val ecoModel = EconomicExchanges(populationMatrix, distancesMatrix, dates, ecoWeight, ecoSizeEffectOnDemand, ecoSizeEffectOnSupply, ecoGravityDecay, ecoWealthToPopulationExponent, ecoPopulationToWealthExponent)
84-
val ecoInitialState = EconomicExchanges.initialState(ecoModel)
85-
86-
val coevolModel = Coevolution(populationMatrix, Array(distancesMatrix), EmptyMatrix(), dates, 0.0, coevolWeight, coevolGamma, coevolGravityDecay,
87-
0.0, 1.0, 1.0, coevolNetworkGmax, coevolNetworkExponent, coevolNetworkThresholdQuantile)
88-
val coevolInitialState = Coevolution.initialState(coevolModel)
89-
90-
val model = MultiMacroModel(Seq(innovModel, ecoModel, coevolModel), Seq(innovInitialState, ecoInitialState, coevolInitialState))
91-
92-
Result(model.run.asInstanceOf[MultiMacroResult])
52+
(populationMatrix, distancesMatrix, dates)
9353
}
9454

95-
9655
}

library/src/main/scala/org/openmole/spatialdata/application/multimodelmacro/RunSDG.scala

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,51 @@ object RunSDG extends App {
1212

1313
implicit val rng: Random = new Random
1414

15-
val result = SDG.runSyntheticMultiModelMacro(
16-
syntheticCities = 30,
15+
// synthetic setup
16+
/*val initialState = SDG.setupSynthetic(syntheticCities = 30,
1717
syntheticHierarchy = 1.0,
1818
syntheticMaxPop = 100000.0,
19-
finalTime = 20, // limit to avoid huge values: 50 -> up to larger than 1e9 !
20-
seed = rng.nextInt(),
21-
innovationWeight = 0.005,
22-
innovationGravityDecay = 1.0,//0.5,
23-
innovationInnovationDecay = 0.3,
24-
innovationMutationRate = 0.2,
25-
innovationNewInnovationHierarchy = 0.5,
26-
innovationEarlyAdoptersRate = 0.2,
27-
innovationUtilityStd = 1.0,
28-
innovationUtilityDistrib = "log-normal",
29-
ecoWeight = 0.05,
30-
ecoSizeEffectOnDemand = 0.1,
31-
ecoSizeEffectOnSupply = 0.2,
32-
ecoGravityDecay = 0.1,//0.5,
33-
ecoWealthToPopulationExponent = 1.5,
34-
ecoPopulationToWealthExponent = 1.5,
35-
coevolWeight = 0.005,
36-
coevolGamma = 1.0,
37-
coevolGravityDecay = 0.5,
38-
coevolNetworkGmax = 0.05,
39-
coevolNetworkExponent = 1.0,
40-
coevolNetworkThresholdQuantile = 0.5
19+
finalTime = 20
20+
)
21+
*/
22+
23+
// real data setup
24+
val initialState = RealData.setupRealData(
25+
26+
)
27+
28+
val result = SDG.runMultiModelMacro(
29+
SDG.setupMultiModelMacro(
30+
initialState._1, initialState._2, initialState._3,
31+
finalTime = 20, // limit to avoid huge values: 50 -> up to larger than 1e9 !
32+
seed = rng.nextInt(),
33+
innovationWeight = 0.005,
34+
innovationGravityDecay = 1.0,//0.5,
35+
innovationInnovationDecay = 0.3,
36+
innovationMutationRate = 0.2,
37+
innovationNewInnovationHierarchy = 0.5,
38+
innovationEarlyAdoptersRate = 0.2,
39+
innovationUtilityStd = 1.0,
40+
innovationUtilityDistrib = "log-normal",
41+
ecoWeight = 0.05,
42+
ecoSizeEffectOnDemand = 0.1,
43+
ecoSizeEffectOnSupply = 0.2,
44+
ecoGravityDecay = 0.1,//0.5,
45+
ecoWealthToPopulationExponent = 1.5,
46+
ecoPopulationToWealthExponent = 1.5,
47+
coevolWeight = 0.005,
48+
coevolGamma = 1.0,
49+
coevolGravityDecay = 0.5,
50+
coevolNetworkGmax = 0.05,
51+
coevolNetworkExponent = 1.0,
52+
coevolNetworkThresholdQuantile = 0.5
53+
)
4154
)
4255

4356
utils.log(s"Indicators: Emissions = ${SDG.cumulatedFlows(result)}; Innovation = ${- SDG.averageUtility(result)}; Infrastructure = ${SDG.averageDistance(result)}; Eco inequality = ${SDG.giniEconomicWealth(result)}; Wealth = ${SDG.averageWealth(result)}")
4457

58+
val realresult: RealData.Result = RealData.Result(result)
59+
60+
utils.log(s"Fit on populations : logmse = ${realresult.logmse} ; mselog = ${realresult.mselog}")
61+
4562
}

library/src/main/scala/org/openmole/spatialdata/application/multimodelmacro/SDG.scala

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,33 +40,13 @@ object SDG {
4040
* - Q of complex interactions between submodules?: specific question for model validation
4141
* @return
4242
*/
43-
def setupSyntheticMultiModelMacro(
44-
syntheticCities: Int,
45-
syntheticHierarchy: Double,
46-
syntheticMaxPop: Double,
47-
finalTime: Int,
48-
seed: Long,
49-
innovationWeight: Double,
50-
innovationGravityDecay: Double,
51-
innovationInnovationDecay: Double,
52-
innovationMutationRate: Double,
53-
innovationNewInnovationHierarchy: Double,
54-
innovationEarlyAdoptersRate: Double,
55-
innovationUtilityStd: Double,
56-
innovationUtilityDistrib: String,
57-
ecoWeight: Double,
58-
ecoSizeEffectOnDemand: Double,
59-
ecoSizeEffectOnSupply: Double,
60-
ecoGravityDecay: Double,
61-
ecoWealthToPopulationExponent: Double,
62-
ecoPopulationToWealthExponent: Double,
63-
coevolWeight: Double,
64-
coevolGamma: Double,
65-
coevolGravityDecay: Double,
66-
coevolNetworkGmax: Double,
67-
coevolNetworkExponent: Double,
68-
coevolNetworkThresholdQuantile: Double
69-
)(implicit rng: Random): MultiMacroModel = {
43+
def setupSynthetic(
44+
syntheticCities: Int,
45+
syntheticHierarchy: Double,
46+
syntheticMaxPop: Double,
47+
finalTime: Int,
48+
seed: Long
49+
)(implicit rng: Random): (Matrix, Matrix, Array[Double]) = {
7050
implicit val m: MatrixImplementation = Matrix.defaultImplementation
7151
rng.setSeed(seed)
7252

@@ -80,6 +60,36 @@ object SDG {
8060
populationMatrix.setMSubmat(0,0,Array(initialPopulations.toArray).transpose)
8161
val dates: Array[Double] = (0 to finalTime).toArray.map{_.toDouble}
8262

63+
(populationMatrix, dmat, dates)
64+
}
65+
66+
def setupMultiModelMacro(population: Matrix,
67+
distances: Matrix,
68+
dates: Array[Double],
69+
finalTime: Int,
70+
seed: Long,
71+
innovationWeight: Double,
72+
innovationGravityDecay: Double,
73+
innovationInnovationDecay: Double,
74+
innovationMutationRate: Double,
75+
innovationNewInnovationHierarchy: Double,
76+
innovationEarlyAdoptersRate: Double,
77+
innovationUtilityStd: Double,
78+
innovationUtilityDistrib: String,
79+
ecoWeight: Double,
80+
ecoSizeEffectOnDemand: Double,
81+
ecoSizeEffectOnSupply: Double,
82+
ecoGravityDecay: Double,
83+
ecoWealthToPopulationExponent: Double,
84+
ecoPopulationToWealthExponent: Double,
85+
coevolWeight: Double,
86+
coevolGamma: Double,
87+
coevolGravityDecay: Double,
88+
coevolNetworkGmax: Double,
89+
coevolNetworkExponent: Double,
90+
coevolNetworkThresholdQuantile: Double
91+
)(implicit rng: Random): MultiMacroModel = {
92+
8393
// note: constructor are a mess: legacy vs mutation model, no proper for mutation
8494
// initial innov utility is 1
8595
val distrib = innovationUtilityDistrib match {case "normal" => InnovationUtilityNormalDistribution(); case "log-normal" => InnovationUtilityLogNormalDistribution()}
@@ -104,7 +114,7 @@ object SDG {
104114
MultiMacroModel(Seq(innovModel, ecoModel, coevolModel), Seq(innovInitialState, ecoInitialState, coevolInitialState))
105115
}
106116

107-
def runSyntheticMultiModelMacro(model: MultiMacroModel)(implicit rng: Random): Result = Result(model.run.asInstanceOf[MultiMacroResult])
117+
def runMultiModelMacro(model: MultiMacroModel)(implicit rng: Random): Result = Result(model.run.asInstanceOf[MultiMacroResult])
108118

109119

110120
/**

0 commit comments

Comments
 (0)