File dicebox.py changed (mode: 100644) (index 5251d4b..df2473f) |
... |
... |
from scipy import optimize # for BlackSimpleX |
21 |
21 |
|
|
22 |
22 |
from .samplebox import SampleBox # for candidates packing |
from .samplebox import SampleBox # for candidates packing |
23 |
23 |
from . import simplex as sx |
from . import simplex as sx |
|
24 |
|
from . import convex_hull as khull |
24 |
25 |
from . import lukiskon as lk |
from . import lukiskon as lk |
25 |
26 |
|
|
26 |
27 |
from . import estimation as stm # for KechatoLukiskon |
from . import estimation as stm # for KechatoLukiskon |
|
... |
... |
class GuessBox: |
98 |
99 |
|
|
99 |
100 |
#оӵ дӥсё |
#оӵ дӥсё |
100 |
101 |
class DiceBox: |
class DiceBox: |
|
102 |
|
#č kruci, totálně v tohlenstom ztracím |
101 |
103 |
""" |
""" |
102 |
|
DiceBox pěčlivě ukladá věškerá data, |
|
103 |
|
věškeré sady vzorků (well, no yet), průběžné odhady a tak. |
|
104 |
|
Nejsem už jistý, zda DiceBox je šťastný nazev, neboť |
|
105 |
|
teďkom je to spíše jen krabička pro krámy |
|
|
104 |
|
DiceBox |
|
105 |
|
Public methods: |
|
106 |
|
__init__(): |
|
107 |
|
regen(): |
|
108 |
|
_LHS_regen() |
|
109 |
|
|
|
110 |
|
add_sample(): |
|
111 |
|
increment(): |
|
112 |
|
_LHS_increment() |
|
113 |
|
|
|
114 |
|
__call__(): |
|
115 |
|
LHS_like_correction() |
|
116 |
|
|
|
117 |
|
Public attributes: |
|
118 |
|
estimations |
|
119 |
|
guessbox |
106 |
120 |
""" |
""" |
107 |
121 |
def __init__(bx, sample_box): |
def __init__(bx, sample_box): |
108 |
122 |
bx.sample_box = sample_box |
bx.sample_box = sample_box |
|
... |
... |
class DiceBox: |
237 |
251 |
|
|
238 |
252 |
|
|
239 |
253 |
# MinEnergyCensoredSampling |
# MinEnergyCensoredSampling |
|
254 |
|
#č Pokud nepletu, hlavní pointa třídy byla v použití konvexní obálky |
|
255 |
|
#č místo triangulaci pro zjíštění inside-outside. |
|
256 |
|
#č Tohle brutálně všechno zrychlilo, proto se třída dostala název Chrt. |
240 |
257 |
class Chrt(DiceBox): |
class Chrt(DiceBox): |
|
258 |
|
""" |
|
259 |
|
Chrt |
|
260 |
|
methods: |
|
261 |
|
*__init__(): |
|
262 |
|
DiceBox.__init__(): |
|
263 |
|
*regen(): |
|
264 |
|
>_LHS_regen() |
|
265 |
|
_regen_outside(): |
|
266 |
|
estimate_outside(): |
|
267 |
|
assess_candidates: |
|
268 |
|
_nominate |
|
269 |
|
_regen_inside(): |
|
270 |
|
get_events |
|
271 |
|
estimate_simplex(simplex) |
|
272 |
|
_former_candidates_recovering |
|
273 |
|
assess_candidates |
|
274 |
|
|
|
275 |
|
>add_sample(): |
|
276 |
|
*increment(): |
|
277 |
|
_LHS_increment() |
|
278 |
|
export_estimation() |
|
279 |
|
_handle_changed_triangulation(input_sample): |
|
280 |
|
get_events() |
|
281 |
|
estimate_simplex(simplex): |
|
282 |
|
_former_candidates_recovering |
|
283 |
|
assess_candidates |
|
284 |
|
_invalidate_simplex(simplex) |
|
285 |
|
|
|
286 |
|
_handle_changed_outside(input_sample) |
|
287 |
|
estimate_outside(): |
|
288 |
|
assess_candidates: |
|
289 |
|
_nominate |
|
290 |
|
|
|
291 |
|
_handle_candidates() |
|
292 |
|
_judge_unjudged |
|
293 |
|
assess_candidates: |
|
294 |
|
_nominate |
|
295 |
|
assess_candidates: |
|
296 |
|
_nominate |
|
297 |
|
|
|
298 |
|
*regen() |
|
299 |
|
|
|
300 |
|
*__call__(): |
|
301 |
|
>LHS_like_correction() |
|
302 |
|
|
|
303 |
|
get_pf_estimation() |
|
304 |
|
|
|
305 |
|
export_estimation(): |
|
306 |
|
get_pf_estimation() |
|
307 |
|
""" |
241 |
308 |
#č už mě to dědění nebaví |
#č už mě to dědění nebaví |
242 |
309 |
#ё без поллитры было не разобраться, что этот слоёный пирог делал |
#ё без поллитры было не разобраться, что этот слоёный пирог делал |
243 |
310 |
def __init__(bx, sample_object, tri_space='Rn', tree_space=None,\ |
def __init__(bx, sample_object, tri_space='Rn', tree_space=None,\ |
|
... |
... |
class Chrt(DiceBox): |
575 |
642 |
|
|
576 |
643 |
if bx.nsim < 1: # je to legální |
if bx.nsim < 1: # je to legální |
577 |
644 |
bx._logger(msg="median first!") |
bx._logger(msg="median first!") |
578 |
|
return bx.LHS_like_correction(bx.f_model(1)) |
|
|
645 |
|
node = bx.LHS_like_correction(bx.f_model(1)) |
|
646 |
|
return CandyBox(node, event_id=np.full(1, -1, dtype=np.int8)) |
579 |
647 |
else: |
else: |
580 |
648 |
selected = bx.bidder |
selected = bx.bidder |
581 |
649 |
if bx.LHS_correction: |
if bx.LHS_correction: |
|
... |
... |
class Chrt(DiceBox): |
864 |
932 |
|
|
865 |
933 |
#оӵ ӧрӟи |
#оӵ ӧрӟи |
866 |
934 |
#č RJ |
#č RJ |
|
935 |
|
#č Třída nevytvaří triangulaci, dokud nejsou tečky oboje druhů. |
|
936 |
|
#č Jakoby letí nad zemi jako orel (ӧрӟи), nebo jako vlaky RJ jede bez zastavek. |
867 |
937 |
class Erjee(Chrt): |
class Erjee(Chrt): |
868 |
938 |
def _regen_inside(bx): |
def _regen_inside(bx): |
869 |
939 |
failsi = bx.failsi |
failsi = bx.failsi |
|
... |
... |
class Erjee(Chrt): |
918 |
988 |
|
|
919 |
989 |
|
|
920 |
990 |
|
|
921 |
|
# MinEnergyCensoredSampling |
|
|
991 |
|
# use cubature formulas for simplex integration |
922 |
992 |
class Razitko(Erjee): |
class Razitko(Erjee): |
923 |
993 |
#č už mě to dědění nebaví |
#č už mě to dědění nebaví |
924 |
994 |
#ё без поллитры было не разобраться, что этот слоёный пирог делал |
#ё без поллитры было не разобраться, что этот слоёный пирог делал |
|
... |
... |
class Razitko(Erjee): |
1083 |
1153 |
|
|
1084 |
1154 |
|
|
1085 |
1155 |
|
|
|
1156 |
|
#č Teď je třeba vytvoriť novou skříňku, která by místo Shull použivala Ghull. |
|
1157 |
|
#č Samozřejmě, že už ani já, ani čert nemůžeme se v tom vyznat |
|
1158 |
|
#č Takže radší zdědíme pouze bázový DiceBox |
1086 |
1159 |
|
|
|
1160 |
|
#č Je třeba dávát bacha na odlišnosti v (staré) Triangulation třídě a nové Ghull třídě. |
|
1161 |
|
#č Zatímco Triangulation drží starý stáv, dokud .update() není spustěn, |
|
1162 |
|
#č Ghull, ale hlavně, odpovídající modely konvexních obálek jíž žádný .update() nemájí, |
|
1163 |
|
#č nové tečky uvidí sami dřív než se naší skříňka probere. |
|
1164 |
|
#č Takže teď odhady nově budeme ukladať hned pri incrementu. |
|
1165 |
|
#č Triangulation používá i jínej kód, samotné třídy beztak zbytečně komplikováné, |
|
1166 |
|
#č nechci teď to toho lezt. |
|
1167 |
|
class Goal(DiceBox): |
|
1168 |
|
""" |
|
1169 |
|
Goal |
|
1170 |
|
methods: |
|
1171 |
|
*__init__(): |
|
1172 |
|
DiceBox.__init__(): |
|
1173 |
|
Chrt.regen(): |
|
1174 |
|
DiceBox._LHS_regen() |
|
1175 |
|
_regen_outside(): |
|
1176 |
|
estimate_outside(): |
|
1177 |
|
Chrt.assess_candidates: |
|
1178 |
|
Chrt._nominate |
|
1179 |
|
_regen_inside(): |
|
1180 |
|
__regen_inside: |
|
1181 |
|
**Triangulation magic**: |
|
1182 |
|
Razitko._on_add_simplex: |
|
1183 |
|
Chrt.assess_candidates: |
|
1184 |
|
Chrt._nominate |
|
1185 |
|
|
|
1186 |
|
>add_sample(): |
|
1187 |
|
*increment(): |
|
1188 |
|
>_LHS_increment() |
|
1189 |
|
export_estimation() |
|
1190 |
|
_handle_changed_triangulation(input_sample): |
|
1191 |
|
get_events() |
|
1192 |
|
estimate_simplex(simplex): |
|
1193 |
|
assess_candidates |
|
1194 |
|
_invalidate_simplex(simplex) |
|
1195 |
|
|
|
1196 |
|
_handle_changed_outside(input_sample) |
|
1197 |
|
estimate_outside(): |
|
1198 |
|
assess_candidates: |
|
1199 |
|
_nominate |
|
1200 |
|
|
|
1201 |
|
_handle_candidates() |
|
1202 |
|
assess_candidates: |
|
1203 |
|
_nominate |
|
1204 |
|
|
|
1205 |
|
*regen() |
|
1206 |
|
|
|
1207 |
|
Chrt.__call__(): |
|
1208 |
|
>LHS_like_correction() |
|
1209 |
|
|
|
1210 |
|
get_pf_estimation() |
|
1211 |
|
|
|
1212 |
|
export_estimation(): |
|
1213 |
|
get_pf_estimation() |
|
1214 |
|
""" |
|
1215 |
|
|
|
1216 |
|
#č praca s kandidatama moc sa nezměnila |
|
1217 |
|
#č funkce assess_candidates přířadí potenciál bodíkům |
|
1218 |
|
#č a zaroveň je nominuje na soutež. |
|
1219 |
|
#č na vstupu assess_candidates musí být CandyBox |
|
1220 |
|
#č s jíž nastaveným event_id |
|
1221 |
|
assess_candidates = Chrt.assess_candidates |
|
1222 |
|
_nominate = Chrt._nominate |
|
1223 |
|
|
|
1224 |
|
#č explicitně převezmu některé funkce |
|
1225 |
|
#č ať v budoucnu nelamame hlavu, co jestě potřebujeme, co už nikoliv |
|
1226 |
|
__repr__ = Chrt.__repr__ |
|
1227 |
|
__str__ = Chrt.__str__ |
|
1228 |
|
__call__ = Chrt.__call__ |
|
1229 |
|
regen = Chrt.regen |
|
1230 |
|
|
|
1231 |
|
_on_add_simplex = Razitko._on_add_simplex |
|
1232 |
|
_invalidate_simplex = Razitko._invalidate_simplex |
|
1233 |
|
|
|
1234 |
|
|
|
1235 |
|
#č míží nám sampling_space: Ghull umí vzorkovat outside pouze v G prostoru |
|
1236 |
|
#č quadpy umístí integráční bodíky v prostoru triangulace. |
|
1237 |
|
def __init__(bx, sample_object, scheme, tri_space='G', tree_space=None,\ |
|
1238 |
|
kechato_space='U', potencial='psee',\ |
|
1239 |
|
p_norm=2, shell_budget=1000, outer_budget=100,\ |
|
1240 |
|
LHS_correction=False): |
|
1241 |
|
|
|
1242 |
|
bx.scheme = scheme |
|
1243 |
|
bx.tri_space = tri_space |
|
1244 |
|
if tree_space is None: |
|
1245 |
|
bx.tree_space = tri_space |
|
1246 |
|
else: |
|
1247 |
|
bx.tree_space = tree_space |
|
1248 |
|
|
|
1249 |
|
|
|
1250 |
|
bx.kechato_space = kechato_space |
|
1251 |
|
bx.shell_budget = shell_budget |
|
1252 |
|
bx.outer_budget = outer_budget |
|
1253 |
|
bx.p_norm = p_norm |
|
1254 |
|
bx.potencial = potencial |
|
1255 |
|
bx.LHS_correction = LHS_correction |
|
1256 |
|
|
|
1257 |
|
DiceBox.__init__(bx, sample_object) |
|
1258 |
|
|
|
1259 |
|
|
|
1260 |
|
def init_parameters(bx): |
|
1261 |
|
""" |
|
1262 |
|
Returns dictionary of parameters the DiceBox was initialized with |
|
1263 |
|
""" |
|
1264 |
|
return {'sample_object':bx.sample_box, 'scheme':bx.scheme.name,\ |
|
1265 |
|
'tri_space':bx.tri_space, 'tree_space':bx.tree_space,\ |
|
1266 |
|
'kechato_space':bx.kechato_space, 'potencial':bx.potencial,\ |
|
1267 |
|
'p_norm':bx.p_norm, 'shell_budget':bx.shell_budget,\ |
|
1268 |
|
'outer_budget':bx.outer_budget, 'LHS_correction':bx.LHS_correction} |
|
1269 |
|
|
1087 |
1270 |
|
|
|
1271 |
|
|
|
1272 |
|
def _regen_outside(bx): |
|
1273 |
|
bx.convex_hull = khull.QHull(bx.f_model, space=bx.tri_space) # for gl_plot |
|
1274 |
|
bx.ghull = khull.Ghull(bx.convex_hull) |
|
1275 |
|
bx._R = -1 # update outer under R>_R condition |
|
1276 |
|
bx._afacet = None |
|
1277 |
|
bx._bfacet = np.inf |
|
1278 |
|
#č konečně mám pořádnou stejtful třídu |
|
1279 |
|
#č pokud mám aspoň jednu tečku, tak už je mi šuma |
|
1280 |
|
#č zda se konvexní obálka vytvořila, či nikoliv |
|
1281 |
|
if bx.nsim > 0: |
|
1282 |
|
bx.estimate_outside() |
|
1283 |
|
|
|
1284 |
|
|
|
1285 |
|
def _regen_inside(bx): |
|
1286 |
|
failsi = bx.failsi |
|
1287 |
|
if np.any(failsi) and not np.all(failsi): |
|
1288 |
|
#bx._logger(msg="triangulation started") |
|
1289 |
|
bx.__regen_inside() |
|
1290 |
|
else: |
|
1291 |
|
#č jíž není nutný |
|
1292 |
|
bx._logger(msg="triangulation skipped") |
|
1293 |
|
|
|
1294 |
|
def __regen_inside(bx): |
|
1295 |
|
# create .tri triangulation |
|
1296 |
|
if bx.nsim > bx.nvar + 1: # incremental triangulation require one more point |
|
1297 |
|
try: |
|
1298 |
|
# I'll use tri_space as a weigthing space |
|
1299 |
|
# It could be separeted, but I am a little bit tired |
|
1300 |
|
# from so much different spaces over there |
|
1301 |
|
bx.Tri = sx.JustCubatureTriangulation(bx.samplebox, bx.scheme,\ |
|
1302 |
|
tri_space=bx.tri_space, issi=None, \ |
|
1303 |
|
weighting_space=bx.tri_space, incremental=True,\ |
|
1304 |
|
on_add_simplex=bx._on_add_simplex,\ |
|
1305 |
|
on_delete_simplex=bx._invalidate_simplex) |
|
1306 |
|
|
|
1307 |
|
bx.Tri.integrate() # nic nevrácí, všecko je přes kolbeky |
|
1308 |
|
#č tri - Deloneho triangulace |
|
1309 |
|
bx.tri = bx.Tri.tri #č všichní tam očekávajou QHull |
|
1310 |
|
bx._logger(msg="triangulation has been created") |
|
1311 |
|
|
|
1312 |
|
except BaseException as e: |
|
1313 |
|
#č chcu zachytit spadnuti QHull na začatku, |
|
1314 |
|
#č kdy ještě není dostatek teček. |
|
1315 |
|
#č Jinak je třeba nechat QHull spadnout |
|
1316 |
|
if bx.nsim > 2*bx.nvar + 3: |
|
1317 |
|
#č no to teda ne! |
|
1318 |
|
raise |
|
1319 |
|
else: |
|
1320 |
|
#č lze přípustit chybu triangulace |
|
1321 |
|
bx._logger(msg='triangulation failed') |
|
1322 |
|
|
|
1323 |
|
|
|
1324 |
|
|
|
1325 |
|
#č beží 99% času |
|
1326 |
|
def increment(bx, input_sample): |
|
1327 |
|
#ё ну нахрен это ваше наследование-расследование |
|
1328 |
|
|
|
1329 |
|
#č nechť bude, asi nikomu nevadí |
|
1330 |
|
bx._LHS_increment(input_sample) |
|
1331 |
|
|
|
1332 |
|
#č strom posuneme sem |
|
1333 |
|
# cKDTree is used for potencial calculation |
|
1334 |
|
# we need everytime regenerate it |
|
1335 |
|
sampled_plan_tree = getattr(bx.sample_box, bx.tree_space) |
|
1336 |
|
bx.tree = spatial.cKDTree(sampled_plan_tree) |
|
1337 |
|
bx.highest_bid = 0 |
|
1338 |
|
|
|
1339 |
|
|
|
1340 |
|
#č logika se mění. Konvexní obálku máme vždycky. |
|
1341 |
|
#č jistě, že po incrementu máme alespoň jeden vzorek |
|
1342 |
|
#č takže hned od začátku můžeme trhat odhady |
|
1343 |
|
|
|
1344 |
|
#č tri - Deloneho triangulace |
|
1345 |
|
if "tri" in dir(bx): |
|
1346 |
|
bx._handle_changed_triangulation(input_sample) |
|
1347 |
|
else: |
|
1348 |
|
bx._regen_inside() |
|
1349 |
|
|
|
1350 |
|
|
|
1351 |
|
bx._handle_changed_outside(input_sample) |
|
1352 |
|
bx._handle_candidates() |
|
1353 |
|
|
|
1354 |
|
#č exportovať odhady jistě môžeme |
|
1355 |
|
#č teďkom to děláme hned po přídání vzorků |
|
1356 |
|
bx.export_estimation() |
|
1357 |
|
|
|
1358 |
|
|
|
1359 |
|
#č tato funkce běží 91% času |
|
1360 |
|
# bottleneck function |
|
1361 |
|
def _handle_changed_triangulation(bx, input_sample): |
|
1362 |
|
""" |
|
1363 |
|
Triangulace zajistěně existuje |
|
1364 |
|
""" |
|
1365 |
|
bx.Tri.update() |
|
1366 |
|
|
|
1367 |
|
|
|
1368 |
|
|
|
1369 |
|
|
|
1370 |
|
def _handle_changed_outside(bx, input_sample): |
|
1371 |
|
try: |
|
1372 |
|
#č kontrola korrektní i v případě NaN |
|
1373 |
|
test = input_sample.event_id > -1 |
|
1374 |
|
#оӵ эскером |
|
1375 |
|
if not test.all(): |
|
1376 |
|
bx.estimate_outside() |
|
1377 |
|
except BaseException as e: |
|
1378 |
|
msg = "input sample didn't provide correct 'event_id' attribute " |
|
1379 |
|
error_msg = bx.__class__.__name__ + ": " + msg + repr(e) |
|
1380 |
|
bx._logger(msg=error_msg) |
|
1381 |
|
bx.estimate_outside() |
|
1382 |
|
|
|
1383 |
|
|
|
1384 |
|
|
|
1385 |
|
|
|
1386 |
|
def _handle_candidates(bx): |
|
1387 |
|
#č A ještě... AUKCE, AUCTION |
|
1388 |
|
# Election - selection |
|
1389 |
|
for candidates in bx.candidates_index.values(): |
|
1390 |
|
bids = getattr(candidates, bx.potencial) |
|
1391 |
|
if len(bids): |
|
1392 |
|
bid = np.nanmax(bids) |
|
1393 |
|
# side effect |
|
1394 |
|
if bid > bx.highest_bid: |
|
1395 |
|
#č pokud neprovadíme optimalizaci v simplexech |
|
1396 |
|
#č tak nám stačí jednoduše assessovat |
|
1397 |
|
bx.assess_candidates(candidates) |
|
1398 |
|
|
|
1399 |
|
# probably, we shouldn't purge user candidates (if they are) |
|
1400 |
|
# just every time evaluate them |
|
1401 |
|
#č kdyby někdo chtěl mít užovatelské kandidaty... |
|
1402 |
|
# if len(bx.candidates) > 0: |
|
1403 |
|
# bx.judge_candidates(bx.candidates) |
|
1404 |
|
# bx.assess_candidates(bx.candidates) |
|
1405 |
|
|
|
1406 |
|
|
|
1407 |
|
|
|
1408 |
|
|
|
1409 |
|
def estimate_outside(bx): |
|
1410 |
|
#č konečně mám pořádnou stejtful třídu |
|
1411 |
|
#č pokud mám aspoň jednu tečku, tak už je mi šuma |
|
1412 |
|
#č zda se konvexní obálka vytvořila, či nikoliv |
|
1413 |
|
|
|
1414 |
|
#č Máme 2 úkoly: |
|
1415 |
|
#č 1. Získat odhady a uložit je, abychom nemuseli opakovaně integrovat, |
|
1416 |
|
#č dokud se neobjeví nějaký nový vzorek zvenku. |
|
1417 |
|
#č 2. Získat kandidaty. |
|
1418 |
|
#č a. z mezíkruží (-12) |
|
1419 |
|
#č b. fire, to co navrhne QHull (-1) |
|
1420 |
|
#č c. boom, doporuření QHull můžou i zklamat (-11) |
|
1421 |
|
|
|
1422 |
|
# get candidates! |
|
1423 |
|
#č explicitně (pokažde) počtem teček zadavám přesnost integrace |
|
1424 |
|
#č takže změny bx.shell_budget budou při dálším spuštění aplikovány |
|
1425 |
|
data = bx.ghull.integrate(bx.shell_budget) |
|
1426 |
|
candidates, ghull_estimation, convex_hull_estimation, global_stats = data |
|
1427 |
|
#č uložíme. Не жалко. |
|
1428 |
|
#č první úkol máme splněný |
|
1429 |
|
bx.ghull_estimation = ghull_estimation |
|
1430 |
|
bx.convex_hull_estimation = convex_hull_estimation |
|
1431 |
|
bx.ghull_stats = global_stats |
|
1432 |
|
bx._logger(msg="outside estimation:", ghull_stats=global_stats) |
|
1433 |
|
|
|
1434 |
|
#č kendinody už májú atribut is_outside a mají nastavený event_id |
|
1435 |
|
# -2 = 'inside' -1 = 'outside' |
|
1436 |
|
candidates = candidates[candidates.is_outside] |
|
1437 |
|
|
|
1438 |
|
|
|
1439 |
|
#č vzorky je třeba přidát ke kandidatům |
|
1440 |
|
#č jako, nic nepokazí, ale čo tam připadně bylo - přepíše |
|
1441 |
|
#č uložíme s indexem dle ghull_estimation: |
|
1442 |
|
# -22: inner, -21: shell inside, -12: shell outside, -11: outer |
|
1443 |
|
bx.assess_candidates(candidates) # nic nevrácí, to je procedura |
|
1444 |
|
bx.candidates_index[-12] = candidates |
|
1445 |
|
|
|
1446 |
|
|
|
1447 |
|
#č zde už nám jde pouze o kandidaty |
|
1448 |
|
|
|
1449 |
|
# fire |
|
1450 |
|
bx._fire() |
|
1451 |
|
# boom |
|
1452 |
|
|
|
1453 |
|
if global_stats['R'] > bx._R: |
|
1454 |
|
nodes = bx.ghull.boom(bx.outer_budget) |
|
1455 |
|
#č tyhle funkce už vracej pouhý f_model |
|
1456 |
|
event_id = np.full(bx.outer_budget, -1, dtype=np.int8) |
|
1457 |
|
candidates = CandyBox(nodes, event_id=event_id) |
|
1458 |
|
bx.assess_candidates(candidates) # nic nevrácí, to je procedura |
|
1459 |
|
bx.candidates_index[-11] = candidates |
|
1460 |
|
|
|
1461 |
|
bx._R = global_stats['R'] |
|
1462 |
|
bx._logger(msg='boom!', _R=bx._R) |
|
1463 |
|
#č to je vše. Nic nevrácíme |
|
1464 |
|
|
|
1465 |
|
def _fire(bx): |
|
1466 |
|
qhull = bx.ghull.hull |
|
1467 |
|
if bx._afacet is None: |
|
1468 |
|
bx.__fire() |
|
1469 |
|
|
|
1470 |
|
#č podle mě sem nemusí dojít, |
|
1471 |
|
#č dokud se konvexní obálka ve skutku nevytvoří |
|
1472 |
|
#č b-čko u QHull pro nás má jakoby záporné vzdálenosti |
|
1473 |
|
elif np.all(bx._bfacet > qhull.b): |
|
1474 |
|
#č jasně, že musíme zapalit |
|
1475 |
|
bx.__fire() |
|
1476 |
|
elif np.any(bx._afacet != qhull.A[np.nanargmax(qhull.b)]): |
|
1477 |
|
#č "beta" se nezměnila, ale jen kvůli jinejm návrhovým bodům |
|
1478 |
|
bx.__fire() |
|
1479 |
|
|
|
1480 |
|
def __fire(bx): |
|
1481 |
|
qhull = bx.ghull.hull |
|
1482 |
|
nodes = qhull.fire(bx.outer_budget) |
|
1483 |
|
if nodes is not None: |
|
1484 |
|
#č tyhle funkce už vracej pouhý f_model |
|
1485 |
|
event_id = np.full(bx.outer_budget, -1, dtype=np.int8) |
|
1486 |
|
candidates = CandyBox(nodes, event_id=event_id) |
|
1487 |
|
bx.assess_candidates(candidates) # nic nevrácí, to je procedura |
|
1488 |
|
bx.candidates_index[-1] = candidates |
|
1489 |
|
|
|
1490 |
|
arg = np.nanargmax(qhull.b) |
|
1491 |
|
bx._bfacet = b = qhull.b[arg] |
|
1492 |
|
bx._afacet = a = qhull.A[arg] |
|
1493 |
|
bx._logger(msg='fire!', a=a, b=b) |
|
1494 |
|
|
|
1495 |
|
|
|
1496 |
|
def get_pf_estimation(bx): |
|
1497 |
|
#č dle toho, čo vidím v kódu (spouští nás .increment()) |
|
1498 |
|
#č přinejmenším konvexní obálka musí |
|
1499 |
|
#č zajištěně existovat |
|
1500 |
|
# convex_hull_estimation -2: inside, -1: outside |
|
1501 |
|
pf_inside = bx.convex_hull_estimation[-2] |
|
1502 |
|
pf_outside = bx.convex_hull_estimation[-1] |
|
1503 |
|
|
|
1504 |
|
if 'tri' in dir(bx): |
|
1505 |
|
estimations = bx.Tri.get_pf_estimation() |
|
1506 |
|
# TRI-compatible estimation |
|
1507 |
|
# -1=outside, 0=success, 1=failure, 2=mix |
|
1508 |
|
#č to je JustTriangulation, |
|
1509 |
|
#č outside (-1), ani success (1) nebudou korektní |
|
1510 |
|
tri_estimation = estimations.pop('TRI_estimation') |
|
1511 |
|
tri_estimation[-1] = pf_outside |
|
1512 |
|
tri_estimation[0] = pf_inside - tri_estimation[1] - tri_estimation[2] |
|
1513 |
|
estimations['TRI_overall_estimations'] = tri_estimation |
|
1514 |
|
estimations['ghull_estimation'] = bx.ghull_estimation |
|
1515 |
|
return estimations |
|
1516 |
|
|
|
1517 |
|
|
|
1518 |
|
#оӵ триангуляци ӧвӧл, иськем... |
|
1519 |
|
|
|
1520 |
|
#č může se stát, že první dvě tečky už hned májí různé barvy, |
|
1521 |
|
#č ale žádnej simplex ještě nemáme. |
|
1522 |
|
#č takže celou skříňku prostě bereme jako simplex |
|
1523 |
|
event, event_id, fr, wfr = sx.get_simplex_event(bx, weighting_space=bx.tri_space) |
|
1524 |
|
# -1=outside, 0=success, 1=failure, 2=mix |
|
1525 |
|
tri_estimation = {-1:pf_outside, 0:0, 1:0, 2:0} |
|
1526 |
|
tri_estimation[event_id] = pf_inside |
|
1527 |
|
|
|
1528 |
|
return {'TRI_overall_estimations': tri_estimation, \ |
|
1529 |
|
'vertex_estimation' : pf_inside * fr, \ |
|
1530 |
|
'weighted_vertex_estimation' : pf_inside * wfr, \ |
|
1531 |
|
'ghull_estimation' : bx.ghull_estimation} |
|
1532 |
|
|
|
1533 |
|
|
|
1534 |
|
def export_estimation(bx): |
|
1535 |
|
#č teď raději estimátory ukladáme hned |
|
1536 |
|
for key, value in bx.get_pf_estimation().items(): |
|
1537 |
|
bx.guessbox.guess(key, bx.nsim, value) |
|
1538 |
|
|
1088 |
1539 |
|
|
1089 |
1540 |
|
|
1090 |
1541 |
|
|
|
1542 |
|
##č nie treba počítat odhady v každem kroku |
|
1543 |
|
##č ale zas, taky že chceme do článků davat nějaké diagramy |
|
1544 |
|
# |
|
1545 |
|
##č |
|
1546 |
|
##č po 2. kroku ghull.fire() nastaví vnější poloměr R a dovnitř už ani nesahne. |
|
1547 |
|
##č Je to v porádku, pokud rozhodování je v G prostoru, |
|
1548 |
|
##č protože v druhem kroku algoritmus nějak zvolil ten nejoptimálnější poloměr |
|
1549 |
|
##č a není v dalším kroku skutečně důvod pod ten poloměr jít. |
|
1550 |
|
##č Pokud rozhodujeme v R prostoru s nějakým divokým rozdělením - už je to trošku problem. |
|
1551 |
|
# |
|
1552 |
|
##č Jak poznam, že není dostatek teček, nebo je nějaký problem? Jakou chybu hodí Ghull? |
1091 |
1553 |
|
|
1092 |
1554 |
|
|
1093 |
1555 |
|
|