File wellmet/voronoi.py changed (mode: 100644) (index 2524639..35fd8bb) |
... |
... |
from . import f_models |
16 |
16 |
from . import simplex as six |
from . import simplex as six |
17 |
17 |
from . import IS_stat |
from . import IS_stat |
18 |
18 |
from .IS_stat import IS |
from .IS_stat import IS |
19 |
|
from .candybox import CandyBox |
|
|
19 |
|
from .candynodes import CandyNodes |
20 |
20 |
from . import sball |
from . import sball |
21 |
21 |
|
|
22 |
22 |
|
|
|
... |
... |
class ContactVoronoi: |
454 |
454 |
#č (i, j)? poprvé ta čísla vidíme |
#č (i, j)? poprvé ta čísla vidíme |
455 |
455 |
i, j = couple_indices |
i, j = couple_indices |
456 |
456 |
|
|
457 |
|
# 1. Nejdřív - zda je přímy kontakt, prostě na usečce |
|
458 |
|
contact_node_model = np.sum(self.sampled_plan_model[[i, j]], axis=0) |
|
|
457 |
|
#č Nejdřív - zda je přímy kontakt, prostě na usečce |
|
458 |
|
couple_nodes = self.sampled_plan_model[[i, j]] |
|
459 |
|
contact_node_model = np.sum(couple_nodes, axis=0) |
459 |
460 |
np.divide(contact_node_model, 2, out=contact_node_model) |
np.divide(contact_node_model, 2, out=contact_node_model) |
460 |
461 |
|
|
|
462 |
|
#č bodík nebude mít vahu - nechť si s tím integrovačka poradí! |
|
463 |
|
idx, dd, ii, mask = self._store_masked(contact_node_model, couple_indices, event_id) |
|
464 |
|
|
|
465 |
|
#č kontakt neexistuje, netřeba nic robiť, j-ko i-čkem není dotčen |
|
466 |
|
if not (idx or self.CS.is_couple(couple_indices)): |
|
467 |
|
return None |
461 |
468 |
|
|
|
469 |
|
#č kontakt existuje, dáme vědět aktualizovačce |
|
470 |
|
#č (snad jediné místo kde tuhle funkci voláme) |
|
471 |
|
self._add_indices_to_update(j) |
462 |
472 |
|
|
463 |
473 |
|
|
464 |
|
dd, ii = tree.query(contact_node_model, k=2, p=self.p_norm) |
|
465 |
|
#č taková kontola je rychlejší jak volání numpy množinových funkcí |
|
466 |
|
if (i in ii) and (j in ii): |
|
467 |
|
|
|
468 |
|
#č přídat, zavolat kólbek |
|
469 |
|
f = self.sample_box.f_model |
|
470 |
|
#č zde je jistá nadbytečnost. |
|
471 |
|
#č Pro třídu je jednodušší prostě pokažde spočítat bodík, |
|
472 |
|
#č než je ukladat, sledovat, invalidovat. |
|
473 |
|
#č Jedině to může být zajimavé pro skřiňku |
|
474 |
|
#č a i pro ně - jenom smíšené bodíky |
|
475 |
|
contact_node = f.new_sample(contact_node_model, self.model_space) |
|
476 |
|
contact_node = CandyBox(contact_node, \ |
|
477 |
|
dd1=dd[:, 0], dd2=dd[:, 1], ii1=ii[:, 0], ii2=ii[:, 1]) |
|
478 |
|
|
|
479 |
|
idx = self.nodes.add(contact_node) |
|
480 |
|
## checklist |
|
481 |
|
#self.couples #č další kód, kdyby něco |
|
482 |
|
self.direct_contacts[couple_indices] = idx |
|
483 |
|
#self._nodes_to_check_outsides #č nemůže být outside #č není pravda |
|
484 |
|
|
|
485 |
|
# -1 = 'outside', 0=success, 1=failure, 2=mix |
|
486 |
|
if (event_id == 2) and (self.on_add_mixed is not None): |
|
487 |
|
self.on_add_mixed(idx) |
|
488 |
|
|
|
489 |
|
|
|
|
474 |
|
#č a teď deme vzorkovat |
|
475 |
|
ndim = len(contact_node_model) |
|
476 |
|
#č vzdalenost tamten strom už má spočítanou (pro zadanou p_norm) |
|
477 |
|
r = dd[0,0] |
|
478 |
|
# #č ale nechcu kvůli jedinému poloměru komplikovat kód |
|
479 |
|
# vec = couple_nodes[0] - couple_nodes[1] |
|
480 |
|
# r = np.sqrt(np.inner(vec, vec)) / 2 |
|
481 |
|
|
|
482 |
|
# initially we'll perform IS from multivariate Gaussian distribution |
|
483 |
|
# with center at contact node (i. e. in beetween of two points) |
|
484 |
|
# and single standard deviation (let's say "ball" sampling) |
|
485 |
|
#č r-ko dělíme base_r'kem k získání sigmy. |
|
486 |
|
sampling_plan_N, pdf = IS_stat.get_norm_plan(self.ns, ndim, \ |
|
487 |
|
mean=contact_node_model, |
|
488 |
|
std=r/self.base_r, design=None) |
|
489 |
|
|
|
490 |
|
idx, dd, ii, mask = self._store_masked(sampling_plan_N, couple_indices, event_id) |
|
491 |
|
|
|
492 |
|
if not idx: |
|
493 |
|
return None |
|
494 |
|
|
|
495 |
|
#č uspěch. Dodáme bodíkům vahy |
|
496 |
|
nodes = self.nodes[idx] |
|
497 |
|
w = nodes.pdf(self.model_space) / pdf[mask] |
|
498 |
|
nodes.w = w |
|
499 |
|
|
|
500 |
|
#č a spustíme adaptivní IS vzorkování |
|
501 |
|
self.init_sampling() |
|
502 |
|
|
490 |
503 |
|
|
491 |
|
#č přímy kontakt není, ale snad i tak existuje? |
|
492 |
|
elif not self.CS.is_couple(couple_indices): |
|
493 |
|
#č neexistuje, netřeba nic robiť, j-ko i-čkem není dotčen |
|
494 |
|
return |
|
495 |
|
|
|
496 |
|
#č kontakt existuje, deme vzorkovat |
|
497 |
504 |
|
|
498 |
505 |
|
|
499 |
506 |
|
|
500 |
|
# checklist |
|
501 |
|
#self.couples = #č přídá sample_couple, když se mu povede si oblast chytit |
|
502 |
|
#self.direct_contacts #č není |
|
503 |
|
#self.couples_stats = {} |
|
504 |
|
#self.mixed_couples = set() |
|
505 |
|
#self.red_couples = set() |
|
506 |
|
self._add_indices_to_update(j) #č kontakt je, apdejtneme |
|
507 |
|
#self._nodes_to_check_outsides #č přídá sample_couple kdyby něco |
|
508 |
507 |
|
|
509 |
508 |
def IS_norm(f, mean=0, std=1, sampling_space='G', nis=1000, design=None): |
def IS_norm(f, mean=0, std=1, sampling_space='G', nis=1000, design=None): |
510 |
509 |
""" |
""" |
|
... |
... |
class ContactVoronoi: |
802 |
801 |
č Proto i podtržitko v názvu |
č Proto i podtržitko v názvu |
803 |
802 |
""" |
""" |
804 |
803 |
i, j = couple_indices |
i, j = couple_indices |
805 |
|
dd, ii = tree.query(nodes_model, k=2, p=self.p_norm) |
|
|
804 |
|
dd, ii = tree.query(np.atleast_2d(nodes_model), k=2, p=self.p_norm) |
806 |
805 |
#č pro jediný bod jednoducha kontrola je rychlejší |
#č pro jediný bod jednoducha kontrola je rychlejší |
807 |
806 |
#č jak volání numpy množinových funkcí |
#č jak volání numpy množinových funkcí |
808 |
807 |
# (i in ii) and (j in ii) |
# (i in ii) and (j in ii) |
|
... |
... |
class ContactVoronoi: |
811 |
810 |
mask = np.all((ii == i) | (ii == j), axis=1) |
mask = np.all((ii == i) | (ii == j), axis=1) |
812 |
811 |
|
|
813 |
812 |
if not np.any(mask): |
if not np.any(mask): |
814 |
|
return False |
|
|
813 |
|
return False, dd, ii, mask |
815 |
814 |
|
|
816 |
815 |
|
|
817 |
816 |
#č přídat, zavolat kólbek |
#č přídat, zavolat kólbek |
818 |
817 |
f = self.sample_box.f_model |
f = self.sample_box.f_model |
|
818 |
|
#č tady je to super, ťažké datové struktury f-modelu |
|
819 |
|
#č vytvaříme na jíž vyfiltrovaných datéch |
819 |
820 |
nodes = f.new_sample(nodes_model[mask], self.model_space) |
nodes = f.new_sample(nodes_model[mask], self.model_space) |
820 |
|
nodes = CandyBox(nodes, dd1=dd[:, 0], dd2=dd[:, 1], \ |
|
821 |
|
ii1=ii[:, 0], ii2=ii[:, 1]) |
|
822 |
|
|
|
|
821 |
|
couple_stats = {'event_id':event_id, 'couple':couple_indices} |
|
822 |
|
nodes = CandyNodes(nodes, couple_stats) |
823 |
823 |
idx = self.nodes.add(nodes) |
idx = self.nodes.add(nodes) |
|
824 |
|
|
|
825 |
|
#č červené kontakty prostě rovnou integrujeme |
|
826 |
|
#č takže netřeba pro ně ukladat zbytečná data |
|
827 |
|
# -1 = 'outside', 0=success, 1=failure, 2=mix |
|
828 |
|
if event_id == 2: |
|
829 |
|
dd = dd[mask] |
|
830 |
|
ii = ii[mask] |
|
831 |
|
nodes.dd1 = dd[:, 0] |
|
832 |
|
nodes.dd2 = dd[:, 1] |
|
833 |
|
nodes.ii1 = ii[:, 0] |
|
834 |
|
nodes.ii2 = ii[:, 1] |
|
835 |
|
if self.on_add_mixed is not None: |
|
836 |
|
self.on_add_mixed(idx) |
|
837 |
|
|
|
838 |
|
|
824 |
839 |
## checklist |
## checklist |
825 |
840 |
self.couples[couple_indices].append(idx) |
self.couples[couple_indices].append(idx) |
826 |
841 |
#self.couples_stats #č nevím |
#self.couples_stats #č nevím |
|
... |
... |
class ContactVoronoi: |
829 |
844 |
#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 |
830 |
845 |
self._nodes_to_check_outsides.append(idx) |
self._nodes_to_check_outsides.append(idx) |
831 |
846 |
|
|
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) |
|
835 |
|
|
|
836 |
|
return idx |
|
|
847 |
|
return idx, dd, ii, mask |
837 |
848 |
|
|
838 |
849 |
|
|
839 |
850 |
|
|