1 | // This file is a part of Framsticks SDK. http://www.framsticks.com/ |
---|
2 | // Copyright (C) 1999-2018 Maciej Komosinski and Szymon Ulatowski. |
---|
3 | // See LICENSE.txt for details. |
---|
4 | |
---|
5 | #ifndef _FH_OPER_H_ |
---|
6 | #define _FH_OPER_H_ |
---|
7 | |
---|
8 | #include "../genooperators.h" |
---|
9 | #include "fH_general.h" |
---|
10 | |
---|
11 | /** @name Codes for general fH mutation types */ |
---|
12 | //@{ |
---|
13 | #define FH_ADD 0 ///<Adding new handle |
---|
14 | #define FH_HANDLE 1 ///<Modifying vectors of handles |
---|
15 | #define FH_PROP 2 ///<Modifying properties of sticks/neurons/connections |
---|
16 | #define FH_DEL 3 ///<Deleting single handle from genotype. WARNING! this type of mutation must be last in defines, because later during mutation this method may be skipped due to the lack of genotypes to remove |
---|
17 | #define FH_OPCOUNT 4 ///<Count of mutation types |
---|
18 | //@} |
---|
19 | |
---|
20 | /** @name Codes for specific FH_ADD mutation subtypes */ |
---|
21 | //@{ |
---|
22 | #define FH_ADD_STICK 0 ///<Adding stick |
---|
23 | #define FH_ADD_NEURO 1 ///<Adding neuron |
---|
24 | #define FH_ADD_CONN 2 ///<Adding connection |
---|
25 | #define FH_ADD_OPCOUNT 3 ///<Count of addition types |
---|
26 | //@} |
---|
27 | |
---|
28 | class Geno_fH : public GenoOperators |
---|
29 | { |
---|
30 | private: |
---|
31 | /** |
---|
32 | * Mutates vectors and/or properties of a given handle. |
---|
33 | * Properties and vector values are set with mutateCreep method, with respect to their |
---|
34 | * minimal, maximal and default values. Only weights of connections are mutated |
---|
35 | * with mutateNeuProperty. |
---|
36 | * @param handle handle that has to be modified |
---|
37 | * @param tab ParamTab holding definitions of properties of a given handle |
---|
38 | * @param dimensions number of values stored in each vector of handle |
---|
39 | * @param changedimensions true if values of vectors should be changed, false otherwise |
---|
40 | * @param changeproperties true if values of properties should be changed, false otherwise |
---|
41 | */ |
---|
42 | void mutateHandleValues(fH_Handle *handle, ParamEntry *tab, int dimensions, bool changedimensions, bool changeproperties); |
---|
43 | |
---|
44 | /** |
---|
45 | * Creates new handle with random vectors and one mutated property. Vector values are |
---|
46 | * set to values from [-1,1] - probabilities of each values are evenly distributed. |
---|
47 | * It also creates required obj for handle and initializes it with default |
---|
48 | * values. |
---|
49 | * @param handle the handle for which obj is created and mutation is performed |
---|
50 | * @param tab the corresponding ParamTab for handle |
---|
51 | * @param dimensions number of values in vectors |
---|
52 | */ |
---|
53 | void createHandleVectors(fH_Handle *handle, ParamEntry *tab, int dimensions); |
---|
54 | |
---|
55 | /** |
---|
56 | * Mutates "details" property of neurons. First it tries to parse neuron class |
---|
57 | * given in "details" field. It it fails, or "userandomclass" parameter is set |
---|
58 | * to true, then new available class is picked (or "N", if there are no |
---|
59 | * available classes). When neuron class is established, method iterates through |
---|
60 | * neuron properties and mutates them with mutateNeuProperty method. |
---|
61 | * @param handle handle that has to be modified |
---|
62 | * @param tab ParamTab holding definitions of properties of a given handle |
---|
63 | * @param userandomclass true if method should find random class, false if current class or "N" should be used |
---|
64 | */ |
---|
65 | void mutateNeuronHandleProperties(fH_NeuronHandle *handle, ParamEntry *tab, bool userandomclass = false); |
---|
66 | |
---|
67 | /** |
---|
68 | * Mutates single double property in par, accessed by id. If property is weight |
---|
69 | * of connection, then it is mutated with mutateNeuProperty. |
---|
70 | * @param id numerical id of property in Param |
---|
71 | * @param par Param with properties to modify |
---|
72 | * @param type used to determine if property is weight of connection |
---|
73 | */ |
---|
74 | void changeDoubleProperty(int id, Param &par, fHBodyType type); |
---|
75 | |
---|
76 | /** |
---|
77 | * Gets random handle and corresponding ParamTab from a given body. Both pointers |
---|
78 | * are returned in parameters "handle" and "tab" respectively. Parameter |
---|
79 | * "skipalonestick" should be set if method selects handle for deleting (valid |
---|
80 | * body should have at least one stick). |
---|
81 | * @param creature Builder object with parsed genotype, from which random handle is selected |
---|
82 | * @param handle reference to pointer pointing to selected handle |
---|
83 | * @param tab reference to pointer pointing to corresponding ParamTab |
---|
84 | * @param skipalonestick true if method should skip only stick during random selection of handles, false if method should randomly choose handle from all available handles |
---|
85 | * @return position of handle pointer in vector of handles of same type in Builder (if selected handle is of STICK type, then returned value is its position in "sticks" vector of Builder) |
---|
86 | */ |
---|
87 | unsigned int getRandomHandle(fH_Builder *creature, fH_Handle *&handle, ParamEntry *&tab, bool skipalonestick = false); |
---|
88 | |
---|
89 | public: |
---|
90 | double operations[FH_OPCOUNT]; ///<relative probabilities of selecting mutation types in fH genotype |
---|
91 | double addoperations[FH_ADD_OPCOUNT]; ///<relative probabilities of selecting mutation addition subtypes |
---|
92 | |
---|
93 | // TODO add to GenoOperators? |
---|
94 | /** |
---|
95 | * Mutates properties of neuron and returns full neuron class description. |
---|
96 | * @param det current neuron class definition with its parameters |
---|
97 | */ |
---|
98 | static void mutateNeuronProperties(SString &det); |
---|
99 | |
---|
100 | Geno_fH(); |
---|
101 | |
---|
102 | int checkValidity(const char *geno, const char *genoname); |
---|
103 | |
---|
104 | int validate(char *&geno, const char *genoname); |
---|
105 | |
---|
106 | int mutate(char *&geno, float& chg, int &method); |
---|
107 | |
---|
108 | int crossOver(char *&g1, char *&g2, float& chg1, float& chg2); |
---|
109 | |
---|
110 | virtual const char* getSimplest() { return "3\nj:"; } |
---|
111 | |
---|
112 | uint32_t style(const char *geno, int pos); |
---|
113 | }; |
---|
114 | |
---|
115 | #endif //_FH_OPER_H_ |
---|