lec92 15 ist338 - hmc computer sciencedodds/ist338/slides/lec92_15_ist338.pdf · reference vs....
TRANSCRIPT
IST 338 Rules !
Three-in-a-row? Aliens rule at this…
John Conway
HW 9 (lab + 1 problem)due Fri. 4/10
z = z 2 + c
Rule #1: Don't follow this rule.
Simple rules can yield complex results!
Final projects: a look ahead…
In CS,
rules rule!
(1b) Numbers and strings are handled "by value"
LL[0] L[1] L[2]
"Reference""Pointer"
id L = [5,42,'hi']
5 42 'hi'
s
'hi'
s = 'hi'
(1a) Lists are handled "by reference"
42,000,042
Reference vs. Value
Python's two methods for handling data
Lists are handled by reference:
L really holds a memory address
Numeric data and strings are handled by
value: imagine they hold the data
LL[0] L[1] L[2]
"Reference""Pointer"
id L = [5,42,'hi']
5 42 'hi'42,000,042
s
'hi'
s = 'hi'
x
7
x = 7
In CS,
rules rule!
(1b) Numbers and strings are handled "by value"
(2) Inputs pass to functions "by copy"The contents of the
variable's "box" in
memory are copied.
7
fav7
x
def f(x):
x is a copy of fav
LL[0] L[1] L[2]
"Reference""Pointer"
id L = [5,42,'hi']
5 42 'hi'
s
'hi'
s = 'hi'
(1a) Lists are handled "by reference"
42,000,042
in main:
fav = 7
f(fav)
Python functions: pass by copy
def main()
print " Welcome! "
fav = 7
fav = conform(fav)
print " My favorite # is", fav
7
fav
fav
def conform(fav)
fav = 42
return fav
Python functions: pass by copy
def main()
print " Welcome! "
fav = 7
fav = conform(fav)
print " My favorite # is", fav
7
fav
def conform(fav)
fav = 42
return fav
7
copy of fav
"pass by copy" means the contents of fav are
copied to fav
fav
But what if the underlined part were absent… ?
Rules rule!?
def conform1(fav)
fav = 42
return fav
def conform2(L)
L = [42,42]
return L
Try it!Trace each f'n. What will main1, main2, and main3 print?
def conform3(L)
L[0] = 42
L[1] = 42
fav
fav
L
L
7
Notice that there are NO assignment statements after these function calls! The return values aren't being used…
L[0]
7
def main2()
L = [7,11]
conform2(L)
print L
def main1()
fav = 7
conform1(fav)
print fav
def main3()
L = [7,11]
conform3(L)
print L
L
L[1]
11
L L[0]
7
L[1]
11
Lists are Mutable
You can change the contents of lists in
functions that take those lists as input.
Those changes will be visible
everywhere.
- Lists are MUTABLE objects
Numbers, strings, etc. are IMMUTABLE –
they can't be changed, only reassigned.
Engineers believe equations approximate reality;
Physicists believe reality approximates equations…
Not a parabola, so
not a real shot!http://www.youtube.com/watch?feature=player_embedded&v=WbaH52JI3So
http://www.fourandsix.com/blog/2011/8/29/seriously-amazing-beer-pong-shots.html
Image
forensics'
verdict:
Fake!
Mathematicians don't care either way!
Engineers believe equations approximate reality;
Physicists believe reality approximates equations…
A solid sphere can be split into 5 parts and rigidly
reassembled into two spheres the same size as the original
Banach-Tarski paradox
Banach-Tarski XKCD
the parts are "mist"
Mathematicians don't care either way!
Engineers believe equations approximate reality;
Physicists believe reality approximates equations…
why settle for gears,
when you could have
fractal gears?
Don't like reality? Build a new one!In CS?
Axioms
Definitions
math worldview
Mathematics reasons about structural rules…
Engineers believe equations approximate reality;
Physicists believe reality approximates equations…
… and CS reasons about procedural ones.
Insights, tools,
mathematical truths
if/else
while
for
arithmetic operations
variables
lists
CS worldview
Insights, tools,
algorithms
proofs programs
Data
Data
Lists ~ 2D data
A = [ 42, 75, 70 ]
42 75 70
int int intlist
A
1D lists are familiar – but lists can hold ANY kind of data – including lists!
list
A
Lists ~ 2D data
list
list
list
A[0]
A[1]
A[2]
A = [ [1,2,3,4], [5,6], [7,8,9,10,11] ]
A[0][0] A[0][1] A[0][3]
A[1][0] A[1][1]
A[2][0] A[2][1] A[2][2] A[2][3] A[2][4]
len(A[0]) len(A) Replace 10 with 42.
1 2 4
?
3
5 6
7 8 109 11
Where's 3?
list
A
list
list
list
A[0]
A[1]
A[2]
Using len, how many rows does A have, in general ?
Using len, how many columns does A have, in general ?
What does each component of A[1][2] mean ?
What is A[1][2]?
A[2][3]
A[0][0]
A = [ [1,2,3,4], [5,6,7,8], [9,0,1,2] ]
1 2 3 4
5 6 7 8
9 0 1 2
To try…
Rectangular 2D data
Try it…
def mystery(A):
""" what happens to A ? """
NROWS = len(A)
NCOLS = len(A[0])
for r in range( 0,NROWS ):
for c in range( 0,NCOLS ):
if A[r][c] == 4:
A[r][c] = 1
else:
A[r][c] += 1
After – with the
code as written…
AWrite in the resulting values in A:
A = [ [4, 2, 2, 2],
[2, 2, 4, 4],
[2, 4, 4, 2] ]
Starting with the 2d array A shown above,
write the values in A after running the code?
4 2 2 2
2 2 4 4
2 4 4 2
BeforeArow 0
row 1
row 2
col 0 col 1 col 2 col 3
hw9pr2
4 2 2 2
2 2 4 4
2 4 4 2
def inarow_2east(A):
""" what happens to A ? """
NROWS = len(A)
NCOLS = len(A[0])
for r in range( 0,NROWS ):
for c in range( 0,NCOLS ):
BeforeArow 0
row 1
row 2
col 0 col 1 col 2 col 3
A = [ [4, 2, 2, 2],
[2, 2, 4, 4],
[2, 4, 4, 2] ]
How would you change the code above to
produce a True where the original value is
equal to its neighbor to the right?!
(False, if no neighbor or a different neighbor.)
F T T F
T F T F
F T F F
Challenge:
First, try it by eye…
A = [ [' ','X','O',' ','O'],
['X','X','X','O','O'],
[' ','X','O','X','O'],
['X','O','O',' ','X'] ]
inarow_3east('X', 1, 0, A)checker
start
row
start
col LoL
col 0 col 1 col 2 col 3 col 4
row 0
row 1
row 2
row 3
… then, on hw9pr2, by Python!
First, try it by eye…
A = [ [' ','X','O',' ','O'],
['X','X','X','O','O'],
[' ','X','O','X','O'],
['X','O','O',' ','X'] ]
inarow_3east('X', 1, 0, A)
inarow_3south('O', 0, 4, A)
inarow_3southeast('X', 2, 3, A)
inarow_3northeast('X', 3, 1, A)
checker
start
row
start
col LoL
True
col 0 col 1 col 2 col 3 col 4
row 0
row 1
row 2
row 3
… then, on hw9pr2, by Python!
John Conway
hw9pr1 (lab): Conway's Game of Life
1970
60˚ 70˚
20˚ 10˚
?
(no trig)
Geometer @ Princeton
Solution: www.cs.yale.edu/homes/toyama/tri/sol.html
simple rules ~ surprising behavior
1995
Lab Problem: Conway's Game of Life
Evolutionary rulesGrid World
• Everything depends on a
cell's eight neighbors
red cells are "alive"
white cells are empty
• Exactly 3 neighbors give
birth to a new, live cell.
• Exactly 2 or 3 neighbors
keep an existing cell alive.
• Any other # of neighbors
and the central cell dies…
white cells are empty
Lab Problem: Conway's Game of Life
Evolutionary rulesGrid World
• Everything depends on a
cell's eight neighbors
red cells are "alive"
• Exactly 3 neighbors give
birth to a new, live cell.
• Exactly 2 or 3 neighbors
keep an existing cell alive.
• Any other # of neighbors
and the central cell dies…
white cells are empty
Lab Problem: Conway's Game of Life
Evolutionary rulesGrid World
• Everything depends on a
cell's eight neighbors
red cells are "alive"
• Exactly 3 neighbors give
birth to a new, live cell.
• Exactly 2 or 3 neighbors
keep an existing cell alive.
• Any other # of neighbors
and the central cell dies…
red cells are alive
white cells are empty
Lab Problem: Conway's Game of Life
Evolutionary rulesGrid World
• Everything depends on a
cell's eight neighbors
• Exactly 3 neighbors give
birth to a new, live cell.
• Exactly 2 or 3 neighbors
keep an existing cell alive.
• Any other # of neighbors
and the central cell dies…
For each cell…
• 3 live neighbors – life!
• 2 live neighbors – same
• 0, 1, 4, 5, 6, 7, or 8 live
neighbors – death
• computed all at once, not cell-
by-cell, so the ? at left does NOT
come to life!
http://www.math.com/students/wonders/life/life.html
?
Lab Problem: Creating life
next_life_generation( A )
0 1 2 3 4 50 1 2 3 4 5
0
1
2
3
4
5
0
1
2
3
4
5
next_life_generation( A )
old generation is the input, A returns the next generation
Lab Problem: Creating life
?
Stable configurations:
Periodic
"rocks"
"plants"
"animals"
period 3
period 2
Lab Problem: Creating life
Self-propagating
glider
Many life configurations expand forever…
What is the largest amount of the life
universe that can be filled with cells?
How sophisticated can Life-structures get?
www.ibiblio.org/lifepatterns/
"glider"
"Gosper glider gun"
Lab Problem: Creating life
Nothing's too
complex for
Python!
Python's complex #s
>>> c = 3 + 4j
>>> c.real
3.0
>>> c.imag
4.0
>>> abs(c)
5.0
c
z0
z1z2
z3
z4
Real axis
Imaginary axis
Mandelbrot Definition
Consider an update rule
for all complex numbers c
z0 = 0
zn+1 = zn2 + c
Small values of c keep
the sequence near the
origin, 0+0j.
z5
some "stick around":
oscillate or converge
Mandelbrot Definition
Real axis
Imaginary axis
Other values of c
make the sequence
head to infinity.
Benoit B.
Mandelbrot
1924 – 2010c
Small values of c keep
the sequence near the
origin, 0+0j.
c
Consider an update rule
for all complex numbers c
z0 = 0
zn+1 = zn2 + c
hw9pr3 Mandelbrot Set ~ points that stick around
The shaded area are points that do not diverge for z = z**2 + c
Higher-resolution M. Set
The black pixels are points that do not diverge for z = z**2 + c
-2 + 1j
-2 - 1j
1 + 1j
1 - 1j
connected
finite area
∞∞∞∞ perimeter!
Chaos!
http://www.youtube.com/watch?v=0jGaio87u3A
not self-similar but quasi-self-similar
This was a "naturally occurring" object where
zooming uncovers more detail, not less:
Before the M. Set, complex things
were made of simple parts:
What are these colors?
The black pixels are points that do not diverge for z = z**2 + c
escape
velocities
Today is about the our final projects
+ it's a sales pitch for the three possible options:
Tis the season for final projects…
vPool
TextID
PicobotI've got my eyes on some of these
projects!Eye'll bet !
Final projects
Final CS assignment
open-ended
comprehensive
Working solo or in a pair is OK
same projects for black/gold
Pairs need to work together - in the same place -
and they need to share the work equally...
three choices…
Eye, eye!
Big ideas:
(1) Implement Picobot in Python
(2) Train Python to write successful Picobot programs!
The Picobot project
talk about going full circle...
Picobot's classes
class Program:
0 xxxx -> N 0
0 Nxxx -> W 0
0 NxWx -> S 0
0 xxWx -> S 0
0 xxWS -> E 0
0 xxxS -> E 0
0 xExS -> N 0
0 xExx -> N 0
0 NExx -> S 1
1 xxxx -> S 1
1 Nxxx -> E 1
1 NxWx -> E 1
1 xxWx -> N 1
1 xxWS -> N 1
1 xxxS -> W 1
1 xExS -> W 1
1 xExx -> S 1
1 NExx -> W 0
What in Python could most
usefully hold all of these rules?
What type should self.rules be?
self.rules[ (1,"NExx") ] = ("W",0)
key value
Picobot's classes
class World:
What in Python could most
usefully hold the environment?
What type should self.room be?
++++++++++++++++++++++++++oooooPooooooooooooooooo++o o o++o o o++o o o++o o o++o o o++o o o++o o o++o o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++ooooooooooooooooooooooo++++++++++++++++++++++++++
+o
PPicobot:
Visited:
Wall:
Picobot's classes
class World:
What in Python could most
usefully hold the environment?
What type should self.room be?
++++++++++++++++++++++++++oooooPooooooooooooooooo++o o o++o o o++o o o++o o o++o o o++o o o++o o o++o o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++o o++ooooooooooooooooooooooo++++++++++++++++++++++++++
+o
PPicobot:
Visited:
Wall:
Current State: 1
Current Rule: 1 N*W* -> X 2
+++++++++++o++o+o++++oooooo ++++++o++ ++oooo+++++++++o ++oooo+++ +++++o++++++Pooo +++++++++++
The Picobot project
First build an
ASCII simulation
Picobot started here…
and is now here…
Program evolution
program p1
program p2
An example of genetic algorithms, used for
optimizing hard-to-describe functions.
Start with a population of, say, ~200
random Picobot programs…
Program evolution
program p1
fitness = 0.03
program p2
fitness = 0.05
An example of genetic algorithms, used for
optimizing hard-to-describe functions.
Then, evaluate the fitness
of all of those programs
Evaluate?
How??
program p1
fitness = 0.03
program p2
fitness = 0.05
mate + mutate the
fittest rulesets
to create a new generation
of ~200 programs…
program c1
fitness = 0.19
fitness = 0.90
Repeat this "survival of the fittest"
process for many generations…
… and by the end, your Python code
should have evolved a much more
capable Picobot program!
the TextID project
First paragraph of The Cuckoo's Calling by R. Galbraith
Though Robin Ellacott’s twenty-five years of life had seen their
moments of drama and incident, she had never before woken up in the certain knowledge that she
would remember the coming day for as long as she lived.
the TextID project
Big ideas:
(1) Build lexical models of bodies of text…
(2) Create a similarity score that defines Rowlingness
Shakepearity
NYTimes-iness
WSJournalicity
vs.
vs.
your own choice of
two comparisons…
Big Bang Theory?
Arrested Developmentvs.
TextID model class TextModel
word-frequencies
stem-frequencies
word-length-freq.'s /
all will be Python dictionaries…
WS: { "love": 50, "spell": 8, … }
JKR: { "love": 11, "spell": 277, … }
WS: { "lov": 612, "spell": 9, … }
JKR: { "lov": 98, "spell": 306, … }
WS: { 4: 7042, 5: 6203, … }
JKR: { 4: 980, 5: 42005, … }sentence-length-freq.'s
Processing steps: one idea
Split the text into words…
Clean the words …
Remove all non-alphabetic characters
Find sentence lengths using punctuation
Create dictionaries of the words and their lengths
Stem the words
Create a dictionary of word stems
You're ready to match against another model!
This looks
familiar...
Stemming
Or tries to output
the root!
stem( "party" ) "parti"
stem( "parties" ) "parti"
stem( "love" ) "lov"
stem( "loving" ) "lov"
An algorithm that outputs the
root of the input word.
these don't have to be
words, just stems…
Stemming
Or tries to output
the root!
stem( "party" ) "parti"
stem( "parties" ) "parti"
stem( "love" ) "lov"
stem( "loving" ) "lov"
An algorithm that outputs the
root of the input word.
these don't have to be
words, just stems…
Model matching
Suppose we have two dictionaries:
WS: { "love": 50,
"spell": 8,
"thou": 42 }
JKR: { "love": 25,
"spell": 275,
"potter": 700 }
"potter" is
not here.
"thou" is
not here.
How could we give a match score for this
New dictionary against each one above?
New: { "love": 3, "thou": 1,
"potter": 2, "spam": 4 }
Naïve Bayes classification
WS: { "love": 50,
"spell": 8,
"thou": 42 }
JKR: { "love": 25,
"spell": 275,
"potter": 700 }
"potter" is
not here.
"thou" is
not here.
New: { "love": 3, "thou": 1,
"potter": 2, "spam": 4 }
score vs. WS score vs. JKR
50
100
50
100
50
100
42
100
0
100
25
1000
25
1000
25
1000
0
1000
700
1000
score = 0 score = 0
Naïve Bayes classification
WS: { "love": 50,
"spell": 8,
"thou": 42 }
JKR: { "love": 25,
"spell": 275,
"potter": 700 }
"potter" is
not here.
"thou" is
not here.
New: { "love": 3, "thou": 1,
"potter": 2, "spam": 4 }
score vs. WS score vs. JKR
50
100
50
100
50
100
42
100
1
100
25
1000
25
1000
25
1000
1
1000
700
1000
score = 0.0525 score = 0.000011
3d graphics-based
game using VPythonvPool
Let's play!
I'll take your
cue...
A few constraints
• physically interacting "pool balls"
• allow the user to direct 1+ objects
• needs a game goal + be winnable!
not really very constrained at all!
• must detect some collisions and
model their results on the motion
The vPool project
Funky Physics is OK… !
Collisions with walls should be handled...
Collisions with other pool balls should be handled...
You need pockets – or some other game objective
A few examples to get you thinking…
VPython was designed to
make 3d physics simulations
simpler to program
So far, VPython has eventually worked for everyone...