File wellmet/voronoi.py changed (mode: 100644) (index 065004f..2524639) |
... |
... |
class WardrobeDict(dict): |
208 |
208 |
self.index = 0 |
self.index = 0 |
209 |
209 |
|
|
210 |
210 |
def add(self, item): |
def add(self, item): |
|
211 |
|
#č nulový index se nesmí vratit |
|
212 |
|
#č CV ho použivá jako False |
211 |
213 |
self.index += 1 |
self.index += 1 |
212 |
214 |
#оӵ мар ке вал отын - туж жаль |
#оӵ мар ке вал отын - туж жаль |
213 |
215 |
self[self.index] = item |
self[self.index] = item |
|
... |
... |
class ContactVoronoi: |
252 |
254 |
č jsou DVA sousedících vzorků. I když vzorek "d" nemá kontakt s "c", |
č jsou DVA sousedících vzorků. I když vzorek "d" nemá kontakt s "c", |
253 |
255 |
č pouze s "a" a "b", pořád můžou existovat bodíky "ac" a "bc", pro které |
č pouze s "a" a "b", pořád můžou existovat bodíky "ac" a "bc", pro které |
254 |
256 |
č "c" a "d" stanou nejbližší. |
č "c" a "d" stanou nejbližší. |
255 |
|
|
|
|
257 |
|
č 3. Už jsme opustili svět napočítaných stěn, |
|
258 |
|
č kde i konvexní obálku jsme vždycky sestavovali v prostoru triangulace. |
|
259 |
|
č Konvexní obálka se může sestavovat v jiném prostoru a tak úplně |
|
260 |
|
č každý bodík (i na usečce mezi dvěma vzorky) se může objevit venku. |
|
261 |
|
č |
256 |
262 |
č Neplatí: |
č Neplatí: |
257 |
263 |
č 2. (Při přidani vzorku "c"). Jakože neexistují-li kontakty mezi vzorky "c" a "a", |
č 2. (Při přidani vzorku "c"). Jakože neexistují-li kontakty mezi vzorky "c" a "a", |
258 |
|
č a mezi "c" a "b", tak přídaní "c" nemmůže kontakt mezi "a" a "b" ovlivnit. |
|
|
264 |
|
č a mezi "c" a "b", tak přídaní "c" nemůže kontakt mezi "a" a "b" ovlivnit. |
259 |
265 |
""" |
""" |
260 |
266 |
def __init__(self, sample_box, hull, model_space='G', \ |
def __init__(self, sample_box, hull, model_space='G', \ |
261 |
267 |
p_norm=2, ns=1000, p_base=0.5, auto_update=True, \ |
p_norm=2, ns=1000, p_base=0.5, auto_update=True, \ |
|
... |
... |
class ContactVoronoi: |
276 |
282 |
|
|
277 |
283 |
|
|
278 |
284 |
self._nsim = 0 |
self._nsim = 0 |
|
285 |
|
self._enabled = False # if nsim < 2 and not failsi |
279 |
286 |
self.nodes = WardrobeDict() |
self.nodes = WardrobeDict() |
280 |
287 |
# checklist |
# checklist |
281 |
288 |
#č defaultdict zajistí, že na nás dycky čeka seznam, |
#č defaultdict zajistí, že na nás dycky čeka seznam, |
|
... |
... |
class ContactVoronoi: |
289 |
296 |
self._nodes_to_check_outsides = [] |
self._nodes_to_check_outsides = [] |
290 |
297 |
|
|
291 |
298 |
|
|
292 |
|
self.update() |
|
|
299 |
|
#č já chcu, aby třída byla blbuvzdorná |
|
300 |
|
#č aby šlo ji vytvořit na prazdné skřiňce |
|
301 |
|
#č aby neotravovala chybáma |
|
302 |
|
self._update() |
293 |
303 |
|
|
294 |
304 |
|
|
295 |
305 |
|
|
|
... |
... |
class ContactVoronoi: |
305 |
315 |
|
|
306 |
316 |
def _update(self): |
def _update(self): |
307 |
317 |
if self.auto_update: |
if self.auto_update: |
308 |
|
##č můžeme udělat obraceně - |
|
309 |
|
##č je-li to nutné, nechť si uživatel třídy |
|
310 |
|
##č zajístí správnost autsajdů |
|
311 |
|
##č a teprvé poté volá update() |
|
312 |
|
#č Ale nebudeme. Po aktualizaci něco i zmízí, |
|
313 |
|
#č tak si ušetříme kus práce |
|
314 |
|
self.update() |
|
315 |
|
self.update_outside() |
|
316 |
|
|
|
317 |
|
|
|
318 |
|
#č já chcu, aby třída byla blbuvzdorná |
|
319 |
|
#č aby šlo ji vytvořit na prazdné skřiňce |
|
320 |
|
#č aby neotravovala chybáma |
|
321 |
|
def update(self): |
|
|
318 |
|
if self.basic_checks(): |
|
319 |
|
self.update_tree() |
|
320 |
|
##č můžeme udělat obraceně - |
|
321 |
|
##č je-li to nutné, nechť si uživatel třídy |
|
322 |
|
##č zajístí správnost autsajdů |
|
323 |
|
##č a teprvé poté volá update() |
|
324 |
|
#č Ale nebudeme. Po aktualizaci něco i zmízí, |
|
325 |
|
#č tak si ušetříme kus práce |
|
326 |
|
self.update_contacts() |
|
327 |
|
self.update_outside() |
|
328 |
|
|
|
329 |
|
|
|
330 |
|
def basic_checks(self): |
|
331 |
|
if self._enabled: |
|
332 |
|
return True |
|
333 |
|
elif self.sample_box.nsim < 2: |
|
334 |
|
return False |
|
335 |
|
elif not np.any(self.failsi): |
|
336 |
|
return False |
|
337 |
|
else: |
|
338 |
|
self._enabled = True |
|
339 |
|
return True |
|
340 |
|
|
322 |
341 |
|
|
|
342 |
|
|
|
343 |
|
def update_tree(self): |
323 |
344 |
#č zjednodušeničko pro skříňku - uživatele třídy |
#č zjednodušeničko pro skříňku - uživatele třídy |
324 |
345 |
#č strom je dycky přítomný |
#č strom je dycky přítomný |
325 |
346 |
self.sampled_plan_model = getattr(self.sample_box, self.model_space) |
self.sampled_plan_model = getattr(self.sample_box, self.model_space) |
326 |
347 |
self.tree = KDTree(sampled_plan_model) |
self.tree = KDTree(sampled_plan_model) |
327 |
348 |
|
|
328 |
|
nsim = self.sample_box.nsim |
|
329 |
|
if nsim < 2: |
|
330 |
|
return None |
|
331 |
|
|
|
|
349 |
|
|
|
350 |
|
def update_contacts(self): |
332 |
351 |
#č já vím, že sample box pokážde failsi přepočítavá |
#č já vím, že sample box pokážde failsi přepočítavá |
333 |
|
self.failsi = self.sample_box.failsi |
|
334 |
|
if not np.any(self.failsi): |
|
335 |
|
return None |
|
336 |
|
|
|
|
352 |
|
self.failsi = failsi = self.sample_box.failsi |
337 |
353 |
|
|
338 |
354 |
self.CS = ConvexSolver(sampled_plan_model) |
self.CS = ConvexSolver(sampled_plan_model) |
339 |
|
|
|
340 |
355 |
self.PDF = self.sample_box.pdf(self.model_space) |
self.PDF = self.sample_box.pdf(self.model_space) |
341 |
|
#č já vím, že sample box je pokážde přepočítavá |
|
342 |
|
failure_points = self.sample_box.failure_points |
|
343 |
356 |
|
|
344 |
357 |
assert len(self._indices_to_update) == 0 |
assert len(self._indices_to_update) == 0 |
345 |
358 |
|
|
|
... |
... |
class ContactVoronoi: |
349 |
362 |
#č a môžeme všechny nasbírané pravděpodobnosti jednoduše sčítat |
#č a môžeme všechny nasbírané pravděpodobnosti jednoduše sčítat |
350 |
363 |
# good old event ids... |
# good old event ids... |
351 |
364 |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
352 |
|
for i in range(self._nsim, nsim): |
|
353 |
|
if i in failure_points: #č první je červený |
|
|
365 |
|
for i in range(self._nsim, self.sample_box.nsim): |
|
366 |
|
if failsi[i]: #č první je červený |
354 |
367 |
for j in range(i): |
for j in range(i): |
355 |
|
if j in failure_points: |
|
|
368 |
|
if failsi[j]: |
356 |
369 |
#č červený kontakt |
#č červený kontakt |
357 |
370 |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
358 |
371 |
self.onboard_couple((i, j), event_id=1) |
self.onboard_couple((i, j), event_id=1) |
|
... |
... |
class ContactVoronoi: |
363 |
376 |
|
|
364 |
377 |
else: #č první je zelený |
else: #č první je zelený |
365 |
378 |
for j in range(i): |
for j in range(i): |
366 |
|
if j in failure_points: |
|
|
379 |
|
if failsi[j]: |
367 |
380 |
#č žlutý kontakt |
#č žlutý kontakt |
368 |
381 |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
369 |
382 |
self.onboard_couple((i, j), event_id=2) |
self.onboard_couple((i, j), event_id=2) |
|
... |
... |
class ContactVoronoi: |
445 |
458 |
contact_node_model = np.sum(self.sampled_plan_model[[i, j]], axis=0) |
contact_node_model = np.sum(self.sampled_plan_model[[i, j]], axis=0) |
446 |
459 |
np.divide(contact_node_model, 2, out=contact_node_model) |
np.divide(contact_node_model, 2, out=contact_node_model) |
447 |
460 |
|
|
|
461 |
|
|
|
462 |
|
|
|
463 |
|
|
448 |
464 |
dd, ii = tree.query(contact_node_model, k=2, p=self.p_norm) |
dd, ii = tree.query(contact_node_model, k=2, p=self.p_norm) |
449 |
465 |
#č taková kontola je rychlejší jak volání numpy množinových funkcí |
#č taková kontola je rychlejší jak volání numpy množinových funkcí |
450 |
466 |
if (i in ii) and (j in ii): |
if (i in ii) and (j in ii): |
|
... |
... |
class ContactVoronoi: |
464 |
480 |
## checklist |
## checklist |
465 |
481 |
#self.couples #č další kód, kdyby něco |
#self.couples #č další kód, kdyby něco |
466 |
482 |
self.direct_contacts[couple_indices] = idx |
self.direct_contacts[couple_indices] = idx |
467 |
|
#self._nodes_to_check_outsides #č nemůže být outside |
|
|
483 |
|
#self._nodes_to_check_outsides #č nemůže být outside #č není pravda |
468 |
484 |
|
|
469 |
485 |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
470 |
486 |
if (event_id == 2) and (self.on_add_mixed is not None): |
if (event_id == 2) and (self.on_add_mixed is not None): |
|
... |
... |
class ContactVoronoi: |
512 |
528 |
|
|
513 |
529 |
|
|
514 |
530 |
|
|
|
531 |
|
|
515 |
532 |
def sample_couple(self, couple_indices, event_id, center, r): |
def sample_couple(self, couple_indices, event_id, center, r): |
516 |
533 |
"""č máme nový manželský páreček |
"""č máme nový manželský páreček |
517 |
534 |
оӵ Выль кузо. Мар меда кароно? |
оӵ Выль кузо. Мар меда кароно? |
|
... |
... |
class ContactVoronoi: |
812 |
829 |
#self._add_indices_to_update(j) #č vždyť já nevím, jestli se jedná o aktualizaci |
#self._add_indices_to_update(j) #č vždyť já nevím, jestli se jedná o aktualizaci |
813 |
830 |
self._nodes_to_check_outsides.append(idx) |
self._nodes_to_check_outsides.append(idx) |
814 |
831 |
|
|
815 |
|
return idx |
|
|
832 |
|
# -1 = 'outside', 0=success, 1=failure, 2=mix |
|
833 |
|
if (event_id == 2) and (self.on_add_mixed is not None): |
|
834 |
|
self.on_add_mixed(idx) |
816 |
835 |
|
|
|
836 |
|
return idx |
817 |
837 |
|
|
818 |
838 |
|
|
819 |
839 |
|
|
820 |
840 |
|
|
|
841 |
|
def estimate_nodes(self, idx): |
|
842 |
|
pass |
821 |
843 |
|
|
822 |
844 |
|
|
823 |
845 |
|
|