<s> import numpy as np <EOL> import theano <EOL> import theano . tensor as T <EOL> def random_orthogonal ( dim , special = True ) : <EOL> if dim == <NUM_LIT:1> : <EOL> if np . random . uniform ( ) < <NUM_LIT:0.5> : <EOL> return np . ones ( ( <NUM_LIT:1> , <NUM_LIT:1> ) ) <EOL> return - np . ones ( ( <NUM_LIT:1> , <NUM_LIT:1> ) ) <EOL> P = np . random . randn ( dim , dim ) <EOL> while np . linalg . matrix_rank ( P ) != dim : <EOL> P = np . random . randn ( dim , dim ) <EOL> U , S , V = np . linalg . svd ( P ) <EOL> P = np . dot ( U , V ) <EOL> if special : <EOL> if np . linalg . det ( P ) < <NUM_LIT:0> : <EOL> P [ : , [ <NUM_LIT:0> , <NUM_LIT:1> ] ] = P [ : , [ <NUM_LIT:1> , <NUM_LIT:0> ] ] <EOL> return P <EOL> def log_gamma_lanczos ( z ) : <EOL> flip_z = <NUM_LIT:1> - z <EOL> flip_z = T . switch ( flip_z < <NUM_LIT:0> , <NUM_LIT:1> , flip_z ) <EOL> small = np . log ( np . pi ) - T . log ( T . sin ( np . pi * z ) ) - log_gamma_lanczos_sub ( flip_z ) <EOL> big = log_gamma_lanczos_sub ( z ) <EOL> return T . switch ( z < <NUM_LIT:0.5> , small , big ) <EOL> def log_gamma_lanczos_sub ( z ) : <EOL> g = <NUM_LIT:7> <EOL> p = np . array ( [ <NUM_LIT> , <NUM_LIT> , - <NUM_LIT> , <EOL> <NUM_LIT> , - <NUM_LIT> , <NUM_LIT> , <EOL> - <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] ) <EOL> z = z - <NUM_LIT:1> <EOL> x = p [ <NUM_LIT:0> ] <EOL> for i in range ( <NUM_LIT:1> , g + <NUM_LIT:2> ) : <EOL> x += p [ i ] / ( z + i ) <EOL> t = z + g + <NUM_LIT:0.5> <EOL> return np . log ( np . sqrt ( <NUM_LIT:2> * np . pi ) ) + ( z + <NUM_LIT:0.5> ) * T . log ( t ) - t + T . log ( x ) <EOL> '''<STR_LIT>''' <EOL> def lazytheanofunc ( on_unused_input = '<STR_LIT>' , mode = '<STR_LIT>' ) : <EOL> def theanofunction ( * args , ** kwargs ) : <EOL> f = [ None ] <EOL> if not kwargs . has_key ( '<STR_LIT>' ) : <EOL> kwargs [ '<STR_LIT>' ] = on_unused_input <EOL> if not kwargs . has_key ( '<STR_LIT>' ) : <EOL> kwargs [ '<STR_LIT>' ] = mode <EOL> def func ( * args2 , ** kwargs2 ) : <EOL> if f [ <NUM_LIT:0> ] == None : <EOL> f [ <NUM_LIT:0> ] = theano . function ( * args , ** kwargs ) <EOL> return f [ <NUM_LIT:0> ] ( * args2 , ** kwargs2 ) <EOL> return func <EOL> return theanofunction </s>
