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 (ade48f8103eaf1d2d0e002766535620a85c7c359) (42800 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)
                    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)
                self.error.emit(error_msg)
            
            
            
        # indikace
        #self.setEnabled(True)
        

    
        

        


Mode Type Size Ref File
100644 blob 19075 e556c1eafdce91cf8d67a5075447eb04a9abe383 IS_stat.py
100644 blob 6 0916b75b752887809bac2330f3de246c42c245cd __init__.py
100644 blob 73368 3d245b8568158ac63c80fa0847631776a140db0f blackbox.py
100644 blob 11243 10c424c2ce5e8cdd0da97a5aba74c54d1ca71e0d candybox.py
100644 blob 53568 5d2342f46163fb2320bde4c42577ad73fb304a96 dicebox.py
100644 blob 35771 e9632b8fb33b7dbd77cef556ec9c4dda0951064f estimation.py
100644 blob 34189 e2b43f8f1a46cfc950347d6106ff3cba9ffe5f0c f_models.py
100644 blob 31025 70bab60405bfe783a2f7a9f2c41b7c1629d3d474 g_models.py
100644 blob 42800 ade48f8103eaf1d2d0e002766535620a85c7c359 gl_plot.py
100644 blob 2718 5d721d117448dbb96c554ea8f0e4651ffe9ac457 gp_plot.py
100644 blob 29393 96162a5d181b8307507ba2f44bafe984aa939163 lukiskon.py
100644 blob 2004 6ea8dc8f50a656c48f786d5a00bd6398276c9741 misc.py
100644 blob 10489 1f6dd06a036fdc4ba6a7e6d61ac0b84e8ad3a4c1 mplot.py
100644 blob 1366 993a88f239b6304e48eb519c20a640f28055d7c9 plot.py
100644 blob 2807 1feb1d43e90e027f35bbd0a6730ab18501cef63a plotly_plot.py
100644 blob 110138 f4ef8295edbfd2509cc6026f797536baeb53a8f7 qt_plot.py
100644 blob 6304 7fc6ac75e415df43af5b7aa9d6d1848aa5d0963d reader.py
100644 blob 4284 a0e0b4e593204ff6254f23a67652804db07800a6 samplebox.py
100644 blob 5553 bac994ae58f1df80c7f8b3f33955af5402f5a4f3 sball.py
100644 blob 21623 281aef80556b8d22842b8659f6f0b7dab0ad71af shapeshare.py
100644 blob 41483 940b5c6b493930ce36f1792b0e3c81a022e8cb90 simplex.py
100644 blob 10317 b1c9dca82c5cc30c7b7aa5da2869c0bd131e409d stm_df.py
100644 blob 3411 526104441da7029c83ff7c5037ae6b0dbc9a118d testcases_2D.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