Skip to content

Commit a2e4237

Browse files
committed
Fix a bunch of new random failing tests
FIxes #300 Fixes #306
1 parent 9dc5e56 commit a2e4237

8 files changed

+377
-308
lines changed

src/Math-FunctionFit/PMAnotherChromosomeManager.class.st

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ Class {
88
#instVars : [
99
'hammersley',
1010
'rateOfLC',
11-
'rateOfEir'
11+
'rateOfEir',
12+
'randomGenerator'
1213
],
1314
#classVars : [
1415
'Primes'
@@ -33,28 +34,29 @@ PMAnotherChromosomeManager class >> integerDigitsFor: anInteger base: aBase [
3334
]
3435

3536
{ #category : #utilities }
36-
PMAnotherChromosomeManager class >> numberOfHamersleyPoints: n dimension: d randomized: aBoolean [
37+
PMAnotherChromosomeManager class >> numberOfHamersleyPoints: n dimension: d randomGenerator: randomGenerator [
3738
"a bit randomized "
38-
| dist randomNumberGenerator |
39+
40+
| dist |
3941
dist := 1.0 / n.
40-
randomNumberGenerator := Random new.
41-
42-
^(1 to: n) collect: [ :number |
43-
(1 to: d) collect: [ :dim |
44-
(dim=1)
45-
ifTrue: [ aBoolean
46-
ifTrue: [ (number/n) - (randomNumberGenerator nextBetween: 0 and: dist) ]
47-
ifFalse: [ number/n ] ]
48-
ifFalse: [ |sum prime|
49-
sum := 0.
50-
prime := Primes at: dim - 1.
51-
52-
(self integerDigitsFor: number base: prime) reverse withIndexDo: [ :i :index |
53-
sum := i / (prime raisedToInteger: index) + sum ].
54-
55-
aBoolean
56-
ifTrue: [ sum + (randomNumberGenerator nextBetween: 0 and: dist) ]
57-
ifFalse: [ sum ] ] ]].
42+
43+
^ (1 to: n) collect: [ :number |
44+
(1 to: d) collect: [ :dim |
45+
dim = 1
46+
ifTrue: [
47+
randomGenerator
48+
ifNotNil: [ number / n - (randomGenerator nextBetween: 0 and: dist) ]
49+
ifNil: [ number / n ] ]
50+
ifFalse: [
51+
| sum prime |
52+
sum := 0.
53+
prime := Primes at: dim - 1.
54+
55+
(self integerDigitsFor: number base: prime) reverse withIndexDo: [ :i :index | sum := i / (prime raisedToInteger: index) + sum ].
56+
57+
randomGenerator
58+
ifNotNil: [ sum + (randomGenerator nextBetween: 0 and: dist) ]
59+
ifNil: [ sum ] ] ] ]
5860
]
5961

6062
{ #category : #'instance creation' }
@@ -108,14 +110,15 @@ PMAnotherChromosomeManager >> eirCrossover: aChromosome1 and: aChromosome2 [
108110

109111
{ #category : #initialization }
110112
PMAnotherChromosomeManager >> initialize [
111-
super initialize .
112-
populationSize :=100.
113-
hammersley :=true.
114-
rateOfEir :=0.16.
115-
rateOfLC:=0.29.
116-
rateOfMutation :=0.4.
117-
rateOfCrossover :=0.15.
118-
Primes ifNil:[Primes :=Integer primesUpTo: 500]. "sufficient for up to 95 dimensions (parameters)"
113+
114+
super initialize.
115+
populationSize := 100.
116+
hammersley := true.
117+
rateOfEir := 0.16.
118+
rateOfLC := 0.29.
119+
rateOfMutation := 0.4.
120+
rateOfCrossover := 0.15.
121+
Primes ifNil: [ Primes := Integer primesUpTo: 500 ] "sufficient for up to 95 dimensions (parameters)"
119122
]
120123

121124
{ #category : #information }
@@ -205,16 +208,29 @@ PMAnotherChromosomeManager >> process: aChromosome1 and: aChromosome2 [
205208
add: (self clone: aChromosome2)]]]]
206209
]
207210

211+
{ #category : #accessing }
212+
PMAnotherChromosomeManager >> randomGenerator [
213+
214+
^ randomGenerator
215+
]
216+
217+
{ #category : #accessing }
218+
PMAnotherChromosomeManager >> randomGenerator: anObject [
219+
220+
randomGenerator := anObject
221+
]
222+
208223
{ #category : #private }
209224
PMAnotherChromosomeManager >> randomRangeAt: aPosition [
210225
^(range at: aPosition )*(self smallDistribution )
211226
]
212227

213228
{ #category : #operation }
214229
PMAnotherChromosomeManager >> randomizePopulation [
215-
hammersley ifFalse: [^super randomizePopulation ].
216-
population :=self class numberOfHamersleyPoints: populationSize dimension: origin size randomized: true.
217-
population := population collect: [:aChr| aChr *range +origin ]
230+
231+
hammersley ifFalse: [ ^ super randomizePopulation ].
232+
population := self class numberOfHamersleyPoints: populationSize dimension: origin size randomGenerator: (self randomGenerator ifNil: [ Random new ]).
233+
population := population collect: [ :aChr | aChr * range + origin ]
218234
]
219235

220236
{ #category : #accessing }

src/Math-FunctionFit/PMAnotherGeneticOptimizer.class.st

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ PMAnotherGeneticOptimizer >> computePrecision: whateverData [ "can be changed t
9595

9696
{ #category : #operation }
9797
PMAnotherGeneticOptimizer >> evaluate [
98-
^Cursor wait showWhile: [super evaluate]
98+
99+
^ Cursor wait showWhile: [ super evaluate ]
99100
]
100101

101102
{ #category : #operation }
@@ -129,12 +130,12 @@ statistics :=false
129130

130131
{ #category : #operation }
131132
PMAnotherGeneticOptimizer >> initializeIterations [
132-
bestPoints size>=chromosomeManager populationSize
133-
ifTrue: [bestPoints := bestPoints copyFrom: 1 to: (bestPoints size // 2 max: 1)].
133+
134+
bestPoints size >= chromosomeManager populationSize ifTrue: [ bestPoints := bestPoints copyFrom: 1 to: (bestPoints size // 2 max: 1) ].
134135
super initializeIterations.
135-
bestValueHistory:=OrderedCollection new.
136-
worstValueHistory:=OrderedCollection new.
137-
whateverHistory:=OrderedCollection new
136+
bestValueHistory := OrderedCollection new.
137+
worstValueHistory := OrderedCollection new.
138+
whateverHistory := OrderedCollection new
138139
]
139140

140141
{ #category : #operation }

src/Math-FunctionFit/PMErrorMinimizer.class.st

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ PMErrorMinimizer class >> function: aBlock data: aCollection [
2929

3030
{ #category : #accessing }
3131
PMErrorMinimizer >> maxFunction [
32-
"The number of data partitions used."
33-
^dataHolder size
32+
"The number of data partitions used."
33+
34+
^ dataHolder size
3435
]

src/Math-FunctionFit/PMFunctionFit.class.st

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ PMFunctionFit >> accumulate: aWeightedPoint [
4343

4444
{ #category : #operation }
4545
PMFunctionFit >> computeChanges [
46-
^[super computeChanges]on: PMSingularMatrixError do:[:signal|signal messageText: 'singular error matrix, set better parameters'.signal pass]
46+
47+
^ [ super computeChanges ]
48+
on: PMSingularMatrixError
49+
do: [ :signal |
50+
signal messageText: 'singular error matrix, set better parameters'.
51+
signal pass ]
4752
]
4853

4954
{ #category : #information }

src/Math-FunctionFit/PMGeneralFunctionFit.class.st

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ Class {
1010
#name : #PMGeneralFunctionFit,
1111
#superclass : #Object,
1212
#instVars : [
13-
'go',
1413
'manager',
1514
'errorFunction',
1615
'result',
1716
'firstResult',
1817
'verbose',
1918
'data',
20-
'dataTruncated'
19+
'dataTruncated',
20+
'geneticOptimizer'
2121
],
2222
#category : #'Math-FunctionFit'
2323
}
@@ -92,27 +92,31 @@ self resetResult.
9292

9393
{ #category : #operation }
9494
PMGeneralFunctionFit >> evaluate [
95-
|ff|
96-
ff :=PMErrorMinimizer function: errorFunction.
97-
firstResult :=[ff evaluate .ff parameters]
98-
onErrorDo: [ verbose ifTrue: [self inform: 'ErrorMinimizer was not successful']. nil].
99-
firstResult ifNotNil: [go addPointAt: firstResult] .
100-
firstResult := go evaluate .
101-
self errorType =#squared
102-
ifTrue: [ff :=PMFunctionFit function: errorFunction function data: errorFunction data ].
103-
ff parameters: firstResult.
104-
ff desiredPrecision: PMFloatingPointMachine new machinePrecision.
105-
ff maximumIterations: 1000 .
106-
result:=[ff evaluate .ff parameters]
107-
onErrorDo: [
108-
verbose ifTrue: [self inform: 'last FunctionFit was not successful'].
109-
ff result parameters].
110-
((errorFunction value: result) > (errorFunction value: firstResult)) ifTrue:[
111-
ff:=result.
112-
result :=firstResult.
113-
firstResult :=ff.
114-
verbose ifTrue: [self inform: 'first result was better than final result' ] ].
115-
^result
95+
96+
| ff |
97+
ff := PMErrorMinimizer function: errorFunction.
98+
firstResult := [
99+
ff evaluate.
100+
ff parameters ] onErrorDo: [
101+
verbose ifTrue: [ self inform: 'ErrorMinimizer was not successful' ].
102+
nil ].
103+
firstResult ifNotNil: [ geneticOptimizer addPointAt: firstResult ].
104+
firstResult := geneticOptimizer evaluate.
105+
self errorType = #squared ifTrue: [ ff := PMFunctionFit function: errorFunction function data: errorFunction data ].
106+
ff parameters: firstResult.
107+
ff desiredPrecision: PMFloatingPointMachine new machinePrecision.
108+
ff maximumIterations: 1000.
109+
result := [
110+
ff evaluate.
111+
ff parameters ] onErrorDo: [
112+
verbose ifTrue: [ self inform: 'last FunctionFit was not successful' ].
113+
ff result parameters ].
114+
(errorFunction value: result) > (errorFunction value: firstResult) ifTrue: [
115+
ff := result.
116+
result := firstResult.
117+
firstResult := ff.
118+
verbose ifTrue: [ self inform: 'first result was better than final result' ] ].
119+
^ result
116120
]
117121

118122
{ #category : #operation }
@@ -165,16 +169,19 @@ errorFunction function: aBlock
165169

166170
{ #category : #initialization }
167171
PMGeneralFunctionFit >> initialize [
168-
super initialize .
169-
errorFunction :=PMErrorOfParameterFunction new.
170-
manager :=PMAnotherChromosomeManager new.
171-
manager populationSize: 50.
172-
go :=PMAnotherGeneticOptimizer minimizingFunction: errorFunction .
173-
go chromosomeManager: manager.
174-
go maximumIterations: 170.
175-
self errorType: #squared.
176-
verbose:=false.
177-
dataTruncated :=false
172+
173+
super initialize.
174+
errorFunction := PMErrorOfParameterFunction new.
175+
manager := PMAnotherChromosomeManager new
176+
populationSize: 50;
177+
yourself.
178+
geneticOptimizer := (PMAnotherGeneticOptimizer minimizingFunction: errorFunction)
179+
chromosomeManager: manager;
180+
maximumIterations: 170;
181+
yourself.
182+
self errorType: #squared.
183+
verbose := false.
184+
dataTruncated := false
178185
]
179186

180187
{ #category : #accessing }
@@ -186,7 +193,7 @@ PMGeneralFunctionFit >> manager [
186193
{ #category : #accessing }
187194
PMGeneralFunctionFit >> maximumIterations: anInteger [
188195
"default is 170."
189-
go maximumIterations: anInteger.
196+
geneticOptimizer maximumIterations: anInteger.
190197
^anInteger
191198
]
192199

@@ -207,7 +214,7 @@ manager range: (array2 - array1)
207214
{ #category : #accessing }
208215
PMGeneralFunctionFit >> optimizer [
209216
"if you want to change parameters of AnotherGeneticOptimizer not directly available in GeneralFunctionFit"
210-
^go
217+
^geneticOptimizer
211218
]
212219

213220
{ #category : #accessing }
@@ -221,7 +228,7 @@ manager populationSize: anInteger .
221228
{ #category : #accessing }
222229
PMGeneralFunctionFit >> precision [
223230
"not really useful to look at, you might better look at #error"
224-
^go precision
231+
^geneticOptimizer precision
225232
]
226233

227234
{ #category : #printing }
@@ -230,7 +237,7 @@ PMGeneralFunctionFit >> printOn: aStream [
230237
nextPutAll: 'a ';
231238
nextPutAll: self class name;
232239
nextPut: $(;
233-
print: go;
240+
print: geneticOptimizer;
234241
nextPutAll: ' with data of size: ';
235242
print: data size .
236243
dataTruncated ifTrue:
@@ -272,7 +279,7 @@ self data: data
272279
PMGeneralFunctionFit >> resetResult [
273280
result :=nil.
274281
firstResult :=nil.
275-
go resetBestPoints
282+
geneticOptimizer resetBestPoints
276283
]
277284

278285
{ #category : #accessing }

0 commit comments

Comments
 (0)