iam-git / WellMet (public) (License: MIT) (since 2021-08-31) (hash sha1)
WellMet is pure Python framework for spatial structural reliability analysis. Or, more specifically, for "failure probability estimation and detection of failure surfaces by adaptive sequential decomposition of the design domain".
List of commits:
Subject Hash Author Date (UTC)
voronoi: WIP e9c247fef30cfb678bad9b955d6f6a94a0ff61e7 I am 2022-10-18 01:02:30
candynodex: hotfix to support numpy masking indexing f359123b72a3d998d5eed4b9e611a5e402a18c8d I am 2022-10-17 09:02:33
add new lightweight candynodes module to replace old heavy ugly candybox ca97509f47c100df90e1e06d82ed7c759627bfd0 I am 2022-10-17 06:31:33
qt_gui: move CandyBox creating to the individual DiceBox widgets 29253625129219b5e550f82cae3da0e53ef5bd47 I am 2022-10-16 03:17:55
voronoi: WIP 4855190869e06df740cc05c64e8b27b2c3c5a88d I am 2022-10-15 22:46:51
voronoi: WIP 0298b3a0563587ea4fc24fa99b51d2e01d517203 I am 2022-10-15 20:00:25
voronoi: WIP 4b80757fa26e3d40dceac888480ec3d814f6abc9 I am 2022-10-15 17:30:11
voronoi: WIP 7cadd1d01d7f4bc3f51e785fe6ebf8cae6ff839a I am 2022-10-15 03:12:54
voronoi: clean up and comment out ContactSolver 543f8482a925ff6cf8485b9be616b5bd3c714d13 I am 2022-10-14 04:24:40
qt_gui.qt_gui: use ConvexSolver instead of ContactSolver (which did not work correctly) c1e49a9b2c3cc13886d317b460d7598f661cf216 I am 2022-10-14 04:01:06
voronoi: add fantastic ConvexSolver 2853826e5ef1abc79d3ac2fb8289b13c45211a31 I am 2022-10-14 04:00:14
qt_gui.qt_plot: add (finally!) Numbers class 4cdc658c0fcc857c23c0e39e91e7a1ce5e1b30a1 I am 2022-10-13 06:23:46
qt_gui.qt_gui: show contacts in distance matrix. Based on ContactSolver for now 21bd6101888d9f06d7d6a7c6ba2732ff30fdd68d I am 2022-10-13 04:16:41
voronoi: ContactSolver is ready. Ale je to na nic. Pomalá, potvora 28e2442b0101eac2407ed4a69c6f757ffd579cf1 I am 2022-10-13 04:14:59
voronoi: add some preliminary lines of ContactSolver. WIP 6a203b278c9fa6de7da75c402c80f78d40164fdf I am 2022-10-12 23:38:59
voronoi: přídat pár těžkých smyček. WIP 7b0ffb602ae00ab2f12dc98d34c35ec20afa3cc4 I am 2022-10-12 00:13:36
add to repo voronoi module. WIP f43768c22d88fac7c7095be02d8c9b5620153976 I am 2022-10-11 03:29:49
convex_hull.Grick: malý puntičkářský fix v get_r() cfa07257b9ebadc21f2bd295d35978072fac19e9 I am 2022-10-10 07:14:26
qt_gui.qt_plot: add Grick to Ghull widget d90b9a87c3ef0989951a45b2a22346381ce16f02 I am 2022-10-10 03:17:24
convex_hull: implement Grick convex hull aproximation d09ca2e6aca41cfc67f3303eb97b97dd9c6f1fba I am 2022-10-10 03:15:52
Commit e9c247fef30cfb678bad9b955d6f6a94a0ff61e7 - voronoi: WIP
Author: I am
Author date (UTC): 2022-10-18 01:02
Committer name: I am
Committer date (UTC): 2022-10-18 01:02
Parent(s): f359123b72a3d998d5eed4b9e611a5e402a18c8d
Signer:
Signing key:
Signing status: N
Tree: c24503e28c0a55f15169b419c0d9941191349e82
File Lines added Lines deleted
wellmet/voronoi.py 64 53
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
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/iam-git/WellMet

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/iam-git/WellMet

Clone this repository using git:
git clone git://git.rocketgit.com/user/iam-git/WellMet

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main