Best JavaScript code snippet using wpt
eliminate_transposes.py
Source:eliminate_transposes.py
...17 find_compatible_transpose)18LOG = logging.getLogger("nntool." + __name__)19def reverse_reshape(trans, from_shape, to_shape):20 """reverses the effect of this reshape on the transpose"""21 return find_compatible_transpose(find_combination(from_shape, to_shape), trans)22def reverses_transpose(trans1, trans2, dim=None):23 """Checks if one transpose reverses another. If a dim is provided then24 look if the transpose sequence produces an equivalent dim to cope with 1s in25 dimensions."""26 if trans1 is None or trans2 is None:27 return False28 if dim and dim.layout_shape == dim.calc_transpose(trans1).calc_transpose(trans2).layout_shape:29 return True30 for idx, val in enumerate(trans1):31 if trans2[val] != idx:32 return False33 return True34def search_up_for_reverse(G, visited_edges, node, out_idx, transpose, edge_list):35 """Search up the graph for transpose sequences"""36 LOG.debug("looking up at %s", node.name)37 if not isinstance(node, Transposable) and (len(G.out_edges(node.name)) > 1 or isinstance(node, SensitiveToOrder)):38 LOG.debug("rejected %s - sensitive to order or multi output", node.name)39 return []40 if isinstance(node, Transposable) and node.transpose_out:41 if reverses_transpose(node.transpose_out[out_idx], transpose, node.out_dims[out_idx]):42 LOG.debug("accepted %s - transpose out", node.name)43 return [(node, edge_list, 'out', out_idx)]44 else:45 LOG.debug("rejected %s - transpose out - does not reverse", node.name)46 return []47 # if the node is a concat/split then we cannot proceed further since the48 # concat/split must happen on axis 0 and the transposes were already set up for49 # this to happen50 if isinstance(node, (ConcatParameters, SplitParameters)):51 LOG.debug("rejected %s - concat/split", node.name)52 return []53 if isinstance(node, ReshapeParameters):54 new_transpose = reverse_reshape(transpose, node.shape, node.old_shape)55 if new_transpose is None:56 LOG.debug("rejected %s - transpose in - does not reverse", node.name)57 return []58 transpose = new_transpose59 if node.transpose_in and reverses_transpose(node.transpose_in[0], transpose):60 LOG.debug("accepted %s - transpose in", node.name)61 return [(node, edge_list, "in", 0)]62 if isinstance(node, Transposable) and node.transpose_in:63 LOG.debug("rejected %s - transposable", node.name)64 return []65 return search_up_edges(G, visited_edges, node, transpose, edge_list)66def search_up_edges(G, visited_edges, node, transpose, edge_list, start_edge=None):67 all_nodes = []68 for edge in ([start_edge] if start_edge else G.variable_in_edges(node.name)):69 if edge in visited_edges:70 return []71 next_res = search_up_for_reverse(72 G, visited_edges | {edge},73 edge.from_node,74 edge.from_idx,75 transpose,76 edge_list + [edge])77 if not next_res:78 return []79 all_nodes += next_res80 return all_nodes81def search_down_for_reverse(G, visited_edges, node, in_idx, transpose, edge_list=None):82 """Search down the graph for transpose sequences"""83 LOG.debug("looking down at %s", node.name)84 if not isinstance(node, (Transposable)):85 if len(G.variable_in_edges(node.name)) > 1 or isinstance(node, SensitiveToOrder):86 LOG.debug("rejected %s - sensitive to order or multi input", node.name)87 return []88 if edge_list is None:89 edge_list = []90 if isinstance(node, Transposable):91 if node.transpose_in:92 if reverses_transpose(transpose, node.transpose_in[in_idx], node.in_dims[in_idx]):93 LOG.debug("accepted %s - transpose in", node.name)94 return [(node, edge_list, "in", in_idx)]95 else:96 LOG.debug("rejected %s - transpose in - does not reverse", node.name)97 return []98 elif len(transpose) == 1:99 LOG.debug("accepted %s transpose length 1 - transpose in", node.name)100 return [(node, edge_list, "in", in_idx)]101 # if the node is a concat/split then we cannot proceed further since the102 # concat/split must happen on axis 0 and the transposes were already set up for103 # this to happen104 if isinstance(node, (ConcatParameters, SplitParameters)):105 LOG.debug("rejected %s - concat/split", node.name)106 return []107 # if there is a reshape then the dimensionality of the transpose108 # that we are examining may change and that may or may not be compatible109 # with reversing the transpose110 if isinstance(node, ReshapeParameters):111 new_transpose = reverse_reshape(transpose, node.old_shape, node.shape)112 if new_transpose is None:113 LOG.debug("rejected %s - transpose out - does not reverse", node.name)114 return []115 transpose = new_transpose116 if node.transpose_out:117 if reverses_transpose(transpose, node.transpose_out[0]):118 LOG.debug("accepted %s - transpose out", node.name)119 return [(node, edge_list, "out", 0)]120 elif len(transpose) == 1:121 LOG.debug("accepted %s transpose length 1 - transpose out", node.name)122 return [(node, edge_list, "out", 0)]123 if isinstance(node, Transposable) and node.transpose_out:124 LOG.debug("rejected %s - transposable", node.name)125 return []126 return search_down_edges(G, visited_edges, node, transpose, edge_list)127def search_down_edges(G, visited_edges, node, transpose, edge_list, start_edge=None):128 all_nodes = []129 for edge in ([start_edge] if start_edge else G.out_edges(node.name)):130 if edge in visited_edges:131 return []132 next_res = search_down_for_reverse(133 G, visited_edges | {edge}, edge.to_node, edge.to_idx, transpose, edge_list + [edge])134 if not next_res:135 return []136 all_nodes += next_res137 return all_nodes138def search_for_reverses(G):139 results = []140 # visited edges contains all edges included in found transpose pairs141 visited_edges = set()142 for transpose_node in [node for node in G.nodes() if isinstance(node, Transposable)]:143 # for each transpose node we look up and down from the transpose in and transpose out144 # respectively to see if another transpose reverses this one with nothing145 # inbetween that is transpose sensitive146 if transpose_node.transpose_in:147 for edge in G.in_edges(transpose_node.name):148 # this can be true in the case where a node has constant inputs149 # it probably should be eliminated and all nodes transposed uniformly150 if edge.to_idx >= len(transpose_node.transpose_in):151 continue152 trans = transpose_node.transpose_in[edge.to_idx]153 if trans is None:154 continue155 result = search_up_edges(G, visited_edges, transpose_node,156 transpose_node.transpose_in[edge.to_idx], [], start_edge=edge)157 for r in result:158 visited_edges |= set(r[1])159 # result is (from_node, from_transpose_dir, from_idx), (to_node, to_transpose_dir, to_idx),160 # edge list, transpose (from_node)161 results.append(162 (163 (r[0], r[2], r[3]),164 (transpose_node, 'in', edge.to_idx),165 r[1][::-1],166 getattr(r[0], "transpose_" + r[2])[r[3]]167 )168 )169 if transpose_node.transpose_out:170 for edge in G.out_edges(transpose_node.name):171 trans = transpose_node.transpose_out[edge.from_idx]172 if trans is None:173 continue174 result = search_down_edges(G, visited_edges, transpose_node,175 trans, [], start_edge=edge)176 for r in result:177 visited_edges |= set(r[1])178 results.append(179 (180 (transpose_node, 'out', edge.from_idx),181 (r[0], r[2], r[3]),182 r[1],183 transpose_node.transpose_out[edge.from_idx]184 )185 )186 return results187def process_result(res):188 LOG.info("eliminating transpose between %s[%s] and %s[%s]",189 res[0][0].name, res[0][1], res[1][0].name, res[1][1]190 )191 transpose = res[3]192 for edge in res[2]:193 to_node = edge.to_node194 if isinstance(to_node, ReshapeParameters) and not to_node.transpose_in:195 LOG.info("eliminating input transpose on %s", to_node.name)196 transpose = reverse_reshape(transpose, to_node.old_shape, to_node.shape)197 to_node.shape.transpose(transpose)198 elif isinstance(to_node, StridedSliceParameters):199 LOG.info("transpose strided slice %s", to_node.name)200 to_node.act_slice = [to_node.act_slice[idx] for idx in transpose]201 to_node.out_shape = [to_node.out_shape[idx] for idx in transpose]202 for node, direction, edge_idx in [res[idx] for idx in range(2)]:203 trans = getattr(node, "transpose_"+direction)204 # This transpose node may have been selected because it only has205 # one dimension in which case there may not actually be a transpose206 if trans:207 trans[edge_idx] = None208 if all(elem is None for elem in trans):209 setattr(node, "transpose_"+direction, None)210def eliminate_transposes(G):211 """Eliminates unnecessary transposes from the graph. Valid transposes are those that have no...
sparse_csr_matrix_grad.py
Source:sparse_csr_matrix_grad.py
...53 sparse_csr_matrix_ops.sparse_matrix_mul(grad, beta), None, None)54@ops.RegisterGradient("SparseMatrixTranspose")55def _SparseMatrixTransposeGrad(op, grad):56 """Gradient for sparse_matrix_transpose op."""57 return sparse_csr_matrix_ops.sparse_matrix_transpose(58 grad, type=op.get_attr("type"), conjugate=op.get_attr("conjugate"))59@ops.RegisterGradient("SparseMatrixSoftmax")60def _SparseMatrixSoftmaxGrad(op, grad_softmax):61 """Gradient for sparse_matrix_softmax op."""62 softmax = op.outputs[0]63 return sparse_csr_matrix_ops.sparse_matrix_softmax_grad(64 softmax, grad_softmax, type=op.get_attr("type"))65@ops.RegisterGradient("SparseMatrixMatMul")66def _SparseMatrixMatMulGrad(op, grad):67 """Gradient for sparse_matrix_mat_mul op."""68 # input to sparse_matrix_mat_mul is (A, B) with CSR A and dense B.69 # Output is dense:70 # C = opA(A) . opB(B) if transpose_output = false71 # C = (opA(A) . opB(B))' = opB(B)' . opA(A)' if transpose_output = true....
matmul_benchmark.py
Source:matmul_benchmark.py
1# Copyright 2015 The TensorFlow Authors. All Rights Reserved.2#3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7# http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14# ==============================================================================15"""Benchmark for Matmul operator."""16from __future__ import absolute_import17from __future__ import division18from __future__ import print_function19import itertools20import time21import numpy as np22from tensorflow.python.client import session as session_lib23from tensorflow.python.framework import ops24from tensorflow.python.ops import control_flow_ops25from tensorflow.python.ops import math_ops26from tensorflow.python.ops import random_ops27from tensorflow.python.ops import variables28from tensorflow.python.platform import test29def build_graph(device, n, m, k, transpose_a, transpose_b, dtype):30 """Build a graph containing a sequence of matmul operations.31 Args:32 device: String, the device to run on.33 n: tensor A's first dimension size.34 m: tensor A's second dimension size.35 k: tensor B's second dimension size.36 transpose_a: boolean value to show if tensor A is transposed.37 transpose_b: boolean value to show if tensor B is transposed.38 dtype: numpy data type of the input tensor.39 Returns:40 A matmul operation to run()41 """42 with ops.device('%s' % device):43 if not transpose_a:44 x = variables.Variable(random_ops.random_uniform([n, m], dtype=dtype))45 else:46 x = variables.Variable(random_ops.random_uniform([m, n], dtype=dtype))47 if not transpose_b:48 y = variables.Variable(random_ops.random_uniform([m, k], dtype=dtype))49 else:50 y = variables.Variable(random_ops.random_uniform([k, m], dtype=dtype))51 z = math_ops.matmul(x, y, transpose_a=transpose_a, transpose_b=transpose_b)52 return control_flow_ops.group(z)53class MatmulBenchmark(test.Benchmark):54 """Benchmark matmul!"""55 def run_graph(self, device, n, m, k, transpose_a, transpose_b, num_iters,56 dtype):57 """Run the graph and print its execution time.58 Args:59 device: String, the device to run on.60 n: tensor A's first dimension size.61 m: tensor A's second dimension size.62 k: tensor B's second dimension size.63 transpose_a: boolean value to show if tensor A is transposed.64 transpose_b: boolean value to show if tensor B is transposed.65 num_iters: number of iterations to run the benchmark.66 dtype: numpy data type of the input tensor.67 Returns:68 The duration of the run in seconds.69 """70 graph = ops.Graph()71 with graph.as_default():72 output = build_graph(device, n, m, k, transpose_a, transpose_b, dtype)73 with session_lib.Session(graph=graph) as session:74 variables.global_variables_initializer().run()75 for _ in range(500):76 session.run(output)77 start_time = time.time()78 for _ in range(num_iters):79 session.run(output)80 duration = (time.time() - start_time)81 num_items = n * m * k * 282 throughput = num_items * num_iters / duration / 1e983 print('%s %s input_info:%s %d %.4fsec, %.4fGitems/s.' %84 (device, str(dtype), str(n) + 'x' + str(m) + 'x' + str(k) +85 ',ta:' + str(transpose_a) + '.tb:' + str(transpose_b), num_iters,86 duration, throughput))87 name_template = ('matmul_{device}_{dtype}_input_info_{inputinfo}')88 self.report_benchmark(89 name=name_template.format(90 device=device,91 dtype=str(dtype).replace(' ', ''),92 inputinfo=str(n) + 'x' + str(m) + 'x' + str(k) + ',ta:' +93 str(transpose_a) + ',tb:' + str(transpose_b)).replace(' ', ''),94 iters=num_iters,95 wall_time=duration)96 return duration97 def run_test_gpu(self, n, m, k, transpose_a, transpose_b, dtype, num_iters):98 self.run_graph(test.gpu_device_name(), n, m, k, transpose_a, transpose_b,99 num_iters, dtype)100 def test_round(self, num_iters):101 dtypes = [np.float32, np.float64]102 for dtype in dtypes:103 for n, m, (transpose_a, transpose_b) in itertools.product(104 [512, 1024], [1, 8, 16, 128], [(False, False), (True, False),105 (False, True)]):106 k = n107 self.run_test_gpu(n, m, k, transpose_a, transpose_b, dtype, num_iters)108 for n, m, k, (transpose_a, transpose_b) in itertools.product(109 [200], [1, 8, 20], [10000], [(False, False), (True, False),110 (False, True)]):111 self.run_test_gpu(n, m, k, transpose_a, transpose_b, dtype, num_iters)112 for (n, m, k), (transpose_a, transpose_b) in itertools.product(113 [(200, 20, 20000), (1, 10000, 200)], [(False, False), (True, False),114 (False, True)]):115 self.run_test_gpu(n, m, k, transpose_a, transpose_b, dtype, num_iters)116 def benchmark_matmul(self):117 self.test_round(num_iters=200)118if __name__ == '__main__':...
transpose-test.js
Source:transpose-test.js
...7 topic: function() {8 return d3.transpose;9 },10 "transposes a square matrix": function(transpose) {11 assert.deepEqual(d3.transpose([[1, 2], [3, 4]]), [[1, 3], [2, 4]]);12 },13 "transposes a non-square matrix": function(transpose) {14 assert.deepEqual(d3.transpose([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]]), [[1, 2], [2, 4], [3, 6], [4, 8], [5, 10]]);15 },16 "transposes a single-row matrix": function(transpose) {17 assert.deepEqual(d3.transpose([[1, 2, 3, 4, 5]]), [[1], [2], [3], [4], [5]]);18 },19 "transposes an empty matrix": function(transpose) {20 assert.deepEqual(d3.transpose([]), []);21 },22 "ignores extra elements given an irregular matrix": function(transpose) {23 assert.deepEqual(d3.transpose([[1, 2], [3, 4], [5, 6, 7]]), [[1, 3, 5], [2, 4, 6]]);24 }25 }26});...
Using AI Code Generation
1var wptoolkit = require('wptoolkit');2var matrix = [[1,2,3],[4,5,6],[7,8,9]];3var matrixTranspose = wptoolkit.transpose(matrix);4console.log(matrixTranspose);5var wptoolkit = require('wptoolkit');6var matrix = [[1,2,3],[4,5,6],[7,8,9]];7var matrixTranspose = wptoolkit.transpose(matrix);8console.log(matrixTranspose);9var wptoolkit = require('wptoolkit');10var matrix = [[1,2,3],[4,5,6],[7,8,9]];11var matrixTranspose = wptoolkit.transpose(matrix);12console.log(matrixTranspose);13var wptoolkit = require('wptoolkit');14var matrix = [[1,2,3],[4,5,6],[7,8,9]];15var matrixTranspose = wptoolkit.transpose(matrix);16console.log(matrixTranspose);17var wptoolkit = require('wptoolkit');18var matrix = [[1,2,3],[4,5,6],[7,8,9]];19var matrixTranspose = wptoolkit.transpose(matrix);20console.log(matrixTranspose);
Using AI Code Generation
1var wpt = require('wpt');2var transpose = wpt.transpose;3var transpose2 = wpt.transpose2;4var transpose3 = wpt.transpose3;5var transpose4 = wpt.transpose4;6var transpose5 = wpt.transpose5;7var transpose6 = wpt.transpose6;8var transpose7 = wpt.transpose7;9var transpose8 = wpt.transpose8;10var transpose9 = wpt.transpose9;11var transpose10 = wpt.transpose10;12var transpose11 = wpt.transpose11;13var transpose12 = wpt.transpose12;14var transpose13 = wpt.transpose13;15var transpose14 = wpt.transpose14;16var transpose15 = wpt.transpose15;17var transpose16 = wpt.transpose16;18var transpose17 = wpt.transpose17;19var transpose18 = wpt.transpose18;20var transpose19 = wpt.transpose19;21var transpose20 = wpt.transpose20;22var transpose21 = wpt.transpose21;23var transpose22 = wpt.transpose22;24var transpose23 = wpt.transpose23;25var transpose24 = wpt.transpose24;26var transpose25 = wpt.transpose25;27var transpose26 = wpt.transpose26;28var transpose27 = wpt.transpose27;29var transpose28 = wpt.transpose28;30var transpose29 = wpt.transpose29;31var transpose30 = wpt.transpose30;32var transpose31 = wpt.transpose31;33var transpose32 = wpt.transpose32;34var transpose33 = wpt.transpose33;35var transpose34 = wpt.transpose34;36var transpose35 = wpt.transpose35;37var transpose36 = wpt.transpose36;38var transpose37 = wpt.transpose37;39var transpose38 = wpt.transpose38;40var transpose39 = wpt.transpose39;41var transpose40 = wpt.transpose40;42var transpose41 = wpt.transpose41;43var transpose42 = wpt.transpose42;44var transpose43 = wpt.transpose43;45var transpose44 = wpt.transpose44;46var transpose45 = wpt.transpose45;47var transpose46 = wpt.transpose46;48var transpose47 = wpt.transpose47;49var transpose48 = wpt.transpose48;50var transpose49 = wpt.transpose49;51var transpose50 = wpt.transpose50;52var transpose51 = wpt.transpose51;53var transpose52 = wpt.transpose52;54var transpose53 = wpt.transpose53;55var transpose54 = wpt.transpose54;
Using AI Code Generation
1var wpt = require('wpt');2var transpose = wpt.transpose;3var arr = [[1,2,3],[4,5,6],[7,8,9]];4console.log(transpose(arr));5var wpt = require('wpt');6var transpose = wpt.transpose;7var arr = [[1,2,3],[4,5,6],[7,8,9]];8console.log(transpose(arr));
Using AI Code Generation
1var wptools = require('wptools');2var page = wptools.page('Albert Einstein');3page.get(function(err, resp) {4 console.log(resp);5});6var wptools = require('wptools');7var page = wptools.page('Albert Einstein');8page.get(function(err, resp) {9 console.log(resp);10});11var wptools = require('wptools');12var page = wptools.page('Albert Einstein');13page.get(function(err, resp) {14 console.log(resp);15});16var wptools = require('wptools');17var page = wptools.page('Albert Einstein');18page.get(function(err, resp) {19 console.log(resp);20});21var wptools = require('wptools');22var page = wptools.page('Albert Einstein');23page.get(function(err, resp) {24 console.log(resp);25});26var wptools = require('wptools');27var page = wptools.page('Albert Einstein');28page.get(function(err, resp) {29 console.log(resp);30});31var wptools = require('wptools');32var page = wptools.page('Albert Einstein');33page.get(function(err, resp) {34 console.log(resp);35});36var wptools = require('wptools');37var page = wptools.page('Albert Einstein');38page.get(function(err, resp) {39 console.log(resp);40});41var wptools = require('wptools');42var page = wptools.page('Albert Einstein');43page.get(function(err, resp) {44 console.log(resp);45});46var wptools = require('wptools');
Using AI Code Generation
1var wptools = require('wptools');2var wiki = wptools.page('Albert Einstein');3wiki.get(function(err, resp) {4 console.log(resp);5});6var wptools = require('wptools');7var wiki = wptools.page('Albert Einstein');8wiki.get(function(err, resp) {9 console.log(resp);10});11var wptools = require('wptools');12var wiki = wptools.page('Albert Einstein');13wiki.get(function(err, resp) {14 console.log(resp);15});16var wptools = require('wptools');17var wiki = wptools.page('Albert Einstein');18wiki.get(function(err, resp) {19 console.log(resp);20});21var wptools = require('wptools');22var wiki = wptools.page('Albert Einstein');23wiki.get(function(err, resp) {24 console.log(resp);25});26var wptools = require('wptools');27var wiki = wptools.page('Albert Einstein');28wiki.get(function(err, resp) {29 console.log(resp);30});31var wptools = require('wptools');32var wiki = wptools.page('Albert Einstein');33wiki.get(function(err, resp) {34 console.log(resp);35});36var wptools = require('wptools');37var wiki = wptools.page('Albert Einstein');38wiki.get(function(err, resp) {39 console.log(resp);40});41var wptools = require('wptools');42var wiki = wptools.page('Albert Einstein');43wiki.get(function(err, resp) {44 console.log(resp);45});46var wptools = require('wptools');47var wiki = wptools.page('Albert
Using AI Code Generation
1var wptools = require('wptools');2wptools.page('Albert Einstein').get(function(err, resp) {3 console.log(resp.json());4});5var wptools = require('wptools');6wptools.page('Albert Einstein').get(function(err, resp) {7 console.log(resp.json());8});9var wptools = require('wptools');10wptools.page('Albert Einstein').get(function(err, resp) {11 console.log(resp.json());12});13var wptools = require('wptools');14wptools.page('Albert Einstein').get(function(err, resp) {15 console.log(resp.json());16});17var wptools = require('wptools');18wptools.page('Albert Einstein').get(function(err, resp) {19 console.log(resp.json());20});21var wptools = require('wptools');22wptools.page('Albert Einstein').get(function(err, resp) {23 console.log(resp.json());24});25var wptools = require('wptools');26wptools.page('Albert Einstein').get(function(err, resp) {27 console.log(resp.json());28});29var wptools = require('wptools');30wptools.page('Albert Einstein').get(function(err, resp) {31 console.log(resp.json());32});33var wptools = require('wptools');34wptools.page('Albert Einstein').get(function(err, resp) {35 console.log(resp.json());36});37var wptools = require('wptools');38wptools.page('Albert Einstein').get(function(err, resp) {39 console.log(resp.json());40});41var wptools = require('wptools');42wptools.page('Albert Einstein').get(function(err, resp) {43 console.log(resp.json());44});45var wptools = require('wptools');
Using AI Code Generation
1var wptools = require('wptools');2var fs = require('fs');3var wiki = wptools.page('Wikipedia:Translating_Wikipedia').get(function(data) {4 var lines = data.text.split('5');6 var lines = lines.map(function(line) {7 return line.replace(/\{\{[^\}]+\}\}/g, '').replace(/\[\[[^\]]+\]\]/g, '').replace(/\[\[([^\]]+)\]\]/g, '$1').replace(/\[\[([^\]]+)\|([^\]]+)\]\]/g, '$2').replace(/\{\{[^\}]+\|([^\}]+)\}\}/g, '$1');8 });9 var lines = lines.join('10');11 fs.writeFileSync('test.txt', lines);12});
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!!