Source code for upxo.pxtalops.modeModifierMcgs2d

from upxo.ggrowth.mcgs import mcgs
import numpy as np
import matplotlib.pyplot as plt
import time
import seaborn as sns
from skimage.segmentation import find_boundaries
import scipy.spatial.ckdtree as ckdtree
from copy import deepcopy
import pandas as pd

class _modeModifier_():
    __slots__ = ('targetTSlice', 'NSeedGrains', 'meanNeighCount', 'size_threshold',
                 'neighCounts', 'neigh_gid', 'gsTRG', 'sf', 'mods', 'G',
                 'prop', 'nrealizations', 'realizations', 
                 '_misAreas_',
                 'seedGids', 'seedGid_neighs', 'seedGid_coords'
                 )

    def __init__(self, **kwargs):
        """Initialise the instance."""
        self.NSeedGrains = kwargs.get('NSeedGrains', 5)
        self.meanNeighCount = kwargs.get('meanNeighCount', 2)
        self.size_threshold = kwargs.get('size_threshold', 10)
        self.nrealizations = kwargs.get('nrealizations', 1)

        self.mods = {}
        self.prop = pd.DataFrame({'originalSizes': [0], })

        self.realizations = {r: None for r in range(self.nrealizations)}

    def find_neighCounts(self, meanCountOffset=0, deltaPar=1.0):
        """Find neighCounts."""
        self.neighCounts = np.abs(self.meanNeighCount+np.asarray((self.meanNeighCount-meanCountOffset)*(np.random.random(self.NSeedGrains)-deltaPar), 
                                                                 dtype=np.int16))
        print(f"Neighbour counts are: \n{self.neighCounts}")

    def load_neigh(self, neigh_gid):
        """Load or import neigh."""
        self.neigh_gid = neigh_gid

    def load_UPXO_GSTRG(self, gsTRG: dict):
        """Load or import UPXO GSTRG."""
        # gsTRG: Target gs. This is what we intend to modify
        # Key: Tslice ID
        # Value: UPXO Grain structure object
        self.targetTSlice = list(gsTRG.keys())[0]
        self.gsTRG = gsTRG

    def load_UPXO_GSSRC(self, gsSRC):
        """Load or import UPXO GSSRC."""
        # gsTRG: Target gs. This is what we intend to modify
        # Key: Tslice ID
        # Value: UPXO Grain structure object
        self.gsTRG = gsTRG

    def load_scalar_filds(self, sf: dict):
        """Load or import scalar filds."""
        if 'lfi' not in sf.keys():
            raise ValueError("Input sf sict must contain 'lfi' key.")
        self.sf = sf

    def find_sizeThresholdedNeighs(self):
        """Find sizeThresholdedNeighs."""
        self.seedGid_neighs = {gid: np.array([neigh for neigh in neighs if self.prop['originalAreas'][neigh] >= self.size_threshold])
                          for gid, neighs in self.seedGid_neighs.items()}

[docs] class modeModifier_mcgs2d(_modeModifier_):
[docs] def find_areas(self, lfi): """Find areas.""" self.prop['originalAreas'] = np.bincount(self.sf['lfi'].ravel())
[docs] def find_seedGrains(self): """Find seedGrains.""" import networkx as nx from upxo.netops.kmake import make_gid_net_from_neighlist G = make_gid_net_from_neighlist(self.neigh_gid) mis = np.array(nx.maximal_independent_set(G), dtype=np.int32) misAreas = self.prop['originalAreas'][mis] mis = mis[misAreas >= self.size_threshold] self.seedGids = np.random.choice(mis, self.NSeedGrains, replace=False) self._misAreas_ = misAreas[misAreas >= self.size_threshold] _fx = self.gsTRG[self.targetTSlice].get_upto_nth_order_neighbors self.seedGid_neighs = {int(gid): np.asarray(_fx(gid, self.neighCounts[gidCount], fast_estimate=False, recalculate=False, include_parent=True, output_type='nparray'), dtype=int) for gidCount, gid in enumerate(self.seedGids, start=0)} self.seedGids = np.array(list(set(np.hstack((self.seedGids, np.hstack(list(self.seedGid_neighs.values())))))))
[docs] def find_coords_allSeedGids(self): """Find coords allSeedGids.""" self.seedGid_coords = {int(gid): self.gsTRG[self.targetTSlice].g[self.seedGids[gidCount]]['grain'].loc for gidCount, gid in enumerate(self.seedGids, start=0)}
[docs] def see_seedGids(self, **kwargs): """See seedgids.""" if hasattr(self, 'gs'): self.gsTRG[self.targetTSlice].plot_grains(gids=self.seedGids, figsize=kwargs.get('figsize', (5, 5)), dpi=kwargs.get('dpi', 75), title=kwargs.get('title', 'Non-touching grains'), ) else: raise ValueError("UPXO grain structure not available. Please input 'gs' attribute")
[docs] class modeModifier_mcgs3d(_modeModifier_): def __init__(self, *args, **kwargs): raise NotImplementedError("modeModifier_mcgs3d is not yet implemented.")