2
some basic language objects
3
if you don't specify a node_type for these, it is usually a good idea to
4
not allow crossovers at these nodes. That would allow two (maybe different)
5
list_range nodes to exchange places.
14
class opt_object(tree.tree_node,weakdict.WeakValue):
15
opt_dict = weakdict.WeakDict()
16
def __init__(self,node_type, sub_nodes):
17
tree.tree_node.__init__(self,sub_nodes,node_type=node_type)
18
weakdict.WeakValue.__init__(self)
19
opt_object.opt_dict[id(self)] = self
20
def _create(self,parent = None):
21
new = tree.tree_node._create(self,parent)
22
weakdict.WeakValue.__init__(new)
23
self._WeakValue__cid = None #force a reset of the __cid value
24
weakdict.WeakValue.__init__(new) #now get a new value for it
25
opt_object.opt_dict[id(new)] = new
28
tree.tree_node.__del__(self)
29
weakdict.WeakValue.__del__(self)
32
class opt_object(tree.tree_node):
33
def __init__(self,node_type, sub_nodes):
34
tree.tree_node.__init__(self,sub_nodes,node_type=node_type)
36
class float_range(gene.float_gene,opt_object):
38
def __init__(self,bounds,node_type='float_range', sub_nodes = 0):
39
opt_object.__init__(self,node_type,sub_nodes)
40
gene.float_gene.__init__(self,bounds[:2])
41
tree.tree_node.__init__(self,sub_nodes,node_type=node_type)
42
if(len(bounds) == 3): self.default = bounds[2]
43
else: self.default = (bounds[0] + bounds[1])/2.
44
self._value = self.default
46
def clone(self,parent = None):return tree.tree_node.clone(self,parent)
49
m = gene.float_gene.mutate(self)
50
if(m and self.parent): self.parent.recalc(force_parent=1)
54
self.bounds = (self.bounds[0]*sc,self.bounds[1]*sc)
55
self.default = self.default*sc
56
self._value = self._value*sc
58
self._value = self.default
59
for child in self._children: child.defaultize()
60
def create(self,parent):
61
new = tree.tree_node.create(self,parent)
63
gene.float_gene.initialize(new)
66
# gene.float_gene.__del__(self)
67
opt_object.__del__(self)
71
if( val < .01 or val > 1000): v = "%4.3e" % self.value()
72
else: v = "%4.3f" % self.value()
73
except gene.GAError: v = 'not initialized'
74
self.label = '%s = %s' % (self.node_type, v)
75
return tree.tree_node.__repr__(self)
77
class log_float_range(gene.log_float_gene,opt_object):
79
def __init__(self,bounds,node_type='log_float_range', sub_nodes = 0):
80
gene.log_float_gene.__init__(self,bounds[:2])
81
opt_object.__init__(self,node_type,sub_nodes)
82
if(len(bounds) == 3): self.default = bounds[2]
83
else: self.default = (bounds[0] + bounds[1])/2.
84
self._value = math.log10(self.default)
85
def clone(self,parent = None):return tree.tree_node.clone(self,parent)
88
m=gene.log_float_gene.mutate(self)
89
if(m and self.parent): self.parent.recalc(force_parent=1)
93
self.default = self.default*sc
95
self.bounds = (self.bounds[0]*sc,self.bounds[1]*sc)
96
self._value = self._value*sc
98
self._value = self.default
99
for child in self._children: child.defaultize()
100
def create(self,parent):
101
new = tree.tree_node.create(self,parent)
103
gene.log_float_gene.initialize(new)
106
# gene.log_float_gene.__del__(self)
107
opt_object.__del__(self)
111
if( val < .01 or val > 1000): v = "%4.3e" % self.value()
112
else: v = "%4.3f" % self.value()
113
except gene.GAError: v = 'not initialized'
114
self.label = '%s = %s' % (self.node_type, v)
115
return tree.tree_node.__repr__(self)
117
class list_range(gene.list_gene,opt_object):
119
def __init__(self,allele_set,node_type='list_range', default=None, sub_nodes = 0):
120
gene.list_gene.__init__(self,allele_set)
121
opt_object.__init__(self,node_type,sub_nodes)
122
gene.list_gene.initialize(self) # prevents trouble in tree generation
123
if(default): self.default = default
124
else: self.default = allele_set[int(len(allele_set)/2.)] #the center item
125
self._value = self.default
128
m=gene.list_gene.mutate(self)
129
if(m and self.parent): self.parent.recalc(force_parent=1)
132
def clone(self,parent = None):return tree.tree_node.clone(self,parent)
134
for i in range(len(self.allele_set)):
135
self.allele_set[i] = self.allele_set[i] *sc
136
self.default = self.default*sc
137
self._value = self._value*sc
138
def defaultize(self):
139
self._value = self.default
140
for child in self._children: child.defaultize()
141
def create(self,parent):
142
new = tree.tree_node.create(self,parent)
144
gene.list_gene.initialize(new)
147
# gene.list_gene.__del__(self)
148
opt_object.__del__(self)
150
self.label = '%s = %s' % (self.node_type, self.value())
151
return tree.tree_node.__repr__(self)
153
class val(gene.frozen,opt_object):
155
def __init__(self,val,node_type='val',sub_nodes=0):
156
gene.frozen.__init__(self,val)
157
opt_object.__init__(self,node_type,sub_nodes)
158
def clone(self,parent = None):return tree.tree_node.clone(self,parent)
159
def scale(self,sc): self._value = self._value*sc
160
def defaultize(self): pass
161
def create(self,parent):
162
new = tree.tree_node.create(self,parent)
166
# gene.frozen.__del__(self)
167
opt_object.__del__(self)
169
self.label = '%s = %s' % (self.node_type, self.value())
170
return tree.tree_node.__repr__(self)
174
These two routines are useful for picking off or replacing the nodes in a
175
tree that should be that should be numerically optimized. They are helpful if
176
your interested in using a gradient method to optimize some of the paramters
180
def pick_numbers(node):
181
start = []; lower = []; upper =[];
182
for child in node.children():
183
s, l, u = pick_numbers(child)
187
#for now only works with float_genes
188
if hasattr(node,'optimize') and node.optimize == 1:
195
print 'no opt:', node.__class__
196
return start, lower, upper
198
def put_numbers(node,vals, index = 0):
199
for child in node.children():
200
index = put_numbers(child,vals,index)
201
if hasattr(node,'optimize') and node.optimize == 1:
202
s = node._value = vals[index]
207
Grab the numerical nodes that need to be optimized so that you can directly
210
def pick_optimize_nodes(node):
212
for child in node.children():
213
nodes = nodes + pick_optimize_nodes(child)
214
#for now only works with float_genes
215
if hasattr(node,'optimize') and node.optimize == 1:
216
nodes = nodes + [node]
b'\\ No newline at end of file'