summaryrefslogtreecommitdiff
path: root/NetGen/layerobj.py
blob: 3cfadf086776aef5dfb53805b3a78c8902ad4310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
'''
Created on Mar 16, 2014

@author: joe
'''

import random
import mathobj

matRandFnc=lambda :3*random.gauss(0.0,1.0)
vecRandFnc=lambda :random.random()/5.0-4.1

class SharedLinearity:
    def __init__(self,nIn=1,nOut=1,inS=True,
                 matRand=matRandFnc,vecRand=vecRandFnc):
        self.nInputs=nIn
        self.nOutputs=nOut
        self.inScale=inS
        self.matRand=matRand
        self.vecRand=vecRand
        
    def flush(self):
        print "<biasedlinearity>", self.nOutputs, self.nInputs
        mathobj.randomFnc=self.matRand
        mathobj.inputScale=self.inScale
        mathobj.PrintTransMatrix(self.nInputs, self.nOutputs)
        mathobj.randomFnc=self.vecRand
        mathobj.PrintVector(self.nOutputs)

class Linearity:
    def __init__(self,nIn=1,nOut=1,inS=True,
                 matRand=matRandFnc):
        self.nInputs=nIn
        self.nOutputs=nOut
        self.inScale=inS
        self.matRand=matRand
        
    def flush(self):
        print "<linearity>", self.nOutputs, self.nInputs
        mathobj.randomFnc=self.matRand
        mathobj.inputScale=self.inScale
        mathobj.PrintTransMatrix(self.nInputs, self.nOutputs)

class UpdatableBias:        
    def __init__(self,nIn=1,vecRand=vecRandFnc):
        self.nInputs=nIn
        self.nOutputs=nIn
        self.vecRand=vecRand
        
    def flush(self):
        print "<updatablebias>", self.nOutputs, self.nInputs
        mathobj.randomFnc=self.vecRand
        mathobj.PrintVector(self.nInputs)

class MiscPipe:
    def __init__(self,nIn=1,name="<pipe>"):
        self.nInputs=nIn
        self.nOutputs=nIn
        self.name=name
    
    def flush(self):
        print self.name, self.nOutputs, self.nInputs

class Distrib:
    def __init__(self,nIn=1,size=1):
        self.nInputs=nIn
        self.nOutputs=nIn
        self.size=size
    
    def flush(self):
        print "<distrib>", self.nOutputs, self.nInputs
        print self.size

class Combine:
    def __init__(self,nIn=1,size=1):
        self.nInputs=nIn
        self.nOutputs=nIn
        self.size=size
    
    def flush(self):
        print "<combine>", self.nOutputs, self.nInputs
        print self.size

class Divide:
    def __init__(self,nIn=1,divLen=[]):
        self.nInputs=nIn
        self.nOutputs=divLen[0]
        self.divLen=divLen
    
    def push(self,nxtLen):
        self.divLen+=[nxtLen];
    
    def flush(self):
        print "<divide>", self.nOutputs, self.nInputs
        print len(self.divLen),
        for Len in self.divLen:
            print Len,
        print

class Merge:
    def __init__(self,nOut=1,divLen=[]):
        self.nOutputs=nOut
        self.nInputs=divLen[0]
        self.divLen=divLen
    
    def push(self,nxtLen):
        self.divLen+=[nxtLen];
    
    def flush(self):
        print "<merge>", self.nOutputs, self.nInputs
        print len(self.divLen),
        for Len in self.divLen:
            print Len,
        print

class Reorder:
    def __init__(self,nIn=1,Order=[]):
        self.nInputs=nIn
        self.nOutputs=nIn
        self.Order=Order
    
    def push(self,nxtPos):
        self.Order+=[nxtPos];
    
    def flush(self):
        print "<reorder>", self.nOutputs, self.nInputs
        print len(self.Order),
        for Len in self.Order:
            print Len,
        print
        
class Compound:
    def __init__(self,nIn=1,nOut=1,Objs=[]):
        self.nInputs=nIn
        self.nOutputs=nOut
        self.Objs=Objs
    
    def push(self,nxtObj):
        self.Objs+=[nxtObj];
    
    def flush(self):
        print "<compound>", self.nOutputs, self.nInputs
        for Obj in self.Objs:
            Obj.flush()
        print "<endblock>"

class Discrete:
    def __init__(self,nIn=1,nOut=1,Objs=[]):
        self.nInputs=nIn
        self.nOutputs=nOut
        self.Objs=Objs
    
    def push(self,nxtObj):
        self.Objs+=[nxtObj];
    
    def flush(self):
        print "<discrete>", self.nOutputs, self.nInputs
        for Obj in self.Objs:
            Obj.flush()
        print "<endblock>"