-
Notifications
You must be signed in to change notification settings - Fork 0
/
picknode.m
101 lines (73 loc) · 2.46 KB
/
picknode.m
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
function [position]=picknode(expr,node_type,gp)
%PICKNODE Randomly select a node of specified type from a GPTIPS encoded
%prefix expression and return its position in the expression.
%
% [POSITION]=PICKNODE(EXPR,NODE_TYPE,GP) returns the POSITION where
% EXPR is the symbolic expression, NODE_TYPE is the specified node type
% and GP is the GPTIPS data structure.
%
% Remarks:
% For NODE_TYPEs 1 to 4 this function returns the string POSITION of the
% node or -1 if no appropriate node can be found. If NODE_TYPE is 5 or 6
% then POSITION is a vector of sorted node indices.
%
% Set NODE_TYPE argument as follows:
% 0 = any node
% 3 = constant (ERC) selection only
% 4 = input selection only
% 5 = indices of nodes with a builtin MATLAB infix representation,
% sorted left to right
% 6 = indices of all nodes, sorted left to right
%
% (c) Dominic Searson 2009
%
% v1.0
%
% See also EXTRACT
%mask some symbols that would screw stuff up
if gp.nodes.const.use_matlab_format
expr=strrep(expr,'e+','##'); %standard form
expr=strrep(expr,'e-','##'); %standard form
end
x=strrep(expr,'[-','[#'); %negative constants
ind=[];
temp_ind=[];
if node_type==0 || node_type==6 %pick any node
%get indices of function and input locations
temp_ind=find(double(x)<=122 & double(x)>=97);
%add indices of constant locations
ind=[temp_ind findstr(x,'[')];
if node_type==6
position=sort(ind);
return
end
elseif node_type==3 %just constants
ind=findstr(x,'[');
elseif node_type==4 %just inputs
ind=findstr(x,'x');
elseif node_type==5 %special option, only selects plus, minus, times,rdivide,power (intended for offline use)
idcount=0;
for i=1:length(gp.nodes.functions.name)
if gp.nodes.functions.active(i)
idcount=idcount+1;
func=gp.nodes.functions.name{i};
if strcmpi(func,'times') || strcmpi(func,'plus') || strcmpi(func,'minus') || strcmpi(func,'rdivide') || strcmpi(func,'power')
id=gp.nodes.functions.afid(idcount);
%look for id in string and concatenate to indices vector
ind=[ind findstr(x,id)];
end
end
end
position=sort(ind);
return
end
%count legal nodes
num_nodes=length(ind);
%if none legal, return -1
if ~num_nodes
position=-1;
else
%select a random node from those indexed
fun_choice=ceil(rand*num_nodes);
position=ind(fun_choice);
end