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 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
qt_gui.qt_gui: distance matrix viewer is ready a532e5259c081a1aff193d3b61e0104c42b08f20 I am 2022-10-08 20:52:14
qt_gui.qt_gui: prepare distance matrix window 4eaea3305643c60c35f0b22421a7e57dbe7a7817 I am 2022-10-08 02:59:01
qt_gui.qt_graph_widgets: set up x limits for all graph widgets 413d114f6a4e4b45c6cd44959cc42588bb7c8008 I am 2022-10-07 22:54:46
qt_gui.qt_plot: set up equal aspect by default 11bfe09b3e96881ef6f7c8202a6723b6e8adc03a I am 2022-10-07 21:41:18
Commit 4855190869e06df740cc05c64e8b27b2c3c5a88d - voronoi: WIP
Author: I am
Author date (UTC): 2022-10-15 22:46
Committer name: I am
Committer date (UTC): 2022-10-15 22:46
Parent(s): 0298b3a0563587ea4fc24fa99b51d2e01d517203
Signer:
Signing key:
Signing status: N
Tree: 2414cd3274d466b7eef7d696240926bc2d4af1a4
File Lines added Lines deleted
wellmet/voronoi.py 56 34
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
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