annotate pylearn/dataset_ops/gldataset.py @ 1496:93b8373c6735

Prefix loggers with 'pylearn.' to ensure there is no conflict when using Pylearn code within another library
author Olivier Delalleau <delallea@iro>
date Mon, 22 Aug 2011 11:28:48 -0400
parents 912be602c3ac
children
rev   line source
832
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
1 """Demonstrate a complicated dynamically-generated dataset.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
2 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
3
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
4 # __init__.py
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
5
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
6 import sys, copy, logging, sys
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
7
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
8 import Image #PIL
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
9
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
10 from OpenGL.GL import *
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
11 from OpenGL.GLU import *
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
12 from OpenGL.GLUT import *
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
13 from pyglew import *
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
14
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
15 from glviewer import load_texture
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
16
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
17 import numpy
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
18
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
19 import theano
893
912be602c3ac fix import for the move of shared var outside of the sandbox.
Frederic Bastien <nouiz@nouiz.org>
parents: 832
diff changeset
20 from theano.compile import shared
912be602c3ac fix import for the move of shared var outside of the sandbox.
Frederic Bastien <nouiz@nouiz.org>
parents: 832
diff changeset
21 from theano.compile import pfunc as function
832
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
22
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
23 _logger = logging.getLogger('gldataset')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
24 def debug(*msg): _logger.debug(' '.join(str(m) for m in msg))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
25 def info(*msg): _logger.info(' '.join(str(m) for m in msg))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
26 def warn(*msg): _logger.warn(' '.join(str(m) for m in msg))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
27 def warning(*msg): _logger.warning(' '.join(str(m) for m in msg))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
28 def error(*msg): _logger.error(' '.join(str(m) for m in msg))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
29
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
30 def init_GL(shape=(64,64), title='Offscreen rendering using FB0'):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
31 if not init_GL.done:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
32 w, h = shape
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
33 init_GL.done = True
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
34 info('initializing OpenGl subsystem')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
35 glutInit (sys.argv)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
36 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
37 glutInitWindowSize (w,h)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
38 init_GL.window = glutCreateWindow (title)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
39 glewInit()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
40
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
41 glEnable(GL_TEXTURE_2D)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
42 glClearColor(0.0, 0.0, 0.0, 0.0) # This Will Clear The Background Color To Black
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
43 glClearDepth(1.0) # Enables Clearing Of The Depth Buffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
44 glDepthFunc(GL_LESS) # The Type Of Depth Test To Do
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
45 glEnable(GL_DEPTH_TEST) # Enables Depth Testing
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
46 glShadeModel(GL_SMOOTH) # Enables Smooth Color Shading
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
47
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
48 #glMatrixMode(GL_PROJECTION)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
49 #glLoadIdentity() # Reset The Projection Matrix
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
50 # Calculate The Aspect Ratio Of The Window
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
51 #gluPerspective(45.0, float(64)/float(64), 0.1, 100.0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
52 glMatrixMode(GL_MODELVIEW)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
53 init_GL.done = False
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
54
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
55 class PBufRenderer(object):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
56 """Render an OpenGL program to a framebuffer instead of the screen.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
57
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
58 The way to use this class is to enclose all the OpenGL commands you want to render between
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
59 a call to setup() and a call to render(). So you would render a frame like this:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
60
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
61 .. code-block:: python
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
62
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
63 p = PBufRenderer(shape)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
64 p.setup()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
65 my_display_code()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
66 a = p.render()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
67 my_display_code()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
68 b = p.render()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
69
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
70 After running this code, 'a' and 'b' will be numpy arrays of shape `shape` + (3,) containing an
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
71 RBG rendering of your display_code.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
72 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
73 def __init__(self, size=(128,128), upside_down=False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
74 """ Offscreen rendering
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
75
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
76 Save an offscreen rendering of size (w,h) to filename.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
77 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
78
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
79 def round2 (n):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
80 """ Get nearest power of two superior to n """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
81 f = 1
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
82 while f<n:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
83 f*= 2
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
84 return f
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
85
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
86 if size == None:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
87 size = (512,512)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
88 w = round2 (size[0])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
89 h = round2 (size[1])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
90
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
91 image = Image.new ("RGB", (w, h), (0, 0, 0))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
92 bits = image.tostring("raw", "RGBX", 0, -1)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
93
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
94 debug('allocating framebuffer')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
95 framebuffer = glGenFramebuffersEXT (1)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
96 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
97
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
98 debug('allocating depthbuffer')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
99 depthbuffer = glGenRenderbuffersEXT (1)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
100 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT,depthbuffer)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
101 glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
102
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
103 # Create texture to render to
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
104 debug('allocating dynamic texture')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
105 texture = glGenTextures (1)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
106 glBindTexture (GL_TEXTURE_2D, texture)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
107 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
108 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
109 # Question: why do we need to upload a texture that we are rendering *to* ?
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
110 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
111 GL_RGB, GL_UNSIGNED_BYTE, bits)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
112
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
113 # store variables for later use.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
114 self.texture = texture
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
115 self.framebuffer = framebuffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
116 self.depthbuffer = depthbuffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
117 self.image = image
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
118 self.bits = bits
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
119 self.size = size
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
120 self.texture_size = (w,h)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
121 self.upside_down = upside_down
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
122
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
123 # set the screen as output
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
124 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
125 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
126
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
127 def __del__(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
128 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
129 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
130 glDeleteTextures (1,[self.texture])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
131 glDeleteFramebuffersEXT (1, [self.framebuffer])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
132 glDeleteRenderbuffersExt (1, [self.depthbuffer])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
133
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
134 def setup(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
135 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, self.depthbuffer)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
136 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.framebuffer)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
137 glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
138 GL_TEXTURE_2D, self.texture, 0);
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
139 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
140 GL_RENDERBUFFER_EXT, self.depthbuffer);
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
141
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
142 status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
143 if status != GL_FRAMEBUFFER_COMPLETE_EXT:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
144 raise RuntimeError( "Error in framebuffer activation")
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
145
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
146 # Re-orient viewport
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
147 glViewport (0, 0, self.size[0], self.size[1])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
148 glMatrixMode (GL_PROJECTION)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
149 glLoadIdentity()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
150 gluPerspective (40.,self.size[0]/float(self.size[1]),1.,40.)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
151 glMatrixMode (GL_MODELVIEW)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
152 glLoadIdentity()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
153 gluLookAt (0,0,10, 0,0,0, 0,1,0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
154
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
155 def render(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
156 # TODO: Can we get away with glFlush?
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
157 glFinish() #renders to our framebuffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
158
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
159 # read back the framebuffer to self.image
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
160 glBindTexture (GL_TEXTURE_2D, self.texture)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
161 w,h = self.texture_size
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
162 data = glReadPixels (0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
163 rval = numpy.fromstring(data, dtype='uint8', count=w*h*3).reshape((w,h,3))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
164 if self.size != self.texture_size:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
165 rval = rval[:self.size[0], :self.size[1],:]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
166
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
167 # return to default state of screen rendering
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
168 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
169 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
170 if self.upside_down:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
171 return rval
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
172 else:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
173 return rval[::-1,:,:]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
174
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
175 class OpenGlMovieFromImage(theano.Op):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
176 """Helper base class to factor code used by Ops that want to make a movie from an input
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
177 image, using OpenGL. The subclass specifies how to actually make the movie.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
178 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
179
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
180 def __init__(self, width, height, upside_down=False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
181 """To set up the renderer, we need to know the frame size of the images.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
182 Setting up the renderer for each image is much slower.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
183 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
184 init_GL() #global initialization is no-op after first call
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
185 self.width=width
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
186 self.height=height
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
187 self.upside_down=upside_down
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
188
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
189 self.renderer = None
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
190 # Delay construction of renderer until after merge-optimization
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
191 #PBufRenderer((width, height), upside_down=upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
192
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
193 #TODO: put texture into output state as reusable resource
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
194 self.texture = glGenTextures(1)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
195
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
196 def __del__(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
197 glDeleteTextures (1,[self.texture])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
198
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
199 def __eq__(self, other):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
200 return type(self) == type(other) \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
201 and self.width == other.width \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
202 and self.height == other.height \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
203 and self.upside_down == other.upside_down
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
204
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
205 def __hash__(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
206 return hash(type(self)) ^ hash(self.width) ^ hash(self.height) ^ hash(self.upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
207
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
208 def make_node(self, x, istate):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
209 _x = theano.tensor.as_tensor_variable(x)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
210 if _x.type.dtype != 'uint8':
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
211 raise TypeError('must be 2- or 3-tensor of uint8', x)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
212 if _x.type.broadcastable != (False, False) \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
213 and _x.type.broadcastable != (False, False, False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
214 raise TypeError('must be a 2- or 3-tensor of uint8', x)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
215 if not isinstance(istate, theano.Variable):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
216 raise TypeError("variable expected", istate)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
217 o_type = theano.tensor.TensorType(dtype='uint8', broadcastable=[False, False, False, False])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
218 state_type = theano.gof.type.generic
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
219 return theano.Apply(self, [x, istate], [o_type(), state_type()])
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
220
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
221 def perform(self, node, (x, istate), (z_storage, ostate_storage)):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
222 if self.renderer is None:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
223 self.renderer = PBufRenderer((self.width, self.height), upside_down=self.upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
224
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
225 ostate = copy.deepcopy(istate)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
226 self.renderer.setup()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
227
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
228 glBindTexture(GL_TEXTURE_2D, self.texture) # 2d texture (x and y size)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
229 load_texture(x)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
230
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
231 z = numpy.zeros(self.z_shape, dtype='uint8')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
232 for i in xrange(self.n_frames):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
233 self.perform_set_state(istate, ostate, i)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
234 self.perform_display(x, ostate, i)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
235 di = self.renderer.render()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
236 z[i] = di
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
237
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
238 # store output images
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
239 z_storage[0] = z
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
240
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
241 # store next state ostate_storage
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
242 ostate_storage[0] = ostate
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
243
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
244 class ImageOnSpinningCube(OpenGlMovieFromImage):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
245 def __init__(self, (n_frames, width, height), upside_down=False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
246 super(ImageOnSpinningCube, self).__init__(width, height, upside_down=upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
247 self.n_frames = n_frames
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
248 self.z_shape = (n_frames, width, height, 3)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
249
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
250 def __eq__(self, other):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
251 return super(ImageOnSpinningCube, self).__eq__(other) \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
252 and self.n_frames == other.n_frames \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
253
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
254 def __hash__(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
255 return super(ImageOnSpinningCube, self).__hash__() ^ hash(self.n_frames)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
256
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
257 def new_state(self, speed=10):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
258 return dict(
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
259 rot=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
260 drot=numpy.asarray((speed,speed,speed)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
261 )
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
262
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
263 def perform_set_state(self, istate, ostate, iter):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
264 ostate['rot'] = istate['rot'] + istate['drot'] * iter
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
265
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
266 def perform_display(self, x, ostate, i):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
267 # retrieve some state variables related to rendering
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
268 xrot,yrot,zrot = ostate['rot']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
269 dxrot,dyrot,dzrot = ostate['drot']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
270
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
271 # load x as a texture
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
272 glBindTexture(GL_TEXTURE_2D, self.texture) # 2d texture (x and y size)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
273 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
274 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
275 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
276 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
277 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
278 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
279 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
280
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
281 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # Clear The Screen And The Depth Buffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
282 glLoadIdentity() # Reset The View
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
283 glTranslatef(0.0,0.0,-5.0) # Move Into The Screen
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
284
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
285 glRotatef(xrot,1.0,0.0,0.0) # Rotate The Cube On It's X Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
286 glRotatef(yrot,0.0,1.0,0.0) # Rotate The Cube On It's Y Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
287 glRotatef(zrot,0.0,0.0,1.0) # Rotate The Cube On It's Z Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
288
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
289 glBegin(GL_QUADS) # Start Drawing The Cube
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
290
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
291 # Front Face (note that the texture's corners have to match the quad's corners)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
292 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
293 glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
294 glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
295 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
296
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
297 # Back Face
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
298 glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
299 glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
300 glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
301 glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
302
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
303 # Top Face
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
304 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
305 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
306 glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
307 glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
308
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
309 # Bottom Face
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
310 glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
311 glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
312 glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
313 glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
314
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
315 # Right face
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
316 glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
317 glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
318 glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
319 glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
320
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
321 # Left Face
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
322 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
323 glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
324 glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
325 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
326
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
327 glEnd(); # Done Drawing The Cube
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
328
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
329 def image_on_spinning_cube(x, shape, upside_down=False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
330 op = ImageOnSpinningCube(shape, upside_down=upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
331 istate = shared(op.new_state())
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
332 z, ostate = op(x, istate)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
333 return z, {istate: ostate}
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
334
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
335 class BrownianCamera(OpenGlMovieFromImage):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
336 def __init__(self, (n_frames, width, height), upside_down=False):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
337 super(BrownianCamera, self).__init__(width, height, upside_down=upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
338 self.n_frames = n_frames
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
339 self.z_shape = (n_frames, width, height, 3)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
340
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
341 def __eq__(self, other):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
342 return super(self.__class__, self).__eq__(other) \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
343 and self.n_frames == other.n_frames \
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
344
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
345 def __hash__(self):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
346 return super(self.__class__, self).__hash__() ^ hash(self.n_frames)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
347
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
348 def new_state(self, pos_jitter=(.01,.01,.03), rot_jitter=(4.,4.,4.), seed=23424):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
349 return dict(
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
350 pos_jitter=numpy.asarray(pos_jitter),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
351 rot_jitter=numpy.asarray(rot_jitter),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
352 pos0=numpy.asarray((0.,0.,-4.0)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
353 rot0=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
354 alpha=0.1,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
355 # dynamic things
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
356 pos=numpy.asarray((0.,0.,-4.0)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
357 dpos=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
358 ddpos=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
359 rot=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
360 drot=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
361 ddrot=numpy.asarray((0.,0.,0.)),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
362 rng = numpy.random.RandomState(seed),
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
363 )
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
364
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
365 def perform_set_state(self, istate, ostate, iter):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
366 alpha = ostate['alpha']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
367 if iter == 0:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
368 ostate['pos'] = ostate['pos0'].copy()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
369 ostate['dpos'] *= 0
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
370 ostate['rot'] = ostate['rot0'].copy()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
371 ostate['drot'] *= 0
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
372 ostate['ddpos'] = ostate['rng'].uniform(low=-1,high=1,size=3) * ostate['pos_jitter']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
373 ostate['ddrot'] = ostate['rng'].uniform(low=-1,high=1,size=3) * ostate['rot_jitter']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
374 ostate['dpos'] += ostate['ddpos']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
375 ostate['drot'] += ostate['ddrot']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
376 ostate['pos'] = (1-alpha)*(ostate['pos'] + ostate['dpos']) + alpha * ostate['pos0']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
377 ostate['rot'] = (1-alpha)*(ostate['rot'] + ostate['drot']) + alpha * ostate['rot0']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
378
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
379 def perform_display(self, x, ostate, i):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
380 # retrieve some state variables related to rendering
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
381 xrot,yrot,zrot = ostate['rot']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
382 xpos,ypos,zpos = ostate['pos']
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
383
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
384 # load x as a texture
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
385 glBindTexture(GL_TEXTURE_2D, self.texture) # 2d texture (x and y size)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
386 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
387 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
388 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
389 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
390 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
391 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
392 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
393
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
394 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # Clear The Screen And The Depth Buffer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
395 glLoadIdentity() # Reset The View
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
396 glTranslatef(xpos,ypos,zpos) # Move Into The Screen
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
397
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
398 glRotatef(xrot,1.0,0.0,0.0) # Rotate The Cube On It's X Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
399 glRotatef(yrot,0.0,1.0,0.0) # Rotate The Cube On It's Y Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
400 glRotatef(zrot,0.0,0.0,1.0) # Rotate The Cube On It's Z Axis
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
401
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
402 glBegin(GL_QUADS) # Start Drawing The Cube
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
403
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
404 # Front Face (note that the texture's corners have to match the quad's corners)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
405 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
406 glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
407 glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # Top Right Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
408 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # Top Left Of The Texture and Quad
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
409
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
410 glEnd(); # Done Drawing The Cube
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
411
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
412 _brownian_camera_ops = {}
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
413 def brownian_camera(x, shape, upside_down=False, seed=8234, speed=1.0):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
414 if (shape, upside_down) not in _brownian_camera_ops:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
415 _brownian_camera_ops[(shape, upside_down)] = BrownianCamera(shape, upside_down=upside_down)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
416 op = _brownian_camera_ops[(shape, upside_down)]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
417 istate = shared(op.new_state(seed=seed))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
418 istate.value['pos_jitter'] *= speed
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
419 istate.value['rot_jitter'] *= speed
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
420 z, ostate = op(x, istate)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
421 return z, [(istate, ostate)]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
422
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
423
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
424 def _dump_to_file(fn, filename='out.pkl', nexamples=1000, n_frames=10, **kwargs):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
425 logging.basicConfig(level=logging.INFO, stream=sys.stderr)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
426 import cPickle, time
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
427
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
428 from MNIST import mnist
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
429 i = theano.tensor.iscalar()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
430 z, z_updates = fn(mnist(i%50000, 'train', rasterized=False, dtype='uint8')[0], (n_frames, 28,28), **kwargs)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
431 f = function([i], z[:,:,:,0], updates=z_updates)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
432
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
433 t0 = time.time()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
434 rval = []
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
435 for j in xrange(nexamples):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
436 if 0 == j % 100: print >> sys.stderr, j
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
437 rval.append(f(j))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
438 dt = time.time() - t0
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
439 info('Generating ', nexamples, 'examples took', dt, 'seconds.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
440 info('Generation rate:', nexamples/dt, 'examples per second.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
441 info('Generated ', nexamples*n_frames, 'frames')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
442 info('Generation rate:', nexamples*n_frames/dt, 'frames per second.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
443
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
444 cPickle.dump(rval, file(filename, 'w'), protocol=cPickle.HIGHEST_PROTOCOL)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
445 def spinning_cube_dump(filename='spinning_cube.pkl', *args, **kwargs):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
446 return _dump_to_file(fn=image_on_spinning_cube, filename=filename, *args, **kwargs)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
447 def brownian_camera_dump(filename='brownian_camera.pkl', *args, **kwargs):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
448 return _dump_to_file(fn=brownian_camera, filename=filename, *args, **kwargs)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
449 def brownian_camera_dumpN(filename='brownian_cameraN.pkl', nexamples=10, n_frames=5,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
450 n_movies=10, img_shape=(28,28), **kwargs):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
451 logging.basicConfig(level=logging.INFO, stream=sys.stderr)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
452 import cPickle, time
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
453 from MNIST import mnist
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
454
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
455 s_idx = theano.tensor.iscalar()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
456 inputs_updates = [brownian_camera(
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
457 x=mnist(s_idx*n_movies+i, 'train', rasterized=False, dtype='uint8')[0],
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
458 shape=(n_frames,)+img_shape,
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
459 seed=234234+i, **kwargs)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
460 for i in xrange(n_movies)]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
461 s_input = theano.tensor.stack(*(input for (input,update) in inputs_updates))\
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
462 .reshape((n_movies*n_frames,)+img_shape+(3,))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
463 s_updates = []
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
464 for i,u in inputs_updates:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
465 s_updates.extend(u)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
466 print s_updates
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
467 f = function([s_idx], s_input, updates=s_updates)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
468
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
469 t0 = time.time()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
470 rval = []
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
471 for j in xrange(nexamples):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
472 if 0 == j % 1000: print >> sys.stderr, j
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
473 rval.append(f(j))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
474 dt = time.time() - t0
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
475 info('Generating ', nexamples, 'examples took', dt, 'seconds.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
476 info('Generation rate:', nexamples/dt, 'examples per second.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
477 info('Generated ', nexamples*n_movies*n_frames, 'frames')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
478 info('Generation rate:', nexamples*n_movies*n_frames/dt, 'frames per second.')
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
479
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
480 cPickle.dump(rval, file(filename, 'w'))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
481
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
482
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
483 def glviewer_from_file(filename='out.pkl'):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
484 logging.basicConfig(level=logging.DEBUG, stream=sys.stderr)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
485 import cPickle
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
486 rval = cPickle.load(file(filename))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
487 from glviewer import GlViewer
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
488 GlViewer(rval.__getitem__).main()
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
489
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
490