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".

/gl_plot.py (1092b3b9f05b11d0c53b3aa63df2460ec355085d) (42820 bytes) (mode 100644) (type blob)

#!/usr/bin/env python
# coding: utf-8

import pyqtgraph as pg
import pyqtgraph.opengl as gl
from pyqtgraph.Qt import QtGui
from pyqtgraph.Qt import QtCore


import numpy as np
import pandas as pd # required for estimation graph

from scipy import spatial

from . import estimation as stm
from . import qt_plot
         
def qt_gui_plot_3d(sample_box, space='R', *args, **kwargs):
    """
    This function will start Qt graph window in event loop
    """
    
    return QtGuiPlot3D(sample_box, space, *args, **kwargs)
    

### Define a top-level widget to hold everything
class QtGuiPlot3D(qt_plot.QtGuiPlot2D):
    #sb_runned = QtCore.pyqtSignal()
    
    def initialize_central_widget(self):
        self.central_widget = gl.GLViewWidget()
        self.redraw_called.connect(self.redraw_plot)
        
        self.base_plotting = BasePlotting(self)
        self.px_size = 5

    def redraw_plot(self):
        try:
            self.central_widget.clear()
            self.central_widget.reset()
        except: #č 0.10 ještě neměla ty funkce
            for item in self.central_widget.items:
                item._setView(None)
            self.central_widget.items = []
            self.central_widget.update()
        self.central_widget.opts['fov'] = 3

        

    def plot_setup(self):
        self.view_items = []
        self.view_items.append(UnitCube(self))
        self.view_items.append(Axes(self))
        self.view_items.append(Grid(self))
        self.view_items.append(LastShot(self))
        self.view_items.append(Density(self))
        self.view_items.append(ConvexHull(self))
        self.view_items.append(Facets(self))
        self.view_items.append(Wireframe(self))
        

        dock = dock_r = QtGui.QDockWidget("Simplex-based pf estimation", self)
        dock.setWidget(SimplexEstimationWidget(self, dock))
        self.view.addAction(dock.toggleViewAction())
        self.dockables.append(dock)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock)
        
        #!
        dock = QtGui.QDockWidget("Tesselation-based pf estimation", self)
        dock.setWidget(VoronoiEstimationWidget(self, dock))
        self.view.addAction(dock.toggleViewAction())
        self.dockables.append(dock)
        #self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock)
        self.tabifyDockWidget(dock_r, dock)
        
        
        dock = QtGui.QDockWidget("Blackbox's candidates", self)
        dock.setWidget(CandidatesWidget(self, dock))
        self.view.addAction(dock.toggleViewAction())
        self.dockables.append(dock)
        self.tabifyDockWidget(dock_r, dock)


        
        



class BasePlotting(gl.GLScatterPlotItem):
    def __init__(self, w):
        super().__init__()
        self.w = w
        #self.w.box_runned.connect(self.redraw) #č dublikuje slice_changed
        self.w.space_changed.connect(self.plot)
        self.w.slice_changed.connect(self.plot)
        self.w.redraw_called.connect(self.redraw)
        
    #č důležité je, že GLScatterPlotItem nemá .redraw()
    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)
        
    def plot(self):
        nsim = self.w.slider.value()
        
        pos = getattr(self.w.sample_box, self.w.space)[:nsim][:,:3]
        color = np.empty((nsim, 4))
        failsi = self.w.sample_box.failsi[:nsim]
        color[failsi] = (1, 0, 0, 1)
        color[~failsi] = (0, 1, 0, 1)

        self.setData(pos=pos, color=color, size=self.w.px_size*1.5)





class UnitCube(gl.GLBoxItem):
    def __init__(self, w):
        super().__init__()
        self.w = w
        self.w.space_changed.connect(self.plot)
        self.w.redraw_called.connect(self.redraw)

        self.item = QtGui.QListWidgetItem('Unit cube')
        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
        self.item.setCheckState(QtCore.Qt.Checked)
        self.w.list_view.addItem(self.item)
        self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)

    def plot(self):
        if self.item.checkState() and (self.w.space in ('P', 'U')):
            self.setSize(1, 1, 1)
            self.show()
        elif self.item.checkState() and (self.w.space in ('aP', 'aU')):
            x, y, z, *__ = (*self.w.sample_box.alpha,)
            self.setSize(x, y, z)
            self.show()
        else:
            self.hide()


class LastShot(gl.GLScatterPlotItem):
    def __init__(self, w):
        super().__init__()
        self.w = w
        self.w.box_runned.connect(self.plot)
        self.w.space_changed.connect(self.plot)
        self.w.redraw_called.connect(self.redraw)

        self.item = QtGui.QListWidgetItem('Last shot')
        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
        self.item.setCheckState(QtCore.Qt.Checked)
        self.w.list_view.addItem(self.item)
        self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)

    def plot(self):
        if self.item.checkState() and (self.w.last_shot is not None):
            pos = getattr(self.w.last_shot, self.w.space)[:,:3]
            self.setData(pos=pos, color=(0, 0, 1, .7), size=self.w.px_size*2)
            self.show()
        else:
            self.hide()



#č Nekreslí to co má (vidím pouze jednu čáru)

##class Axes(gl.GLAxisItem):
##    def __init__(self, w):
##        super().__init__()
##        self.w = w
##        self.w.redraw_called.connect(self.redraw)
##
##        self.item = QtGui.QListWidgetItem('Axes')
##        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
##        self.item.setCheckState(QtCore.Qt.Checked)
##        self.w.list_view.addItem(self.item)
##        self.w.list_view.itemChanged.connect(self.plot)
##        
##
##    def redraw(self):
##        self.plot()
##        self.w.central_widget.addItem(self)
##
##    def plot(self):
##        if self.item.checkState():
##            self.show()
##        else:
##            self.hide()


class Axes:
    def __init__(self, w):
        pos = np.array([[0,0,0],[1,0,0], [0,0,0],[0,1,0], [0,0,0],[0,0,1]])
        color = np.array([[255, 0, 0, 255],[0, 0, 0, 0], [0, 255, 0, 255],[0, 0, 0, 0], [0, 0, 255, 255],[0, 0, 0, 0]])
        self.axes = gl.GLLinePlotItem(pos=pos, color=color, width=2, mode='lines')
        
        self.w = w
        self.w.redraw_called.connect(self.redraw)

        self.item = QtGui.QListWidgetItem('Axes')
        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
        self.item.setCheckState(QtCore.Qt.Checked)
        self.w.list_view.addItem(self.item)
        self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self.axes)

    def plot(self):
        if self.item.checkState():
            self.axes.show()
        else:
            self.axes.hide()



class Grid:
    def __init__(self, w):
        self.gx = gl.GLGridItem()
        self.gx.setSize(10, 10, 1)
        self.gx.rotate(90, 0, 1, 0)
        #gx.translate(-5, 0, 5)
        
        self.gy = gl.GLGridItem()
        self.gy.setSize(10, 10, 1)
        self.gy.rotate(90, 1, 0, 0)
        #gy.translate(0, -10, 10)
        
        self.gz = gl.GLGridItem()
        self.gz.setSize(10, 10, 1)
        #self.gz.translate(0, 0, 0)
        
        self.w = w
        self.w.space_changed.connect(self.plot)
        self.w.redraw_called.connect(self.redraw)

        self.item = QtGui.QListWidgetItem('Grid')
        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
        self.item.setCheckState(QtCore.Qt.Unchecked)
        self.w.list_view.addItem(self.item)
        self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self.gx)
        self.w.central_widget.addItem(self.gy)
        self.w.central_widget.addItem(self.gz)

    def plot(self):
        if self.item.checkState():# and (self.w.space in ( 'Rn', 'GK', 'G')):
            self.gx.show()
            self.gy.show()
            self.gz.show()
        else:
            self.gx.hide()
            self.gy.hide()
            self.gz.hide()




class ConvexHull(gl.GLMeshItem):
    def __init__(self, w):
        ## Mesh item will automatically compute face normals.
        super().__init__(smooth=True, shader='edgeHilight') # edgeHilight shaded
        #self.setGLOptions('opaque')
        self.nsim = -1
        
        self.w = w
        #č já asi nechcu ani snažit sa něčo zobraziť
        #č z více dimenzí
        if self.w.sample_box.nvar == 3: 
            self.w.box_runned.connect(self.plot)
            self.w.space_changed.connect(self.plot)
            self.w.redraw_called.connect(self.redraw)

            self.failure_item = QtGui.QListWidgetItem('ConvexHull Failure')
            self.failure_item.setFlags(self.failure_item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.failure_item.setCheckState(QtCore.Qt.Checked)
            self.w.list_view.addItem(self.failure_item)

            self.success_item = QtGui.QListWidgetItem('ConvexHull Success')
            self.success_item.setFlags(self.success_item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.success_item.setCheckState(QtCore.Qt.Checked)
            self.w.list_view.addItem(self.success_item)

            
            self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)

    def recalculate(self):
        if (self.w.sample_box.nsim != len(self.w.sample_box.convex_hull.points)):
            #č ConvexHull nemichá vzorky a nedělá ďupy - byla to chyba v Blackboxu
            print(self.__class__.__name__ + \
                  ": convex hull points mismatch. Switching to the failsafe code.")
            sampled_plan_tri = getattr(self.w.sample_box, self.w.sample_box.tri_space)
            tree = spatial.cKDTree(sampled_plan_tri)
            self.points = self.w.sample_box.convex_hull.points
            dd, ii = tree.query(self.points, k=1, p=2)

            self.simplices = self.w.sample_box.convex_hull.simplices
            box_facets = ii[self.simplices.flatten()].reshape(-1, 3)
            self.events = self.w.sample_box.get_events(box_facets)


            nodes_colors = np.empty((self.w.sample_box.nsim, 4))
            nodes_colors[self.w.sample_box.failsi] = np.array([253, 93, 97, 0])/255 
            nodes_colors[~self.w.sample_box.failsi] = np.array([67, 255, 81, 0])/255
            

            self.vertex_colors = nodes_colors[ii]

        else: #č reabilitace ConvexHull
            self.points = self.w.sample_box.convex_hull.points
            self.simplices = self.w.sample_box.convex_hull.simplices
            self.events = self.w.sample_box.get_events(self.simplices)


            nodes_colors = np.empty((self.w.sample_box.nsim, 4))
            nodes_colors[self.w.sample_box.failsi] = np.array([253, 93, 97, 0])/255 
            nodes_colors[~self.w.sample_box.failsi] = np.array([67, 255, 81, 0])/255
            

            self.vertex_colors = nodes_colors



        
        # marker
        self.nsim = self.w.sample_box.nsim


    def plot(self):
        if (self.failure_item.checkState() + self.success_item.checkState())\
                               and (self.w.space == self.w.sample_box.tri_space):
            try:
                if self.nsim != self.w.sample_box.nsim:
                    self.recalculate()
                    
                #face_colors = np.empty((len(self.simplices), 4), dtype=np.int16)
                # sorry for that
                if self.failure_item.checkState():
                    mask_1 = self.events==1
                else:
                    mask_1 = self.events==100500

                if self.success_item.checkState():
                    mask_0 = self.events==0
                else:
                    mask_0 = self.events==100500

                #mask_2 = self.events!=2

                mask = np.any([mask_0, mask_1], axis=0)

                
                self.setMeshData(vertexes=self.points, faces=self.simplices[mask], vertexColors=self.vertex_colors, \
                                 drawEdges=True, edgeColor=(1, 1, 0, 1))
            except BaseException as e:
                msg = "nepovedlo se nám spočítat konvexní obálku "
                error_msg = self.__class__.__name__ + ": " + msg + repr(e)
                print(error_msg)
                
            self.show()
        else:
            self.hide()

        

class Facets(gl.GLMeshItem):
    def __init__(self, w):
        ## Mesh item will automatically compute face normals.
        super().__init__(smooth=True, shader='shaded') # edgeHilight shaded
        #self.setGLOptions('opaque')
        self.nsim = -1
        
        self.w = w
        #č já asi nechcu ani snažit sa něčo zobraziť
        #č z více dimenzí
        if self.w.sample_box.nvar == 3: 
            self.w.box_runned.connect(self.plot)
            self.w.space_changed.connect(self.plot)
            self.w.redraw_called.connect(self.redraw)

            self.failure_item = QtGui.QListWidgetItem('Failure facets')
            self.failure_item.setFlags(self.failure_item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.failure_item.setCheckState(QtCore.Qt.Checked)
            self.w.list_view.addItem(self.failure_item)

            self.success_item = QtGui.QListWidgetItem('Success facets')
            self.success_item.setFlags(self.success_item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.success_item.setCheckState(QtCore.Qt.Checked)
            self.w.list_view.addItem(self.success_item)

            
            self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)

    def recalculate(self):
        self.points = self.w.sample_box.tri.points

        self.simplices = self.w.sample_box.tri.simplices
        self.s_events = self.w.sample_box.get_events(self.simplices)

        self.mixed_simplices = self.simplices[self.s_events==2]

        self.facets = np.vstack((self.mixed_simplices[:,:3], self.mixed_simplices[:,1:],\
                                 self.mixed_simplices[:,[0,2,3]], self.mixed_simplices[:,[0,1,3]]))

        # f_events
        self.events = self.w.sample_box.get_events(self.facets)
                    

        self.nodes_colors = np.empty((self.w.sample_box.nsim, 4))
        self.nodes_colors[self.w.sample_box.failsi] = np.array([203, 83, 87, 0])/255 
        self.nodes_colors[~self.w.sample_box.failsi] = np.array([57, 205, 71, 0])/255
        
        
        # marker
        self.nsim = self.w.sample_box.nsim


    def plot(self):
        if (self.failure_item.checkState() + self.success_item.checkState())\
                               and (self.w.space == self.w.sample_box.tri_space):
            try:
                if self.nsim != self.w.sample_box.nsim:
                    self.recalculate()
                    
                #face_colors = np.empty((len(self.simplices), 4), dtype=np.int16)
                # sorry for that
                if self.failure_item.checkState():
                    mask_1 = self.events==1
                else:
                    mask_1 = self.events==100500

                if self.success_item.checkState():
                    mask_0 = self.events==0
                else:
                    mask_0 = self.events==100500

                #mask_2 = self.events!=2

                mask = np.any([mask_0, mask_1], axis=0)

                self.setMeshData(vertexes=self.points, faces=self.facets[mask], vertexColors=self.nodes_colors, \
                                 drawEdges=True, edgeColor=(1, 1, 0, 1))
            except BaseException as e:
                msg = "nepovedlo se nám spočítat stěny "
                error_msg = self.__class__.__name__ + ": " + msg + repr(e)
                print(error_msg)
                
            self.show()
        else:
            self.hide()   
        
        


class Wireframe(gl.GLMeshItem):
    def __init__(self, w):
        super().__init__(smooth=False, drawFaces=False, drawEdges=True) 
        self.nsim = -1
        
        self.w = w
        #č já asi nechcu ani snažit sa něčo zobraziť
        #č z více dimenzí
        if self.w.sample_box.nvar == 3: 
            self.w.box_runned.connect(self.plot)
            self.w.space_changed.connect(self.plot)
            self.w.redraw_called.connect(self.redraw)

            self.item = QtGui.QListWidgetItem('Wireframe')
            self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.item.setCheckState(QtCore.Qt.Checked)
            self.w.list_view.addItem(self.item)

            
            self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self)

    def recalculate(self):
        self.points = self.w.sample_box.tri.points

        self.simplices = self.w.sample_box.tri.simplices


        self.facets = np.vstack((self.simplices[:,:3], self.simplices[:,1:],\
                                 self.simplices[:,[0,2,3]], self.simplices[:,[0,1,3]]))



        self.setMeshData(vertexes=self.points, faces=self.facets, drawEdges=True, edgeColor=(0.5, 0.5, 0.5, 1))
        
        # marker
        self.nsim = self.w.sample_box.nsim


    def plot(self):
        if self.item.checkState() and (self.w.space == self.w.sample_box.tri_space):
            try:
                if self.nsim != self.w.sample_box.nsim:
                    self.recalculate()

                
            except BaseException as e:
                msg = "nepovedlo se nám spočítat stěny "
                error_msg = self.__class__.__name__ + ": " + msg + repr(e)
                print(error_msg)
                
            self.show()
        else:
            self.hide()   
        


#☺ čota mne ne chočetsa eto dělať
            
##class FlexFrame(GLLinePlotItem):
##    def __init__(self, w):
##        super().__init__(smooth=False, drawFaces=False, drawEdges=True) 
##        self.nsim = -1
##        
##        pos = np.array([[0,0,0],[1,0,0], [0,0,0],[0,1,0], [0,0,0],[0,0,1]])
##        color = np.array([[255, 0, 0, 255],[0, 0, 0, 0], [0, 255, 0, 255],[0, 0, 0, 0], [0, 0, 255, 255],[0, 0, 0, 0]])
##        self.axes = gl.GLLinePlotItem(pos=pos, color=color, width=2, mode='lines')
##        
##        self.w = w
##        self.w.slice_changed.connect(self.plot)
##        self.w.space_changed.connect(self.plot)
##        self.w.redraw_called.connect(self.redraw)
##
##        self.item = QtGui.QListWidgetItem('FlexFrame')
##        self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
##        self.item.setCheckState(QtCore.Qt.Checked)
##        self.w.list_view.addItem(self.item)
##        self.w.list_view.itemChanged.connect(self.plot)
##
##
##    def recalculate(self):
##        self.points = self.w.sample_box.tri.points
##
##        self.simplices = self.w.sample_box.tri.simplices
##
##
##        self.facets = np.vstack((self.simplices[:,:3], self.simplices[:,1:],\
##                                 self.simplices[:,[0,2,3]], self.simplices[:,[0,1,3]]))
##
##
##
##        self.setMeshData(vertexes=self.points, faces=self.facets, drawEdges=True, edgeColor=(0.5, 0.5, 0.5, 1))
##
##        
##        
##        # take coordinates in the space, where triangulation has been performed
##        sampled_plan_tri = getattr(self.sample_box, self.sample_box.tri_space)
##        ns = 100
##        
##        if len(self.triangulation) < len(self.sample_box.tri.simplices):
##            x = y = ()
##            gap = len(self.sample_box.tri.simplices) - len(self.triangulation)
##            for __ in range(gap):
##                self.triangulation.append(self.plotWidget.plot(x, y, pen=0.7))
##        
##        for triangle, plot_item in zip(self.sample_box.tri.simplices, self.triangulation):
##            x_tri = np.linspace(sampled_plan_tri[triangle[0],0], sampled_plan_tri[triangle[1],0], ns, endpoint=False)
##            y_tri = np.linspace(sampled_plan_tri[triangle[0],1], sampled_plan_tri[triangle[1],1], ns, endpoint=False)
##            x_tri = np.append(x_tri, np.linspace(sampled_plan_tri[triangle[1],0], sampled_plan_tri[triangle[2],0], ns, endpoint=False))
##            y_tri = np.append(y_tri, np.linspace(sampled_plan_tri[triangle[1],1], sampled_plan_tri[triangle[2],1], ns, endpoint=False))
##            x_tri = np.append(x_tri, np.linspace(sampled_plan_tri[triangle[2],0], sampled_plan_tri[triangle[0],0], ns, endpoint=True))
##            y_tri = np.append(y_tri, np.linspace(sampled_plan_tri[triangle[2],1], sampled_plan_tri[triangle[0],1], ns, endpoint=True))
##            
##            tri_bound_tri = np.array((x_tri, y_tri)).T
##            # vytvořme sample
##            tri_bound = self.sample_box.sampled_plan.new_sample(tri_bound_tri, space=self.sample_box.tri_space)
##            
##            # Update the data
##            #print("Суредасько", tri_bound)
##            plot_item.setData(*getattr(tri_bound, self.space).T)
##                    
##
##
##
##        
##        # marker
##        self.nsim = self.w.sample_box.nsim
##
##
##    def redraw(self):
##        self.plot()
##        self.w.central_widget.addItem(self.axes)
##
##    def plot(self):
##        if self.item.checkState():
##            try:
##                self.recalculate()
##            except BaseException as e:
##                msg = "error during triangulation drawing"
##                error_msg = self.__class__.__name__ + ": " + msg + repr(e)
##                print(error_msg)
##                
##            self.axes.show()
##        else:
##            self.axes.hide()




class Density:
    def __init__(self, w):
        self.w = w
        #č já asi nechcu ani snažit sa něčo zobraziť
        #č z více dimenzí
        if self.w.sample_box.nvar == 3: 
            self.w.space_changed.connect(self.plot)
            self.w.redraw_called.connect(self.redraw)

            
            self.v = gl.GLVolumeItem(self.recalculate())
            self.space = self.w.space
            self.v.scale(0.1, .10, .10)
            self.v.translate(-5,-5,-5)

            self.item = QtGui.QListWidgetItem('Density')
            self.item.setFlags(self.item.flags() | QtCore.Qt.ItemIsUserCheckable)
            self.item.setCheckState(QtCore.Qt.Unchecked)
            self.w.list_view.addItem(self.item)

            self.w.list_view.itemChanged.connect(self.plot)
        

    def redraw(self):
        self.plot()
        self.w.central_widget.addItem(self.v)

    def recalculate(self):
        #č strašně drahý, nechce se mi to pořádně udělat
        #data = np.fromfunction(lambda i,j,k:self.w.sample_box.pdf((np.array([[i,j,k]])-[50, 50, 50])/10, self.w.space), (100,100,100))

        # ničemu nerozumím
        grid = (np.mgrid[0:100,0:100, 0:100].T.reshape(-1, 3) - [50, 50, 50])/10
        shape = (100, 100, 100)
        sample = np.array((grid[:, 2], grid[:, 1], grid[:, 0])).T
        data = self.w.sample_box.sample_pdf(sample, self.w.space)
        data = data.reshape((100, 100, 100))
        
        d2 = np.empty(data.shape + (4,), dtype=np.ubyte)
        d2[..., 0] = np.full(shape, 0)
        d2[..., 1] = np.full(shape, 200)
        d2[..., 2] = np.full(shape, 200)
        d2[..., 3] = data * (255./data.max())

        return d2
        
        


    def plot(self):
        if self.item.checkState():
            if self.w.space != self.space:
                self.v.setData(self.recalculate())
                self.space = self.w.space
            self.v.show()
        else:
            self.v.hide()   







"""
=============
Эскерон виӝет 
Widgety odhadů
Estimation widgets
===================
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"""

        
        
class SimplexEstimationWidget(qt_plot.FastSimplexEstimationWidget):
        
        
    def callback(self, sx=None, nodes=None, cell_stats=None, simplex=None, *args, **kwargs):
        # stm trianguľaciju pokažde provadí znovu, proto skoro nemá cenu drbat se s její znovupoužitím
        if (simplex is not None) and (simplex.nvar==3):
            ns = 30
            
            
            simplex_tri = getattr(simplex, sx.tri_space)
            x_tri_1 = np.linspace(simplex_tri[0,0], simplex_tri[1,0], ns, endpoint=False)
            y_tri_1 = np.linspace(simplex_tri[0,1], simplex_tri[1,1], ns, endpoint=False)
            z_tri_1 = np.linspace(simplex_tri[0,2], simplex_tri[1,2], ns, endpoint=False)
            
            x_tri_2 = np.linspace(simplex_tri[1,0], simplex_tri[2,0], ns, endpoint=False)
            y_tri_2 = np.linspace(simplex_tri[1,1], simplex_tri[2,1], ns, endpoint=False)
            z_tri_2 = np.linspace(simplex_tri[1,2], simplex_tri[2,2], ns, endpoint=False)
            
            x_tri_3 = np.linspace(simplex_tri[2,0], simplex_tri[3,0], ns, endpoint=True)
            y_tri_3 = np.linspace(simplex_tri[2,1], simplex_tri[3,1], ns, endpoint=True)
            z_tri_3 = np.linspace(simplex_tri[2,2], simplex_tri[3,2], ns, endpoint=True)
                
            
            tri_bound_tri = np.concatenate(((x_tri_1, y_tri_1, z_tri_1),\
                                            (x_tri_2, y_tri_2, z_tri_2),\
                                            (x_tri_3, y_tri_3, z_tri_3)), axis=1).T
            # vytvořme sample
            tri_bound = self.sb_item.sample_box.sampled_plan.new_sample(tri_bound_tri,\
                                                                        space=sx.tri_space)
            
            # draw 
            pos = getattr(tri_bound, self.sb_item.space)
            plot_item = gl.GLLinePlotItem(pos=pos)
            self.sb_item.central_widget.addItem(plot_item)
            
            # uložíme data
            self.triangulation.append((tri_bound, plot_item))

            #
            #čs a eště raz
            #
            simplex_tri = getattr(simplex, sx.tri_space)
            x_tri_1 = np.linspace(simplex_tri[1,0], simplex_tri[3,0], ns, endpoint=False)
            y_tri_1 = np.linspace(simplex_tri[1,1], simplex_tri[3,1], ns, endpoint=False)
            z_tri_1 = np.linspace(simplex_tri[1,2], simplex_tri[3,2], ns, endpoint=False)
            
            x_tri_2 = np.linspace(simplex_tri[3,0], simplex_tri[0,0], ns, endpoint=False)
            y_tri_2 = np.linspace(simplex_tri[3,1], simplex_tri[0,1], ns, endpoint=False)
            z_tri_2 = np.linspace(simplex_tri[3,2], simplex_tri[0,2], ns, endpoint=False)
            
            x_tri_3 = np.linspace(simplex_tri[0,0], simplex_tri[2,0], ns, endpoint=True)
            y_tri_3 = np.linspace(simplex_tri[0,1], simplex_tri[2,1], ns, endpoint=True)
            z_tri_3 = np.linspace(simplex_tri[0,2], simplex_tri[2,2], ns, endpoint=True)
                
            tri_bound_tri = np.concatenate(((x_tri_1, y_tri_1, z_tri_1),\
                                            (x_tri_2, y_tri_2, z_tri_2),\
                                            (x_tri_3, y_tri_3, z_tri_3)), axis=1).T
            # vytvořme sample
            tri_bound = self.sb_item.sample_box.sampled_plan.new_sample(tri_bound_tri,\
                                                                        space=sx.tri_space)
            
            # draw 
            pos = getattr(tri_bound, self.sb_item.space)
            plot_item = gl.GLLinePlotItem(pos=pos)
            self.sb_item.central_widget.addItem(plot_item)
            
            # uložíme data
            self.triangulation.append((tri_bound, plot_item))



            
        
        
        #    
        # tečičky
        #

        event = cell_stats['event']
        cell_probability = cell_stats['cell_probability']
        if event in self.max_simplices:
            cm = self.param.getValues()[event][0] #č očekávám tam kolor mapu
            
            #č chcu ještě na konci prekreslit s různejma barvičkama, podle obsahu pravděpodobnosti
            # zkontrolujeme probability
            if self.max_simplices[event] < cell_probability:
                self.max_simplices[event] = cell_probability
                # a hned všecko dotyčné přebarvíme podle obsahu pravděpodobnosti
                for self_simplex in self.simplices:
                    if event == self_simplex[2]['event']:
                        # zde cell_probability se rovná self.p_cell_max[event]
                        # ale bacha! Nesplet se jinde!
                        #č nechť zůstane starý nazev
                        blue_intensity = self_simplex[2]['cell_probability'] / cell_probability
                        color = cm.mapToFloat(blue_intensity)
                        #č tam prostě MUSÍ být tuple
                        self_simplex[1].setData(color=tuple(color))

            blue_intensity = cell_probability / self.max_simplices[event]
            color = cm.mapToFloat(blue_intensity)
        else: # outside
            color = (0.6, 0.6, 0.6, 1)
        
        
        # draw tečičky
        #
        pos = getattr(nodes, self.sb_item.space)[:,:3]
        
        #symbolSize = np.sqrt(nodes.w / min(nodes.w)) # not bad
        size = self.param.getValues()['node (pixel) size'][0]
        #č tam prostě MUSÍ být tuple
        plot_item = gl.GLScatterPlotItem(pos=pos, size=size, color=tuple(color))
        self.sb_item.central_widget.addItem(plot_item)
        
        # uložíme data
        self.simplices.append((nodes, plot_item, cell_stats))
        
        
        
        # keep the GUI responsive :)
        self.sb_item.app.processEvents()



        
            
    def recolor(self):
        with pg.BusyCursor():
            # keep the GUI responsive :)
            self.sb_item.app.processEvents()
            #č nejdřív triangulace
            for tri_bound, plot_item in self.triangulation:
                plot_item.show()

            #č teď tečičky    
            for nodes, plot_item, cell_stats in self.simplices:
                event = cell_stats['event']
                if event in self.max_simplices:
                    cell_probability = cell_stats['cell_probability']
                    cm = self.param.getValues()[event][0] #č očekávám tam kolor mapu
                    blue_intensity = cell_probability / self.max_simplices[event]
                    color = cm.mapToFloat(blue_intensity)
                else: # outside
                    color = (0.6, 0.6, 0.6, 1)
                #symbolSize = np.sqrt(nodes.w / min(nodes.w)) # not bad
                size = self.param.getValues()['node (pixel) size'][0]
                #č tam prostě MUSÍ být tuple
                plot_item.setData(size=size, color=tuple(color))
                plot_item.show()
        

    def on_space_changed(self, *args, **kwargs):
        # nejdřív triangulace
        for tri_bound, plot_item in self.triangulation:
            pos = getattr(tri_bound, self.sb_item.space)
            plot_item.setData(pos=pos)
            plot_item.show()

        # teď tečičky
        for nodes, plot_item, cell_stats in self.simplices:
            pos = getattr(nodes, self.sb_item.space)[:,:3]
            plot_item.setData(pos=pos)
            plot_item.show()
            





class VoronoiEstimationWidget(qt_plot.VoronoiEstimationWidget):

        

    def on_space_changed(self, *args, **kwargs):
        # teď tečičky
        for nodes, plot_item, cell_stats in self.cells:
            pos = getattr(nodes, self.sb_item.space)[:,:3]
            plot_item.setData(pos=pos)
        
    
        
        
            
        
    def node_pf_coloring(self, estimation=None, nodes=None, cell_stats=None, out_nodes=None, *args, **kwargs):
        """
        if nodes and cell_stats  provided we will add them to self.cells
        otherwise function redraw items in self.cells
        """
        
        symbol_size = self.param.getValues()['node (pixel) size'][0]
        if nodes is None:
            for nodes, plot_item, cell_stats in self.cells:
                colors = self.node_pf_colors(nodes, cell_stats)
                plot_item.setData(color=colors, size=symbol_size)
                plot_item.show()
                
        
        # máme nodes, tj. jedeme poprvé        
        else:
            colors = self.node_pf_colors(nodes, cell_stats)
            pos = getattr(nodes, self.sb_item.space)[:,:3]
            plot_item = gl.GLScatterPlotItem(pos=pos, size=symbol_size, color=colors)
            self.sb_item.central_widget.addItem(plot_item)
            
            # uložíme data
            self.cells.append((nodes, plot_item, cell_stats))
            
            # keep the GUI responsive :)
            self.sb_item.app.processEvents()
            
            
            
            
    def node_pf_colors(self, nodes, cell_stats):
        
            
        # zas, нет ножек - нет мультиков
        # node_pf_estimations nemusejí bejt
        try:
            # zkusmě pro jednoduchost 
            # čírou RGB hračku
            npf = nodes.node_pf_estimations
            cm = pg.colormap.ColorMap((0,1), [(0, 255, 0, 255), (255, 0, 0, 255)])
            return cm.mapToFloat(npf)
            
        except BaseException as e:
            msg = "node_pf_coloring has problems "
            error_msg = self.__class__.__name__ + ": " + msg + repr(e)
            print(error_msg)
            # simple coloring
            event = cell_stats['event']
            return self.get_color(event)
        

        
        
    
    def simple_coloring(self, nodes=None, cell_stats=None, *args, **kwargs):
        """
        if nodes and cell_stats  provided we will add them to self.cells
        otherwise function redraw items in self.cells
        """
        symbol_size = self.param.getValues()['node (pixel) size'][0]
        
        if nodes is None:
            for nodes, plot_item, cell_stats in self.cells:
                event = cell_stats['event']
                color = self.get_color(event)
                #symbolSize = np.sqrt(nodes.w / min(nodes.w)) # not bad
                plot_item.setData(color=color, size=symbol_size)
                plot_item.show()
        
        # máme nodes, tj. jedeme poprvé        
        else:
            # draw tečičky
            #
            pos = getattr(nodes, self.sb_item.space)[:,:3]
            
            event = cell_stats['event']
            color = self.get_color(event)
            #symbolSize = np.sqrt(nodes.w / min(nodes.w)) # not bad
            plot_item = gl.GLScatterPlotItem(pos=pos, size=symbol_size, color=color)
            self.sb_item.central_widget.addItem(plot_item)
            
            # uložíme data
            self.cells.append((nodes, plot_item, cell_stats))
            
            # keep the GUI responsive :)
            self.sb_item.app.processEvents()
    
        
            
    def cell_probability_coloring(self, nodes=None, cell_stats=None, *args, **kwargs):
        """
        if nodes and cell_stats  provided we will add them to self.cells
        otherwise function redraw items in self.cells
        """
        symbol_size = self.param.getValues()['node (pixel) size'][0]
        
        if nodes is None:
            for nodes, plot_item, cell_stats in self.cells:
                event = cell_stats['event']
                cell_probability = cell_stats['cell_probability']
                if self.p_cell_max[event] < cell_probability:
                    self.p_cell_max[event] = cell_probability
                
            # přebarvíme tečičky podle obsahu pravděpodobnosti
            for nodes, plot_item, cell_stats in self.cells:
                # draw 
                #pos = getattr(nodes, self.sb_item.space)[:,:3]
                #x, y = (*getattr(nodes, self.sb_item.space).T,)
                
                event = cell_stats['event']
                cell_probability = cell_stats['cell_probability']
                # bez modrého - maximální intenzita
                blue_intensity = 1 - cell_probability / self.p_cell_max[event]
                color = self.get_color(event, blue_intensity)
                #symbolSize = np.sqrt(nodes.w / min(nodes.w)) # not bad
                plot_item.setData(color=color, size=symbol_size)
                plot_item.show()
        
        # máme nodes, tj. jedeme poprvé        
        else:
            event = cell_stats['event']
            cell_probability = cell_stats['cell_probability']
            # zkontrolujeme probability
            if self.p_cell_max[event] < cell_probability:
                self.p_cell_max[event] = cell_probability
                # a hned všecko dotyčné přebarvíme podle obsahu pravděpodobnosti
                for cell in self.cells:
                    if event == cell[2]['event']:
                        # bez modrého - maximální intenzita
                        # zde cell_probability se rovná self.p_cell_max[event]
                        # ale bacha! Nesplet se jinde!
                        blue_intensity = 1 - cell[2]['cell_probability'] / cell_probability
                        color = self.get_color(event, blue_intensity)
                        # bacha, potřebuji prvek vložit zpätky
                        cell[1].setData(color=color)
            
            # bez modrého - maximální intenzita
            blue_intensity = 1 - cell_probability / self.p_cell_max[event]
            color = self.get_color(event, blue_intensity)
            
            
            # draw tečičky
            #
            pos = getattr(nodes, self.sb_item.space)[:,:3]
            plot_item = gl.GLScatterPlotItem(pos=pos, size=symbol_size, color=color)
            self.sb_item.central_widget.addItem(plot_item)
            
            # uložíme data
            self.cells.append((nodes, plot_item, cell_stats))
            
            # keep the GUI responsive :)
            self.sb_item.app.processEvents()


    def get_color(self, event, blue_intensity=None):
        """
        get color for 'simple_coloring' or 'cell_probability_coloring'
        """
        # generally
        if event == 'success':
            color = [167, 255, 181]# xkcd:light seafoam green #a7ffb5
        elif event == 'failure':
            color = [253, 193, 197] # xkcd: pale rose (#fdc1c5)
        # já vím, že Voronoi nemá 'mix', эн но юа
        else:# 'mix'
            color = [255, 243, 154] # let's try xkcd: dark cream (#fff39a)
            
        if blue_intensity is not None:
            # let's play with blue a little bit
            # chcu mít korektní výstup
            # aspoň v něčem chcu být jistý
            if blue_intensity > 1:
                color[2] = 255
            elif blue_intensity < 0:
                color[2] = 0
            else:
                # pyqtgraph žere barvy i s čarkou
                # ale my je mu davat nebudeme
                color[2] = int(blue_intensity*255) 
            
        return (*(np.array(color)/255), 1)


"""
===========
♥ Чыры-пыры 
č Jiné
E Miscellaneous
===============
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"""

        
        
class CandidatesWidget(qt_plot.CandidatesWidget):


    def run_stm(self):
        #č indikace
        #self.setDisabled(True)
        with pg.BusyCursor():
            
            color_map = self.gradient.colorMap()
            
            try:#č může se tu stat cokoliv
                #č načíst sloupce prostě z libovolného vzorku
                cb = self.sb_item.sample_box.candidates_index.values().__iter__().__next__()
                #č je třeba mít seznam aktualní
                self.attr.setItems(list(cb.df.columns))
                
                #č neplest s self.attr!
                attr = self.attr.currentText()
                
                #č kruci, nejdřív je třeba najít maxvalue, minvalue je implicitně nula
                maxvalue = -np.inf
                minvalue = np.inf
                for id, cb in self.sb_item.sample_box.candidates_index.items():
                    array = getattr(cb, attr)
                    if len(array):
                        maxcb = np.nanmax(array)
                        mincb = np.nanmin(array)
                        if maxcb > maxvalue:
                            maxvalue = maxcb
                            maxitem = cb[np.nanargmax(array)]
                        if mincb < minvalue:
                            minvalue = mincb
                
                #č zvlášť nakreslím maximální hodnotu
                pos = getattr(maxitem, self.sb_item.space)[:,:3]
                max_item = gl.GLScatterPlotItem(pos=pos, size=self.sb_item.px_size*2, color=color_map.mapToFloat(1))
                self.sb_item.central_widget.addItem(max_item)
                self.pens.append(max_item)
                
                
                
                #č a teď jdeme!
                for id, cb in self.sb_item.sample_box.candidates_index.items():
                    array = getattr(cb, attr)
                    if np.isnan(array).any():
                        msg = "%s candidates has nans in %s attribute"%(id, attr)
                        error_msg = self.__class__.__name__ + ": " + msg
                        print(error_msg)
                    mask = np.isfinite(array)
                    values = array[mask]
                    norm_values = (values - minvalue) / (maxvalue - minvalue)
                    
                    pos = getattr(cb, self.sb_item.space)[mask][:,:3]
                    color = color_map.mapToFloat(norm_values)
                    pen = gl.GLScatterPlotItem(pos=pos, size=self.sb_item.px_size, color=color)
                    self.sb_item.central_widget.addItem(pen)
                    self.pens.append(pen)
                
            except BaseException as e:
                msg = ""
                error_msg = self.__class__.__name__ + ": " + msg + repr(e)
                print(error_msg)
            
            
            
        # indikace
        #self.setEnabled(True)
        

    
        

        


Mode Type Size Ref File
100644 blob 23330 4c05361b6b167188591a7a76d8b8e0bcee87855d IS_stat.py
100644 blob 6 0916b75b752887809bac2330f3de246c42c245cd __init__.py
100644 blob 73368 3d245b8568158ac63c80fa0847631776a140db0f blackbox.py
100644 blob 11243 10c424c2ce5e8cdd0da97a5aba74c54d1ca71e0d candybox.py
100644 blob 34376 4235391779e60cc417f7f4bd70e6a8a1fdaf4bcb convex_hull.py
100644 blob 80674 fb33661e43b787bdf3503f401986c306730f9e37 dicebox.py
100644 blob 36930 a775d1114bc205bbd1da0a10879297283cca0d4c estimation.py
100644 blob 34394 3f0ab9294a9352a071de18553aa687c2a9e6917a f_models.py
100644 blob 31540 a577087003a885ca7499d1ee9451e703fa9d2d36 g_models.py
100644 blob 42820 1092b3b9f05b11d0c53b3aa63df2460ec355085d gl_plot.py
100644 blob 2718 5d721d117448dbb96c554ea8f0e4651ffe9ac457 gp_plot.py
100644 blob 29393 96162a5d181b8307507ba2f44bafe984aa939163 lukiskon.py
100644 blob 12028 dabcfd7eb6c467ff25efa47eccebfd21697c9473 mart.py
100644 blob 7983 75455aa723db8bab291dcf941b92b9ffdba3aef1 mart3d.py
100644 blob 5356 faac09f784e48599ff9a67e607a8e8a990b05d80 mgraph.py
100644 blob 2004 6ea8dc8f50a656c48f786d5a00bd6398276c9741 misc.py
100644 blob 2439 fe482f41cb07d6d8a079553aa09b13a8a82d512d mplot.py
100644 blob 1450 4849f178b588e252b8c7f6a940d2d82ad35f6914 plot.py
100644 blob 2807 1feb1d43e90e027f35bbd0a6730ab18501cef63a plotly_plot.py
100644 blob 138229 863b3787b57691a29ecb834f163d57b8c65e0e9c qt_plot.py
100644 blob 8206 5981023118262109fca8309d9b313b521a25f88f reader.py
100644 blob 4284 a0e0b4e593204ff6254f23a67652804db07800a6 samplebox.py
100644 blob 6397 90f4252f7484271e81e64cb432d77e4f710ec893 sball.py
100644 blob 5553 bac994ae58f1df80c7f8b3f33955af5402f5a4f3 sball_old.py
100644 blob 2605 0034d2e3f14c056541888235e59127e8f28b131d schemes.py
100644 blob 21623 281aef80556b8d22842b8659f6f0b7dab0ad71af shapeshare.py
100644 blob 48537 10f90c5614e9a04f0cd9f78e75f0db4a6becb3e4 simplex.py
100644 blob 13080 49a0736cac4b2ba9efac588d12aac3ef4e669e3b spring.py
100644 blob 10940 6965eabdb5599bb22773e7fef1178f9b2bb51efe stm_df.py
100644 blob 3433 3063a1b6a132cbb5440ab95f1b6af1f1ff4266ac testcases_2D.py
100644 blob 2465 d829bff1dd721bdb8bbbed9a53db73efac471dac welford.py
100644 blob 22048 4a6014ca5255aa96059ff9ed5a7e29df98d26ffc whitebox.py
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