Author: amintos <sola...@live.de>
Branch: 
Changeset: r763:499363dfd430
Date: 2014-01-21 09:42 +0000
http://bitbucket.org/pypy/lang-smalltalk/changeset/499363dfd430/

Log:    SPyVM-GameOfLife created online with Bitbucket

diff --git a/images/SPyVM-GameOfLife b/images/SPyVM-GameOfLife
new file mode 100644
--- /dev/null
+++ b/images/SPyVM-GameOfLife
@@ -0,0 +1,530 @@
+Object subclass: #GameOfLifeField
+       instanceVariableNames: 'data height width'
+       classVariableNames: ''
+       poolDictionaries: ''
+       category: 'VM-GameOfLife'!
+
+!GameOfLifeField methodsFor: 'as yet unclassified' stamp: 'pre 1/19/2014 
21:23'!
+cellAliveAt: x at: y
+
+       ^ (self at: x at: y) = 1! !
+
+!GameOfLifeField methodsFor: 'as yet unclassified' stamp: 'pre 1/19/2014 
21:14'!
+rows: numberOfRows columns: numberOfColumns
+
+       self height: numberOfRows.
+       self width: numberOfColumns.
+       self data: (Matrix rows: numberOfRows columns: numberOfColumns element: 
0).
+       ! !
+
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:25'!
+at: x at:y
+       
+       ((x < 1) or: [x > self width]) ifTrue: [ ^ 0 ].
+      ((y < 1) or: [y > self height]) ifTrue: [ ^ 0 ].
+
+       ^ self data at: y at: x! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:25'!
+at: x at:y put: aValue
+
+       self data at: y at: x put: aValue.! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 22:02'!
+atRow: rowNumber put: aRow
+
+       self data atRow: rowNumber put: aRow! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+data
+
+       ^ data! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+data: anObject
+
+       data := anObject! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+height
+
+       ^ height! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+height: anObject
+
+       height := anObject! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:52'!
+print
+
+       | resultString |
+       resultString := ''.
+       (1 to: self height) do: [:y |
+               (1 to: self width) do: [ :x |
+                       resultString := resultString , (self data at: y at: 
x).].
+               resultString := resultString , Character cr ].
+       ^ resultString                  ! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+rowSlice: sliceSize collect: aBlock
+
+       ! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:28'!
+rowwiseFrom: startRow to: endRow collect: aBlock
+
+       | newField |
+       newField := GameOfLifeFieldSlice from: startRow to: endRow width: self 
width.
+       (startRow to: endRow) do: [ :y | 
+               (1 to: self width) do: [ :x | newField at: x at: y put: (aBlock 
value: self value: x value: y) ] ].
+       ^ newField! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+width
+
+       ^ width! !
+
+!GameOfLifeField methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:45'!
+width: anObject
+
+       width := anObject! !
+
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+GameOfLifeField class
+       instanceVariableNames: ''!
+
+!GameOfLifeField class methodsFor: 'as yet unclassified' stamp: 'pre 1/19/2014 
21:44'!
+gliderFieldRows: numberOfRows columns: numberOfColumns
+
+       | newField |
+       newField := self new rows: numberOfRows columns: numberOfColumns.
+       
+       newField 
+               at: 8 at: 5 put: 1;
+               at: 9 at: 5 put: 1;      
+               at: 10 at: 5 put: 1;
+               at: 10 at: 4 put: 1;
+               at: 9 at: 3 put: 1.
+               
+       ^ newField! !
+
+!GameOfLifeField class methodsFor: 'as yet unclassified' stamp: 'pre 1/19/2014 
20:43'!
+rows: numberOfRows columns: numberOfColumns
+
+       ^ self new rows: numberOfRows columns: numberOfColumns! !
+
+
+GameOfLifeField subclass: #GameOfLifeFieldSlice
+       instanceVariableNames: 'startRow endRow'
+       classVariableNames: ''
+       poolDictionaries: ''
+       category: 'VM-GameOfLife'!
+
+!GameOfLifeFieldSlice methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 
10:22'!
+from: startRow to: endRow width: width
+
+       self startRow: startRow;
+               endRow: endRow;
+               width: width;
+               height: (endRow - startRow + 1);
+               data: (Matrix rows: (endRow - startRow + 1) columns: width).
+               
+       ^ self! !
+
+!GameOfLifeFieldSlice methodsFor: 'as yet unclassified' stamp: 'pre 1/19/2014 
21:31'!
+rowwiseDo: aBlock
+
+       self startRow to: self endRow do: [ :rowNumber |
+               aBlock value: rowNumber value: (self data atRow: (rowNumber - 
self startRow) + 1).
+       ].! !
+
+
+!GameOfLifeFieldSlice methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:30'!
+at: x at:y put: aValue
+
+       self data at: y +  1 - self startRow at: x put: aValue.! !
+
+!GameOfLifeFieldSlice methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:11'!
+endRow
+
+       ^ endRow! !
+
+!GameOfLifeFieldSlice methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:11'!
+endRow: anObject
+
+       endRow := anObject! !
+
+!GameOfLifeFieldSlice methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:11'!
+startRow
+
+       ^ startRow! !
+
+!GameOfLifeFieldSlice methodsFor: 'accessing' stamp: 'pre 1/19/2014 21:11'!
+startRow: anObject
+
+       startRow := anObject! !
+
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+GameOfLifeFieldSlice class
+       instanceVariableNames: ''!
+
+!GameOfLifeFieldSlice class methodsFor: 'as yet unclassified' stamp: 'pre 
1/19/2014 20:53'!
+from: startRow to: endRow width: width
+
+       ^ self new from: startRow to: endRow width: width! !
+
+
+Object subclass: #STMSimulation
+       instanceVariableNames: 'processes field numberOfProcesses fieldSlices 
fieldNew'
+       classVariableNames: ''
+       poolDictionaries: ''
+       category: 'VM-GameOfLife'!
+
+!STMSimulation methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 09:44'!
+initialField: aGameOfLifeField
+
+       self field: aGameOfLifeField.
+       self fieldNew: (GameOfLifeField rows: (aGameOfLifeField height) 
columns: (aGameOfLifeField width)).! !
+
+!STMSimulation methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 09:50'!
+simulateRound: roundNumber 
+
+       self processes: ((1 to: self numberOfProcesses) collect: [ 
:processNumber |
+               [| rows |
+               rows := self startProcess: processNumber.
+               rows rowwiseDo: [ :rowNumber :aRow | self fieldNew atRow: 
rowNumber put: aRow ]] parallelFork. ]).
+! !
+
+!STMSimulation methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 09:44'!
+simulateRounds: numberOfRounds
+       
+       | swapField |
+
+       1 to: numberOfRounds do: [ :roundNumber |
+               self simulateRound: roundNumber.
+               self processes do: [ :semaphore | semaphore wait. ].
+               
+               "Transcript show: self fieldNew print.
+               Transcript show: Character cr."
+               
+               swapField := self field.
+               self field: self fieldNew.
+               self fieldNew: swapField.
+       ].
+
+       ^ self field! !
+
+!STMSimulation methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 09:44'!
+startProcess: processNumber
+
+       | endOfSlice slice startOfSlice |
+       slice := (self field height / self numberOfProcesses).
+       startOfSlice := ((processNumber - 1) * slice) + 1.
+       endOfSlice := processNumber * slice.
+
+       ^ self field rowwiseFrom: startOfSlice
+                                       to: endOfSlice
+                                       collect: [ :tempField :x :y | self 
thumbUpOrDownAt: x at: y on: tempField ]
+
+       
+       ! !
+
+!STMSimulation methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 09:44'!
+thumbUpOrDownAt: x at: y on: tempField 
+       | liveCellCount |
+       
+       liveCellCount := (tempField at: x - 1 at: y - 1)
+                               + (tempField at: x + 0 at: y - 1)
+                               + (tempField at: x + 1 at: y - 1)
+                               + (tempField at: x - 1 at: y + 0)
+                               + (tempField at: x + 1 at: y + 0)
+                               + (tempField at: x - 1 at: y + 1)
+                               + (tempField at: x + 0 at: y + 1)
+                               + (tempField at: x + 1 at: y + 1).
+       
+       (tempField cellAliveAt: x at: y)
+               ifTrue: [((2 = liveCellCount)
+                                       or: [liveCellCount = 3])
+                               ifTrue: [^ 1]
+                               ifFalse: [^ 0]]
+               ifFalse: [(liveCellCount = 3)
+                               ifTrue: [^ 1]
+                               ifFalse: [^ 0]]! !
+
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+field
+
+       ^ field! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+field: anObject
+
+       field := anObject! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+fieldNew
+
+       ^ fieldNew! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+fieldNew: anObject
+
+       fieldNew := anObject! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+fieldSlices
+
+       ^ fieldSlices! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+fieldSlices: anObject
+
+       fieldSlices := anObject! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+numberOfProcesses
+
+       ^ numberOfProcesses! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+numberOfProcesses: aNumber
+
+       numberOfProcesses := aNumber
+       ! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+processes
+
+       ^ processes! !
+
+!STMSimulation methodsFor: 'accessing' stamp: 'pre 1/21/2014 09:44'!
+processes: anObject
+
+       processes := anObject! !
+
+
+!STMSimulation methodsFor: 'initialize-release' stamp: 'pre 1/21/2014 09:44'!
+initialize
+
+       self processes: OrderedCollection new.
+       ! !
+
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+STMSimulation class
+       instanceVariableNames: ''!
+
+!STMSimulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 
09:44'!
+benchmark
+
+       ^ (1 to: 4) collect: [ :i |
+                       [ self standardSimulation: (2 raisedTo: i) ] timeToRun 
]! !
+
+!STMSimulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 
09:44'!
+benchmark2
+
+       ^ (1 to: 5) collect: [ :i |
+                       [ self standardSimulation2: (2 raisedTo: i) ] timeToRun 
]! !
+
+!STMSimulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 
09:44'!
+standardSimulation2: numberOfProcesses
+
+       ^ self new
+                       numberOfProcesses: numberOfProcesses;
+                       initialField: (GameOfLifeField gliderFieldRows: 32 
columns: 32);
+                       simulateRounds: 5.
+                       
+                       ! !
+
+!STMSimulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/21/2014 
09:44'!
+standardSimulation: numberOfProcesses
+
+       ^ self new
+                       numberOfProcesses: numberOfProcesses;
+                       initialField: (GameOfLifeField gliderFieldRows: 32 
columns: 32);
+                       simulateRounds: 5.
+                       
+                       ! !
+
+
+Object subclass: #Simulation
+       instanceVariableNames: 'processes field numberOfProcesses fieldSlices 
fieldNew'
+       classVariableNames: ''
+       poolDictionaries: ''
+       category: 'VM-GameOfLife'!
+
+!Simulation methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 13:37'!
+initialField: aGameOfLifeField
+
+       self field: aGameOfLifeField.
+       self fieldNew: (GameOfLifeField rows: (aGameOfLifeField height) 
columns: (aGameOfLifeField width)).! !
+
+!Simulation methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 13:44'!
+simulateRound: roundNumber 
+
+       self processes: ((1 to: self numberOfProcesses) collect: [ 
:processNumber |
+               | semaphore |
+               semaphore := Semaphore new.
+               [| rows |
+               rows := self startProcess: processNumber.
+               rows rowwiseDo: [ :rowNumber :aRow | self fieldNew atRow: 
rowNumber put: aRow ].
+               semaphore signal] fork.
+               semaphore ]).
+! !
+
+!Simulation methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 14:00'!
+simulateRounds: numberOfRounds
+       
+       | swapField |
+
+       1 to: numberOfRounds do: [ :roundNumber |
+               self simulateRound: roundNumber.
+               self processes do: [ :semaphore | semaphore wait. ].
+               
+               "Transcript show: self fieldNew print.
+               Transcript show: Character cr."
+               
+               swapField := self field.
+               self field: self fieldNew.
+               self fieldNew: swapField.
+       ].
+
+       ^ self field! !
+
+!Simulation methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 13:34'!
+startProcess: processNumber
+
+       | endOfSlice slice startOfSlice |
+       slice := (self field height / self numberOfProcesses).
+       startOfSlice := ((processNumber - 1) * slice) + 1.
+       endOfSlice := processNumber * slice.
+
+       ^ self field rowwiseFrom: startOfSlice
+                                       to: endOfSlice
+                                       collect: [ :tempField :x :y | self 
thumbUpOrDownAt: x at: y on: tempField ]
+
+       
+       ! !
+
+!Simulation methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 10:48'!
+thumbUpOrDownAt: x at: y on: tempField 
+       | liveCellCount |
+       
+       liveCellCount := (tempField at: x - 1 at: y - 1)
+                               + (tempField at: x + 0 at: y - 1)
+                               + (tempField at: x + 1 at: y - 1)
+                               + (tempField at: x - 1 at: y + 0)
+                               + (tempField at: x + 1 at: y + 0)
+                               + (tempField at: x - 1 at: y + 1)
+                               + (tempField at: x + 0 at: y + 1)
+                               + (tempField at: x + 1 at: y + 1).
+       
+       (tempField cellAliveAt: x at: y)
+               ifTrue: [((2 = liveCellCount)
+                                       or: [liveCellCount = 3])
+                               ifTrue: [^ 1]
+                               ifFalse: [^ 0]]
+               ifFalse: [(liveCellCount = 3)
+                               ifTrue: [^ 1]
+                               ifFalse: [^ 0]]! !
+
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:04'!
+field
+
+       ^ field! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:04'!
+field: anObject
+
+       field := anObject! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 22:06'!
+fieldNew
+
+       ^ fieldNew! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 22:06'!
+fieldNew: anObject
+
+       fieldNew := anObject! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:30'!
+fieldSlices
+
+       ^ fieldSlices! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:30'!
+fieldSlices: anObject
+
+       fieldSlices := anObject! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:09'!
+numberOfProcesses
+
+       ^ numberOfProcesses! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:09'!
+numberOfProcesses: aNumber
+
+       numberOfProcesses := aNumber
+       ! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:04'!
+processes
+
+       ^ processes! !
+
+!Simulation methodsFor: 'accessing' stamp: 'pre 1/19/2014 20:04'!
+processes: anObject
+
+       processes := anObject! !
+
+
+!Simulation methodsFor: 'initialize-release' stamp: 'pre 1/19/2014 20:04'!
+initialize
+
+       self processes: OrderedCollection new.
+       ! !
+
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+Simulation class
+       instanceVariableNames: ''!
+
+!Simulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 
14:08'!
+benchmark
+
+       ^ (1 to: 4) collect: [ :i |
+                       [ self standardSimulation: (2 raisedTo: i) ] timeToRun 
]! !
+
+!Simulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 
14:09'!
+benchmark2
+
+       ^ (1 to: 5) collect: [ :i |
+                       [ self standardSimulation2: (2 raisedTo: i) ] timeToRun 
]! !
+
+!Simulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 
13:59'!
+standardSimulation2: numberOfProcesses
+
+       ^ self new
+                       numberOfProcesses: numberOfProcesses;
+                       initialField: (GameOfLifeField gliderFieldRows: 32 
columns: 32);
+                       simulateRounds: 5.
+                       
+                       ! !
+
+!Simulation class methodsFor: 'as yet unclassified' stamp: 'pre 1/20/2014 
13:59'!
+standardSimulation: numberOfProcesses
+
+       ^ self new
+                       numberOfProcesses: numberOfProcesses;
+                       initialField: (GameOfLifeField gliderFieldRows: 32 
columns: 32);
+                       simulateRounds: 5.
+                       
+                       ! !
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to