Best Python code snippet using pandera_python
conservation_tools.py
Source:conservation_tools.py
...68# ------------------------------------------------------------------------------69def withRoadXing(base, label):70 "To find road crossings with a selected category."71 wbt.work_dir = scratch_repo72 wbt.not_equal_to(input1 = base, input2 = 0, output = '_01.tif')73 wbt.maximum_filter(i = '_01.tif', output = '_02.tif', filterx=5, filtery=5)74 wbt.equal_to(input1 = starter, input2 = 99, output = '_03.tif')75 wbt.multiply(input1 = '_03.tif', input2 = '_02.tif', output='_04.tif')76 wbt.Or(input1 ='_04.tif', input2='_01.tif', output='_05.tif')77 wbt.clump(i = '_05.tif', output = data_repo+label+'_withRoadXing.tif', diag=True, zero_back=True)78 return;79# ------------------------------------------------------------------------------80# CLASSIFY TOPOLOGY FUNCTION81# ------------------------------------------------------------------------------82def classTopology(figure, ground, label):83 "To create topology classes for figure and ground object layers with 0 as background."84 wbt.work_dir = scratch_repo85 # Convert figure background 0 into noData.86 wbt.set_nodata_value(i = figure, output = 'a.tif', back_value = 0)87 # Grow ground edge by one pixel.88 wbt.maximum_filter(i = ground, output = 'b.tif', filterx=3, filtery=3)89 # Test for overlap.90 wbt.zonal_statistics(i = 'b.tif', features = 'a.tif', output = 'c.tif', stat = "max", out_table = None)91 # Test for inequality92 wbt.not_equal_to(input1 = 'c.tif', input2 = 'b.tif', output = 'd.tif')93 # ISLAND TEST94 # if max is 0 then island.95 wbt.zonal_statistics(i = 'd.tif', features = 'a.tif', output = 'e.tif', stat = "max", out_table = None)96 wbt.equal_to(input1 = 'e.tif', input2 = 0, output = '_islands.tif')97 # Erase equal overlap98 wbt.multiply(input1 = 'd.tif', input2 = 'b.tif', output = 'e.tif')99 # Test for overlap again.100 wbt.zonal_statistics(i = 'e.tif', features = 'a.tif', output = 'f.tif', stat = "max", out_table = None)101 # TOMBOLO TEST102 # If greater than 0, then figure connects at least two ground patches.103 wbt.greater_than(input1 = 'f.tif', input2 = 0, output = '_tombolos.tif', incl_equals=False)104 # Assemble figure objects that have been classed thus far.105 wbt.Or(input1 = '_islands.tif', input2 = '_tombolos.tif', output='g.tif')106 wbt.equal_to(input1 = 'g.tif', input2 = 0, output = 'h.tif')107 # Convert ground into a binary.108 wbt.not_equal_to(input1 = ground, input2 = 0, output = 'aa.tif')109 # Convert figure into binary110 wbt.not_equal_to(input1 = figure, input2 = 0, output = 'bb.tif')111 # Union figure and ground binaries.112 wbt.Or(input1 = 'aa.tif', input2 = 'bb.tif', output='cc.tif')113 # Invert union114 wbt.equal_to(input1 = 'cc.tif', input2 = 0, output = 'dd.tif')115 # Grow ground edge by one pixel.116 wbt.maximum_filter(i = 'dd.tif', output = 'ee.tif', filterx=3, filtery=3)117 # TEST HOLES VERSUS SPITS118 wbt.zonal_statistics(i = 'ee.tif', features = 'a.tif', output = 'gg.tif', stat = "max", out_table = None)119 # If test = 0, then hole, else spit.120 wbt.equal_to(input1 = 'gg.tif', input2 = 0, output = 'hh.tif')121 wbt.not_equal_to(input1 = 'gg.tif', input2 = 0, output = 'ii.tif')122 # Remove previously classed patches from outputs123 wbt.multiply(input1 = 'hh.tif', input2 = 'h.tif', output = '_holes.tif')124 wbt.multiply(input1 = 'ii.tif', input2 = 'h.tif', output = '_spits.tif')125 # compile topology class layer where islands = 1, spits = 2, holes = 3 and tombolos = 4126 address = label+"_topology.tif"127 wbt.raster_calculator(output = address, statement="('_islands.tif') + ('_spits.tif' * 2) + ('_holes.tif' * 3) + ('_tombolos.tif' * 4)")128 wbt.convert_nodata_to_zero(i = label+"_topology.tif", output = data_repo+label+'_topology.tif')129 return;130# ------------------------------------------------------------------------------131# FOREST HABITAT BLOCK FUNCTION132# ------------------------------------------------------------------------------133# Make forest habitat blocks by combining reforested with recovering-reforested holes.134def makeForestHabitatBlocks(blocks, topology, label):135 "To make habitat blocks by filling holes."136 wbt.work_dir = scratch_repo137 # Select holes from topology.138 wbt.equal_to(input1 = topology, input2 = 3, output = '_01.tif')139 # Union holes with ground.140 wbt.Or(input1 = blocks, input2 = '_01.tif', output = '_02.tif')141 # Identify objects.142 wbt.clump(i = '_02.tif', output = data_repo+label+'_blocks.tif', diag=True, zero_back=True)143 return;144# ------------------------------------------------------------------------------145# FIELD HABITAT BLOCK FUNCTION146# ------------------------------------------------------------------------------147def makeFieldHabitatBlocks(ground, topology1, topology2, label):148 "To make field habitat blocks with recovering-clearing holes and recovering-forest islands."149 wbt.work_dir = scratch_repo150 # Select recovering holes in clearing ground from topology1.151 wbt.equal_to(input1 = topology1, input2 = 3, output = '_01.tif')152 # Select recovering islands in forest ground from topology2.153 wbt.equal_to(input1 = topology2, input2 = 1, output = '_02.tif')154 # Union holes and islands .155 wbt.Or(input1 = '_01.tif', input2 = '_02.tif', output = '_03.tif')156 # Make binary from field ground157 wbt.not_equal_to(input1 = ground, input2 = 0, output = '_04.tif')158 # Union topology features with ground binary.159 wbt.Or(input1 = '_03.tif', input2 = '_04.tif', output = '_05.tif')160 # Identify objects.161 wbt.clump(i = '_05.tif', output = data_repo+label+'_blocks.tif', diag=True, zero_back=True)162 return;163# ------------------------------------------------------------------------------164# MAKE RIVER CORRIDORS AND SMALL STREAMS BINARY165# ------------------------------------------------------------------------------166def makeRiverCorridorsAndSmallStreamsBinary():167 wbt.work_dir = scratch_repo168 wbt.vector_polygons_to_raster(i=rc, output='_01.tif', field="OBJECTID", nodata=False, cell_size=None, base=starter)169 wbt.vector_lines_to_raster(i=rc_ss, output='_02.tif', field="OBJECTID", nodata=False, cell_size=None, base=starter)170 wbt.buffer_raster(i='_02.tif', output='_03.tif', size=15, gridcells=False)171 wbt.Or(input1='_01.tif', input2='_03.tif', output=data_repo+'_riverCorridors_with_smallStreamBuffers.tif')172 return;173# ------------------------------------------------------------------------------174# BLOCKS WITH RIVER CORRIDORS175# ------------------------------------------------------------------------------176def withRiverCorridors(base, label):177 wbt.work_dir = scratch_repo178 wbt.vector_polygons_to_raster(i=rc, output=data_repo+'_riverCorridors.tif', field="OBJECTID", nodata=False, cell_size=None, base=starter)179 wbt.not_equal_to(input1 = base, input2 = 0, output = '_01.tif')180 wbt.Or(input1=data_repo+'_riverCorridors.tif', input2='_01.tif', output='_02.tif')181 wbt.clump(i = '_02.tif', output = data_repo+label+'_with_river_corridors.tif', diag=True, zero_back=True)182 return;183# ------------------------------------------------------------------------------184# BLOCKS WITH RIVER CORRIDORS AND SMALL STREAMS185# ------------------------------------------------------------------------------186def withRiverCorridorsAndSmallStreams(base, label):187 wbt.work_dir = scratch_repo188 wbt.vector_polygons_to_raster(i=rc, output='_01.tif', field="OBJECTID", nodata=False, cell_size=None, base=starter)189 wbt.vector_lines_to_raster(i=rc_ss, output='_02.tif', field="OBJECTID", nodata=False, cell_size=None, base=starter)190 wbt.buffer_raster(i='_02.tif', output='_03.tif', size=15, gridcells=False)191 wbt.Or(input1='_01.tif', input2='_03.tif', output=data_repo+'_riverCorridors.tif')192 wbt.not_equal_to(input1 = base, input2 = 0, output = '_04.tif')193 wbt.Or(input1=data_repo+'_riverCorridors.tif', input2='_04.tif', output='_05.tif')194 wbt.clump(i = '_05.tif', output = data_repo+label+'_with_river_corridors_and_small_streams.tif', diag=True, zero_back=True)195 return;196# ------------------------------------------------------------------------------197# DEFINE OPEN LOWLAND HABITAT198# ------------------------------------------------------------------------------199def openLowlands(lowlands, blocks, starter):200 # tag lowlands with forest habitat patches.201 wbt.multiply(input1 = lowlands, input2 = blocks, output = '_01.tif')202 # isolate the forest block negative space.203 wbt.equal_to(input1 = '_01.tif', input2 = 0, output = '_02.tif')204 # make inverse developed binary layer (0 if developed, 1 if not developed).205 wbt.not_equal_to(input1 = starter, input2 = 4, output = '_03.tif')206 # grow inversed developed binary layer to remove fragmenting roads.207 wbt.minimum_filter(i = '_03.tif', output = '_04.tif', filterx=5, filtery=5)208 # intersect inverse developed binary layer and forest block negative space to identify open, undeveloped space.209 wbt.And(input1='_02.tif', input2='_04.tif', output='_05.tif')210 # intersect green negative space and lowlands to identify potential connectors.211 wbt.And(input1=lowlands, input2='_05.tif', output='_06.tif')212 # Make objects213 wbt.clump(i = '_06.tif', output = data_repo+'_open_lowlands.tif', diag=False, zero_back=True)214 return;215# ------------------------------------------------------------------------------216# DEFINE HABITAT CONNECTORS217# ------------------------------------------------------------------------------218def makeHabitatConnectors(forest_blocks, field_blocks, forest_topology, lowland_topology, rivers):219 wbt.work_dir = scratch_repo220 # Criteria 1 - where recovering patches spur forest blocks --> habitat connectors221 wbt.equal_to(input1 = forest_topology, input2 = 2, output = '_01.tif')222 # Criteria 2 - where recovering patches tombolo forest blocks --> habitat connectors223 wbt.equal_to(input1 = forest_topology, input2 = 4, output = '_02.tif')224 # Criteria 3 - where open lowlands touch one or more forest block225 wbt.greater_than(input1 = lowland_topology, input2 = 2, output = '_03.tif', incl_equals=True)226 # Criteria 4: where river and small stream corridors intersect field blocks227 wbt.And(input1 = rivers, input2 = field_blocks, output = '_04.tif')228 # Union criteria229 wbt.raster_calculator(output = data_repo+'_forest_habitat_connectors.tif', statement="'_01.tif' || '_02.tif' || '_03.tif' || '_04.tif'")230 return;231# ------------------------------------------------------------------------------232# IDENTIFY FIELD BLOCKS IN SCENIC FOREGROUNDS233# ------------------------------------------------------------------------------234def identifyScenicForegrounds(blocks, scenic, label):235 wbt.work_dir = scratch_repo236 # Criteria 1 - where field blocks intersect scenic foregrounds237 # Make field blocks binary.238 wbt.not_equal_to(input1 = blocks, input2 = 0, output = '_01.tif')239 # Make scenic blocks binary for foreground visibility.240 wbt.equal_to(input1 = scenic, input2 = 2, output = '_02.tif')241 # Intersect field blocks and scenic foregrounds.242 wbt.And(input1 = '_01.tif', input2 = '_02.tif', output = data_repo+label+'_block_scenic_foregrounds.tif')243 return;244# ------------------------------------------------------------------------------245# IDENTIFY FIELD BLOCKS IN CLEARINGS246# ------------------------------------------------------------------------------247def identifyClearings(blocks, starter, label):248 wbt.work_dir = scratch_repo249 # Criteria 1 - where field blocks intersect scenic foregrounds250 # Make field blocks binary.251 wbt.not_equal_to(input1 = blocks, input2 = 0, output = '_01.tif')252 # Make clearing binary .253 wbt.equal_to(input1 = starter, input2 = 3, output = '_02.tif')254 # Intersect field blocks and clearings.255 wbt.And(input1 = '_01.tif', input2 = '_02.tif', output = data_repo+label+'_block_clearings.tif')256 return;257# ------------------------------------------------------------------------------258# CLASSIFY FIELD BLOCKS259# ------------------------------------------------------------------------------260def classifyFieldBlocks(blocks, scenic, soils, starter):261 wbt.work_dir = scratch_repo262 # Make field blocks binary.263 wbt.not_equal_to(input1 = blocks, input2 = 0, output = '_01.tif')264 # Criteria 1 - where field blocks intersect scenic foregrounds265 # Make scenic blocks binary for foreground visibility.266 wbt.equal_to(input1 = scenic, input2 = 2, output = '_02.tif')267 # Remove noise from scenic layer.268 wbt.maximum_filter(i = '_02.tif', output = '_03.tif', filterx=3, filtery=3)269 # SCENIC FOREGROUNDS: Intersect field blocks and scenic foregrounds.270 wbt.And(input1 = '_01.tif', input2 = '_03.tif', output = '_04.tif')271 # Criteria 2 - where field blocks intersect recovering272 # Make clearing binary .273 wbt.equal_to(input1 = starter, input2 = 0, output = '_05.tif')274 # RECOVERING: Intersect field blocks and clearings.275 wbt.And(input1 = '_01.tif', input2 = '_05.tif', output = '_06.tif')276 # Criteria 3 - where field blocks intersect clearing277 # Make clearing binary .278 wbt.equal_to(input1 = starter, input2 = 3, output = '_07.tif')279 # CLEARINGS: Intersect field blocks and clearings.280 wbt.And(input1 = '_01.tif', input2 = '_07.tif', output = '_08.tif')281 # Tag composite classes: 1 FIELD, 1000 SCENIC, 10 RECOVERING, 100 CLEARING282 statement = "(('_04.tif' * 1000) + ('_06.tif' * 10) + ('_08.tif' * 100) + '_01.tif')"283 wbt.raster_calculator(output = '_09.tif', statement = statement)284 # COMPOSITE LAYER: 0 background, 1 old field, 2 working field, 3 field in scenic foreground285 reclass = "0;0;1;1;1;11;2;101;3;1001;3;1011;3;1101"286 wbt.reclass(i = '_09.tif', output = data_repo+'_field_blocks_classed.tif', reclass_vals = reclass, assign_mode=True)287 return;288# ------------------------------------------------------------------------------289# COMPOSITE LAYER290# ------------------------------------------------------------------------------291# forest = forest block, connector = habitat connector, field = classed field block, starter = landcover classes292def makeComposite(forest, connector, field, starter):293 # Make binary of FOREST BLOCKS.294 wbt.not_equal_to(input1 = forest, input2 = 0, output = '_01.tif')295 # Make binary of HABITAT CONNECTORS.296 wbt.not_equal_to(input1 = connector, input2 = 0, output = '_02.tif')297 # Union forest blocks and habitat connectors.298 wbt.Or(input1 = '_01.tif', input2 = '_02.tif', output = '_03.tif')299 # Make binary of FIELD BLOCKS.300 wbt.not_equal_to(input1 = field, input2 = 0, output = '_04.tif')301 # Erase field blocks that are not habitat connector or forest block.302 wbt.Not(input1 = '_04.tif', input2 = '_03.tif', output = '_05.tif')303 wbt.multiply(input1 = field, input2 = '_05.tif', output = '_06.tif')304 # Erase habitat connectors that are forest blocks.305 wbt.Not(input1 = '_02.tif', input2 = '_01.tif', output = '_07.tif')306 # make composite layer307 statement = "(('_01.tif' * 5) + ('_07.tif' * 4) + '_06.tif')"308 wbt.raster_calculator(output = data_repo+'_conservation_plan.tif', statement = statement)309 return;310# # ------------------------------------------------------------------------------311# # BURN ROADS AND WATER FEATURES312# # ------------------------------------------------------------------------------313#314# def burnReferenceFeatures(plan, starter)...
validator.py
Source:validator.py
1"""`bravais.validator.py`"""2import copy3import random4class ValidationError(Exception):5 """Raised when NumericValidator.validate fails."""6class NumericValidator(object):7 """Class to represent a set of validation conditions to be applied to8 a set of numeric parameters."""9 def __init__(self, equal_to=None, not_equal_to=None, equal_groups=None,10 not_equal_groups=None, default_min=0, default_max=1):11 """12 Initialise a NumericValidator with a set of conditions.13 Parameters14 ----------15 equal_to : dict, optional16 not_equal_to : dict, optional17 equal_groups : list of list of str, optional18 not_equal_groups : list of list of str, optional19 default_min : int or float, optional20 default_max : int or float, optional21 """22 if equal_to is not None:23 if not isinstance(equal_to, dict):24 msg = '`equal_to` must be a dict.'25 raise ValueError(msg)26 if not_equal_to is not None:27 if not isinstance(not_equal_to, dict):28 msg = '`not_equal_to` must be a dict.'29 if equal_groups is not None:30 msg = '`equal_groups` must be a list of list of str.'31 if isinstance(equal_groups, list):32 for i in equal_groups:33 if isinstance(i, list):34 for j in i:35 if not isinstance(j, str):36 raise ValueError(msg)37 else:38 raise ValueError(msg)39 else:40 raise ValueError(msg)41 if not_equal_groups is not None:42 msg = '`not_equal_groups` must be a list of list of str.'43 if isinstance(not_equal_groups, list):44 for i in not_equal_groups:45 if isinstance(i, list):46 for j in i:47 if not isinstance(j, str):48 raise ValueError(msg)49 else:50 raise ValueError(msg)51 else:52 raise ValueError(msg)53 self.equal_to = equal_to or {}54 self.not_equal_to = not_equal_to or {}55 self.equal_groups = equal_groups or [[]]56 self.not_equal_groups = not_equal_groups or [[]]57 self.default_min = default_min58 self.default_max = default_max59 self._validate_conditions()60 def _get_parameter_equal_group(self, param):61 """Get the `equal_group` in which a parameter exists, if at all."""62 for i in self.equal_groups:63 if param in i:64 return i65 def _get_parameter_not_equal_group(self, param):66 """Get the `not_equal_group` in which a parameter exists, if at all."""67 for i in self.not_equal_groups:68 if param in i:69 return i70 def _validate_conditions(self):71 """Check conditions make sense."""72 msg = ('Parameter names should not be repeated within equal_groups` '73 'elements, nor within `not_equal_groups` elements')74 for i in (self.equal_groups + self.not_equal_groups):75 if len(set(i)) != len(i):76 raise ValueError(msg)77 msg = ('The parameter "{}" appears in more than one sublist of '78 '`equal_groups`; these two sublists should be merged.')79 eq_groups_params = []80 for i in self.equal_groups:81 for j in i:82 if j in eq_groups_params:83 raise ValueError(msg.format(j))84 eq_groups_params.append(j)85 msg = ('The parameter "{}" appears in more than one sublist of '86 '`not_equal_groups`; these two sublist should be merged.')87 neq_groups_params = []88 for i in self.not_equal_groups:89 for j in i:90 if j in neq_groups_params:91 raise ValueError(msg.format(j))92 neq_groups_params.append(j)93 msg = ('The parameters "{}" are specified in both `equal_to` and '94 '`not_equal_to`. Specify the parameter in only one of these.')95 eq_to_params = self.equal_to.keys()96 neq_to_params = self.not_equal_to.keys()97 intersect = list(set(eq_to_params) & set(neq_to_params))98 if intersect:99 raise ValueError(msg.format(intersect))100 msg = ('Only one of the parameters specified within an `equal_group`'101 'element may be specified in `equal_to`.')102 for i in self.equal_groups:103 if len(list(set(i) & set(self.equal_to.keys()))) > 1:104 raise ValueError(msg)105 msg = ('Parameters specified within a `not_equal_group` element cannot'106 ' be assigned to the same value in `equal_to`.')107 for i in self.not_equal_groups:108 eq_to_vals = [self.equal_to.get(j) for j in i109 if self.equal_to.get(j) is not None]110 if len(set(eq_to_vals)) < len(eq_to_vals):111 raise ValueError(msg)112 def _set_default_value(self, all_params, params_to_set):113 """Assign a default value to a parameter.114 Parameters115 ----------116 all_params : dict117 All parameters. The the value of the parameter specified will be118 changed within this dict.119 params_to_set : list of str120 Names of the parameters to be set to the same value.121 Returns122 -------123 None124 """125 assert all([i in all_params for i in params_to_set])126 # Collect values param must not be:127 bad_vals = []128 for i in params_to_set:129 if i in self.not_equal_to:130 bad_vals.append(self.not_equal_to[i])131 ne_group = self._get_parameter_not_equal_group(i) or []132 for j in ne_group:133 if j != i:134 ne_val = all_params[j]135 if ne_val:136 bad_vals.append(ne_val)137 # Find a suitable default value:138 default_val = None139 count = 0140 while default_val is None or default_val in bad_vals:141 default_val = random.random()142 default_val *= (self.default_max - self.default_min)143 default_val += self.default_min144 count += 1145 if count > 10:146 msg = ('Failed to find suitable default value for '147 'parameter {}.')148 raise RuntimeError(msg.format(params_to_set))149 for i in params_to_set:150 all_params[i] = default_val151 def validate(self, **kwargs):152 """Validate named parameters."""153 params = kwargs.copy()154 # Firstly, validate according to rules, but ignore parameters set to155 # `None`:156 msg = 'Parameter "{}" must be equal to "{}".'157 for param_name, val in self.equal_to.items():158 if kwargs[param_name] is not None and kwargs[param_name] != val:159 raise ValidationError(msg.format(param_name, val))160 msg = 'Parameter "{}" must not be equal to "{}".'161 for param_name, val in self.not_equal_to.items():162 if kwargs[param_name] is not None and kwargs[param_name] == val:163 raise ValidationError(msg.format(param_name, val))164 msg = 'Parameters "{}" must all have the same value.'165 for i in self.equal_groups:166 first_val = None167 for j in i:168 if first_val is None and kwargs[j] is not None:169 first_val = kwargs[j]170 continue171 if kwargs[j] is not None and kwargs[j] != first_val:172 raise ValidationError(msg.format(i))173 msg = 'Parameters "{}" must all have distinct values.'174 for i in self.not_equal_groups:175 all_vals = []176 for j in i:177 if kwargs[j] is not None:178 if kwargs[j] in all_vals:179 raise ValidationError(msg.format(i))180 all_vals.append(kwargs[j])181 none_params = [k for k, v in kwargs.items() if v is None]182 # Fill in `None`s.183 # First set any `equal_to`s:184 for i in copy.copy(none_params):185 if i in self.equal_to:186 params[i] = self.equal_to[i]187 none_params.remove(i)188 # Then try using `equal_groups`:189 for eq_group in self.equal_groups:190 num_none = sum([params.get(i) is None for i in eq_group])191 if len(eq_group) > num_none > 0:192 # At least one param in the eq_group has a value, use this one.193 val = None194 for i in eq_group:195 if params[i] is not None:196 val = params[i]197 break198 for i in eq_group:199 if params[i] is None:200 params[i] = val201 none_params.remove(i)202 elif len(eq_group) == num_none:203 # None of the equal group values are set. Use a default.204 self._set_default_value(params, eq_group)205 for i in eq_group:206 none_params.remove(i)207 # Try to set remaining `None`s using defaults. Need a default value208 # that doesn't conflict with `not_equal_to`, nor with209 # `not_equal_groups`.210 if none_params:211 for i in copy.copy(none_params):212 self._set_default_value(params, [i])213 none_params.remove(i)214 return params215 def __repr__(self):216 return (217 '<{}('218 'equal_to={!r}, '219 'not_equal_to={!r}, '220 'equal_groups={!r}, '221 'not_equal_groups={!r}'222 ')>'.format(223 self.__class__.__name__,224 self.equal_to,225 self.not_equal_to,226 self.equal_groups,227 self.not_equal_groups,228 )...
n0_not_equal_to.py
Source:n0_not_equal_to.py
1def define__nn0a1__not_equal_to():2 _nn0a1.not_equal_to = _core_functions_1.get_concept(uid='nn0a1.not_equal_to', scope=_preload.system_scope)3 """The Boolean 'not equal to' operator over N0^2."""4 _core_functions_1.facet_named_concept(c=_nn0a1.not_equal_to, base_name=_glyphs.not_equal_to)5 _core_functions_1.facet_binary_operator(6 c=_nn0a1.not_equal_to,7 domain=_nn0a1.natural_numbers_0_set_squared,8 codomain=_bl1.boolean_set,9 algorithm=_core_functions_1.not_equal_to_algorithm)10 _core_functions_1.facet_tokenized(c=_nn0a1.not_equal_to, tokens=['not_equal_to', 'neq', '<>', '!=', 'ne'])...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!