1 /**
2 *   Copyright: © 2012-2014 Anton Gushcha
3 *   License: Subject to the terms of the MIT license, as written in the included LICENSE file.
4 *   Authors:  NCrashed <ncrashed@gmail.com>,
5 *             LeMarwin <lemarwin42@gmail.com>,
6 *             Nazgull09 <nazgull90@gmail.com>
7 */
8 module devol.programtype;
9 
10 public
11 {
12 	import devol.individ;
13 	import devol.world;
14 	import devol.std.line;
15 }
16 private
17 {
18 	import std.math;
19 	import std..string;
20 }
21 
22 interface ProgTypeAbstract
23 {
24 	/// Минимальный размер программы при генерации
25 	@property uint progMinSize()
26 	in
27 	{
28 		assert(progMinSize() <= progMaxSize(), "Min program size is greater then max program size!");
29 	}
30 	
31 	/// Максимальный размер программы при генерации
32 	@property uint progMaxSize()
33 	in
34 	{
35 		assert(progMinSize() <= progMaxSize(), "Min program size is greater then max program size!");
36 	}
37 	
38 	/// Минимальный размер секции при генерации	
39 	@property uint scopeMinSize()
40 	in
41 	{
42 		assert(scopeMinSize() <= scopeMaxSize(), "Min scope size is greater then max scope size!");
43 	}
44 	
45 	/// Максимальный размер секции при генерации
46 	@property uint scopeMaxSize()
47 	in
48 	{
49 		assert(scopeMinSize() <= scopeMaxSize(), "Min scope size is greater then max scope size!");
50 	}
51 	
52 	/// Шанс сгененрировать новую подлинию при генерации
53 	@property float newOpGenChance()
54 	in
55 	{
56 		assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!");
57 	}
58 	out(result)
59 	{
60 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
61 	}
62 	
63 	/// Шанс сгенерировать новую подсекцию при генерации
64 	@property float newScopeGenChance()
65 	in
66 	{
67 		assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!");
68 	}
69 	out(result)
70 	{
71 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
72 	}
73 	
74 	/// Шанс сгенерировать новый аргумент при генерации
75 	@property float newLeafGenChance()
76 	in
77 	{
78 		assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!");
79 	}
80 	out(result)
81 	{
82 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
83 	}
84 	
85 	/// Шанс изменения значения листа программы
86 	@property float mutationChangeChance()
87 	in
88 	{
89 		assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!");
90 	}
91 	out(result)
92 	{
93 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
94 	}
95 	
96 	/// Шанс замены узла программы на подлинию
97 	@property float mutationReplaceChance()
98 	in
99 	{
100 		assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!");
101 	}
102 	out(result)
103 	{
104 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
105 	}
106 	
107 	/// Шанс удаление узла программы и замены его листом
108 	@property float mutationDeleteChance()
109 	in
110 	{
111 		assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!");
112 	}
113 	out(result)
114 	{
115 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
116 	}
117 	
118 	/// Шанс добавления новой линии в программе
119 	@property float mutationAddLineChance()
120 	in
121 	{
122 		assert(mutationAddLineChance()+mutationRemoveLineChance() <= 1, "Mutation summ chance of add/remove line is greater 1!");
123 	}
124 	out(result)
125 	{
126 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
127 	}
128 		
129 	/// Шанс удаления линии в программе
130 	@property float mutationRemoveLineChance()
131 	in
132 	{
133 		assert(mutationAddLineChance()+mutationRemoveLineChance() <= 1, "Mutation summ chance of add/remove line is greater 1!");
134 	}
135 	out(result)
136 	{
137 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
138 	}
139 		
140 	/// Максимальный модуль изменения значений для числовых типов
141 	@property string maxMutationChange()
142 	out(result)
143 	{
144 		assert(isNumeric(result), "Mutation change must be a numeric string!");
145 	}
146 	
147 	/// Шанс провести операцию мутации над индивидом
148 	@property float mutationChance()
149 	in
150 	{
151 		assert( abs( mutationChance()+crossingoverChance() - 1) < 0.01, "Summ of mutattion and crossingover chances isn't 1.0!");
152 	}
153 	out(result)
154 	{
155 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
156 	}
157 	
158 	/// Шанс провести операцию кроссинговера над индивидом
159 	@property float crossingoverChance()
160 	out(result)
161 	{
162 		assert( 0 <= result && result <= 1, "Return value isn't a probability!");
163 	}
164 	
165 	/// Часть популяции из лучших индивидов, которые будут скопированы в следующее поколение
166 	@property float copyingPart()
167 	out(result)
168 	{
169 		assert( 0 <= result && result <= 1, "Return value must be in range [0,1]!");
170 	}
171 	
172 	/// Размер генома, при котором начинает повышаться шанс мутации удаления
173 	@property size_t deleteMutationRiseGenomeSize();
174 //	out(result)
175 //	{
176 //	    assert(result <= maxGenomeSize(), "Return value must be less or equal maxGenomeSize");
177 //	}
178 	
179 	/// Максимальный размер генома индивида в количестве листов
180 	@property size_t maxGenomeSize();
181 //    out(result)
182 //    {
183 //	    assert(result >= deleteMutationRiseGenomeSize(), "Return value must be greater or equal deleteMutationRiseGenomeSize");
184 //	}
185 	
186 	/// Оценка результата работы индивида
187 	double getFitness(IndAbstract pInd, WorldAbstract pWorld, double time);
188 	
189 	/// Инициализация входных значений для индивида
190 	Line[] initValues(WorldAbstract pWorld);
191 }
192