File wellmet/voronoi.py changed (mode: 100644) (index 04923de..9aacbae) |
... |
... |
class ContactVoronoi: |
225 |
225 |
č kdy a jak odhady aktualizovat |
č kdy a jak odhady aktualizovat |
226 |
226 |
č integrujeme zde všechny možné pary vzorků, |
č integrujeme zde všechny možné pary vzorků, |
227 |
227 |
č kontakt po kontaktu, |
č kontakt po kontaktu, |
228 |
|
č tj. oblastí ve kterých nejblížšimi jsou pár určitých vzorků |
|
|
228 |
|
č tj. oblastí ve kterých nejblížšimi jsou pár určitých vzorků. |
229 |
229 |
č Vyhody: |
č Vyhody: |
230 |
|
č + Získáváme strukturální informace o problému |
|
231 |
|
č + Nemusíme integrovat všechno. Na zelený-zelený kontakty kašleme |
|
232 |
|
č + V rámci kontaktu entropie je neměnná, vysledný potenciál je předvidatelný |
|
|
230 |
|
č + Získáváme strukturální informace o problému. |
|
231 |
|
č + Nemusíme integrovat všechno. Na zelený-zelený kontakty kašleme. |
|
232 |
|
č + V rámci kontaktu entropie je neměnná, potenciál taky. |
233 |
233 |
č + Důraz integrace je právě na oblastéch zájmu, ne bůhví na čem u buňek. |
č + Důraz integrace je právě na oblastéch zájmu, ne bůhví na čem u buňek. |
234 |
234 |
č + Nejsou-li body příslyšné kontaktu, tak řekneme, že kontakt neexistuje |
č + Nejsou-li body příslyšné kontaktu, tak řekneme, že kontakt neexistuje |
235 |
235 |
č a vyhodíme ho z dalšího usuzování. U buňek člověk nikdy neví... |
č a vyhodíme ho z dalšího usuzování. U buňek člověk nikdy neví... |
|
... |
... |
class ContactVoronoi: |
246 |
246 |
č 1b. I když nepatří střed usečky mezí vzorky "a" a "b" do kontaktu, |
č 1b. I když nepatří střed usečky mezí vzorky "a" a "b" do kontaktu, |
247 |
247 |
č kontakt pořad může existovat. |
č kontakt pořad může existovat. |
248 |
248 |
č 1c. Jde-li kontakt do nekonečna, pořad může (i když nemusí) |
č 1c. Jde-li kontakt do nekonečna, pořad může (i když nemusí) |
249 |
|
č existovat část, která patří do (QHull) konvexní obálky |
|
250 |
|
č 2. (Při přidani vzorku "c"). Neexistují-li kontakty mezi vzorky "c" a "a", |
|
251 |
|
č a mezi "c" a "b", tak přídaní "c" nemohlo kontakt mezi "a" a "b" ovlivnit |
|
|
249 |
|
č existovat část, která patří do (QHull) konvexní obálky. |
|
250 |
|
č 2. Při přidani vzorku "d" musíme aktualizovat všechny vazby všech |
|
251 |
|
č sousedících s tím d-čkem vzorků. To je právě proto, že oblast kontaktu |
|
252 |
|
č jsou DVA sousedících vzorků. I když vzorek "d" nemá kontakt s "c", |
|
253 |
|
č pouze s "a" a "b", pořád můžou existovat bodíky "ac" a "bc", pro které |
|
254 |
|
č "c" a "d" stanou nejbližší. |
|
255 |
|
|
|
256 |
|
č Neplatí: |
|
257 |
|
č 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. |
252 |
259 |
""" |
""" |
253 |
260 |
def __init__(self, sample_box, hull, model_space='G', \ |
def __init__(self, sample_box, hull, model_space='G', \ |
254 |
261 |
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: |
271 |
278 |
self._nsim = 0 |
self._nsim = 0 |
272 |
279 |
self.nodes = WardrobeDict() |
self.nodes = WardrobeDict() |
273 |
280 |
# checklist |
# checklist |
274 |
|
self.couples = {} #č |
|
275 |
|
self.direct_contacts = {} |
|
|
281 |
|
#č defaultdict zajistí, že na nás dycky čeka seznam, |
|
282 |
|
#č do kterého můžeme přidávat indexy bodíků |
|
283 |
|
self.couples = collections.defaultdict(list) |
276 |
284 |
self.couples_stats = {} |
self.couples_stats = {} |
277 |
|
self.mixed_couples = set() |
|
278 |
|
self.red_couples = set() |
|
|
285 |
|
self.mixed_couples = {} |
|
286 |
|
self.red_couples = {} |
279 |
287 |
#č uvnitř třídy ještě můžeme ordnung dodržovat |
#č uvnitř třídy ještě můžeme ordnung dodržovat |
280 |
|
self._indices_to_update = set() |
|
|
288 |
|
self._indices_to_update = set() # set of couples to update |
281 |
289 |
self._nodes_to_check_outsides = [] |
self._nodes_to_check_outsides = [] |
282 |
290 |
|
|
283 |
291 |
|
|
|
... |
... |
class ContactVoronoi: |
288 |
296 |
""" |
""" |
289 |
297 |
## checklist |
## checklist |
290 |
298 |
self.couples = {} # dict of active contacts {couple_indices: list of nodes} |
self.couples = {} # dict of active contacts {couple_indices: list of nodes} |
291 |
|
self.direct_contacts = {} # dict of direct contacts {couple_indices: node_idx} |
|
292 |
299 |
self.couples_stats = {} |
self.couples_stats = {} |
293 |
|
self.mixed_couples = set() |
|
294 |
|
self.red_couples = set() |
|
295 |
|
self._add_indices_to_update(j) # set of all the "j"s for the mutual updates |
|
|
300 |
|
self.mixed_couples = {} ##č pár slovníků reprezentativních sad vzorků |
|
301 |
|
self.red_couples = {} ## {couple_indices: node_idx} |
|
302 |
|
self._add_indices_to_update(j) |
296 |
303 |
self._nodes_to_check_outsides = [] #č seznam indexů, projedu jednoduše smyčkou |
self._nodes_to_check_outsides = [] #č seznam indexů, projedu jednoduše smyčkou |
297 |
304 |
""" |
""" |
298 |
305 |
|
|
299 |
306 |
def _update(self): |
def _update(self): |
300 |
307 |
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 |
301 |
314 |
self.update() |
self.update() |
302 |
315 |
self.update_outside() |
self.update_outside() |
303 |
316 |
|
|
|
... |
... |
class ContactVoronoi: |
356 |
369 |
|
|
357 |
370 |
|
|
358 |
371 |
#č project páry na update |
#č project páry na update |
359 |
|
#č pokud _nsim > 0, tak není možné, že by nebyly apdejty |
|
360 |
|
#č "nejmenší" pár je (1, 0), takže |
|
361 |
|
#č "i" může být v rozmězí od 1 do _nsim-1 (včetně) |
|
362 |
|
#č u prvního indexu musíme dodržovat pořadí procházky |
|
363 |
|
for i in range(self._nsim - 1, 0, -1): |
|
364 |
|
if i in self._indices_to_update: |
|
365 |
|
self._indices_to_update.remove(i) |
|
366 |
|
for j in self._indices_to_update: |
|
367 |
|
if ((i, j) in self.mixed_couples) or ((i, j) in self.red_couples): |
|
368 |
|
self.update_couple((i, j)) |
|
369 |
|
|
|
370 |
|
#č nechcu ani kontrolovat zda-li, jestli, není-li. Mouchy. |
|
371 |
|
#if |
|
372 |
|
# break |
|
|
372 |
|
for couple_indices in self._indices_to_update: |
|
373 |
|
#č nepodporuje slovník množinové operace |
|
374 |
|
if couple_indices in self.couples: |
|
375 |
|
#č i kdyby někdo (nelegálně!) přímo volal update_couple() |
|
376 |
|
#č žádná katastrofa se dít nebude |
|
377 |
|
#č defaultdict vytvoří prazdný seznam, |
|
378 |
|
#č ale bez bodíků se aktualizace brzy skončí :) |
|
379 |
|
self.update_couple(couple_indices) |
|
380 |
|
self._indices_to_update.clear() |
|
381 |
|
|
|
382 |
|
#č neplatí. Bohužel |
|
383 |
|
# #č pokud _nsim > 0, tak není možné, že by nebyly apdejty |
|
384 |
|
# #č "nejmenší" pár je (1, 0), takže |
|
385 |
|
# #č "i" může být v rozmězí od 1 do _nsim-1 (včetně) |
|
386 |
|
# #č u prvního indexu musíme dodržovat pořadí procházky |
|
387 |
|
# for i in range(self._nsim - 1, 0, -1): |
|
388 |
|
# if i in self._indices_to_update: |
|
389 |
|
# self._indices_to_update.remove(i) |
|
390 |
|
# for j in self._indices_to_update: |
|
391 |
|
# if ((i, j) in self.mixed_couples) or ((i, j) in self.red_couples): |
|
392 |
|
# self.update_couple((i, j)) |
|
393 |
|
# |
|
394 |
|
# #č nechcu ani kontrolovat zda-li, jestli, není-li. Mouchy. |
|
395 |
|
# #if |
|
396 |
|
# # break |
373 |
397 |
|
|
374 |
398 |
|
|
375 |
399 |
|
|
|
... |
... |
class ContactVoronoi: |
379 |
403 |
#č i-té indexy jsou ty čerstvé, přes ně iterujeme |
#č i-té indexy jsou ty čerstvé, přes ně iterujeme |
380 |
404 |
#č j-té - ty bežné, protí ním rozhodujeme |
#č j-té - ty bežné, protí ním rozhodujeme |
381 |
405 |
if j < self._nsim: |
if j < self._nsim: |
382 |
|
self._indices_to_update.add(j) |
|
|
406 |
|
for k in range(j): |
|
407 |
|
self._indices_to_update.add((j, k)) |
|
408 |
|
for k in range(j+1, self._nsim): |
|
409 |
|
self._indices_to_update.add((k, j)) |
|
410 |
|
|
|
411 |
|
#č no nevím tedy co je rychlejší |
|
412 |
|
#č triviální funkce, |
|
413 |
|
#č neco hračky s pythonovými iteratoráma |
|
414 |
|
# for k in range(self._nsim): |
|
415 |
|
# #č budou tam tedy i páry druhu (j, j), (k, k) |
|
416 |
|
# #č ale to nevadí - na updejtu |
|
417 |
|
# #č funkce je nenajde je v databazí |
|
418 |
|
# #č a na ně vykašle |
|
419 |
|
# self._indices_to_update.add((max(j,k), min(j,k))) |
383 |
420 |
|
|
384 |
421 |
|
|
385 |
422 |
def update_couple(self, couple_indices, event_id): |
def update_couple(self, couple_indices, event_id): |
|
... |
... |
class ContactVoronoi: |
757 |
794 |
|
|
758 |
795 |
idx = self.nodes.add(nodes) |
idx = self.nodes.add(nodes) |
759 |
796 |
## checklist |
## checklist |
760 |
|
#self.couples #č další kód, kdyby něco |
|
761 |
|
self.direct_contacts[couple_indices] = idx |
|
762 |
|
#self._nodes_to_check_outsides #č nemůže být outside |
|
|
797 |
|
self.couples[couple_indices].append(idx) |
|
798 |
|
#self.couples_stats #č nevím |
|
799 |
|
#self.mixed_couples |
|
800 |
|
#self.red_couples |
|
801 |
|
#self._add_indices_to_update(j) #č vždyť já nevím, jestli se jedná o aktualizaci |
|
802 |
|
self._nodes_to_check_outsides.append(idx) |
763 |
803 |
|
|
764 |
804 |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
# -1 = 'outside', 0=success, 1=failure, 2=mix |
765 |
|
if (event_id == 2) and (self.on_add_mixed is not None): |
|
766 |
|
self.on_add_mixed(idx) |
|
|
805 |
|
if event_id == 2: |
|
806 |
|
self.mixed_couples.add(couple_indices) |
|
807 |
|
if self.on_add_mixed is not None: |
|
808 |
|
self.on_add_mixed(idx) |
|
809 |
|
else: |
|
810 |
|
self.red_couples.add(couple_indices) |
767 |
811 |
|
|
768 |
|
## checklist |
|
769 |
|
self.couples = {} # dict of active contacts {couple_indices: list of nodes} |
|
770 |
|
self.direct_contacts = {} # dict of direct contacts {couple_indices: node_idx} |
|
771 |
|
self.couples_stats = {} |
|
772 |
|
self.mixed_couples = set() |
|
773 |
|
self.red_couples = set() |
|
774 |
|
self._add_indices_to_update(j) # set of all the "j"s for the mutual updates |
|
775 |
|
self._nodes_to_check_outsides = [] #č seznam indexů, projedu jednoduše smyčkou |
|
776 |
812 |
|
|
777 |
|
self.red_couples.add((i, j)) |
|
778 |
813 |
|
|
779 |
|
self.mixed_couples.add((i, j)) |
|
780 |
814 |
|
|
781 |
815 |
|
|
782 |
816 |
|
|