lt-tensor 0.0.1a14__py3-none-any.whl → 0.0.1a16__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -323,8 +323,11 @@ class AudioEncoder(Model):
323
323
 
324
324
  def __init__(
325
325
  self,
326
- channels: int = 80,
326
+ channels: int,
327
327
  alpha: float = 4.0,
328
+ feat_channels: int = 64,
329
+ out_features: Optional[int] = None,
330
+ out_channels: int = 1,
328
331
  interp_mode: Literal[
329
332
  "nearest",
330
333
  "linear",
@@ -338,16 +341,60 @@ class AudioEncoder(Model):
338
341
 
339
342
  self.net = nn.Sequential(
340
343
  nn.Conv1d(
341
- channels, channels, kernel_size=3, stride=2, padding=5, groups=channels
344
+ channels, feat_channels, kernel_size=3, stride=1, padding=5, groups=1
342
345
  ),
343
346
  nn.LeakyReLU(0.1),
344
- nn.Conv1d(channels, channels, kernel_size=7, stride=1, padding=1, groups=1),
347
+ nn.Conv1d(
348
+ feat_channels,
349
+ feat_channels,
350
+ kernel_size=3,
351
+ stride=2,
352
+ padding=1,
353
+ groups=feat_channels,
354
+ ),
355
+ nn.LeakyReLU(0.1),
356
+ nn.Conv1d(
357
+ feat_channels,
358
+ feat_channels,
359
+ kernel_size=3,
360
+ stride=1,
361
+ padding=1,
362
+ groups=feat_channels // 8,
363
+ ),
364
+ nn.LeakyReLU(0.1),
365
+ nn.Conv1d(
366
+ feat_channels,
367
+ feat_channels,
368
+ kernel_size=7,
369
+ stride=1,
370
+ padding=1,
371
+ groups=1,
372
+ ),
345
373
  )
346
- self.fc = nn.Linear(channels, channels)
374
+ self.fc = nn.Linear(feat_channels, channels)
375
+ self.feat_channels = feat_channels
347
376
  self.activation = activation
348
377
  self.channels = channels
349
378
  self.mode = interp_mode
350
379
  self.alpha = alpha
380
+ self.post_conv = nn.Conv1d(
381
+ channels,
382
+ out_channels,
383
+ kernel_size=1,
384
+ stride=1,
385
+ padding=0,
386
+ dilation=1,
387
+ groups=1,
388
+ bias=True,
389
+ )
390
+ if out_features is not None:
391
+ self.format_out = lambda tensor: F.interpolate(
392
+ tensor,
393
+ size=out_features,
394
+ mode=interp_mode,
395
+ )
396
+ else:
397
+ self.format_out = nn.Identity()
351
398
 
352
399
  def forward(self, mels: Tensor, cr_audio: Tensor):
353
400
  sin = torch.asin(cr_audio)
@@ -367,14 +414,20 @@ class AudioEncoder(Model):
367
414
  .contiguous()
368
415
  )
369
416
  x = self.activation(x)
370
- return self.fc(x).transpose(-1, -2)
417
+
418
+ xt = self.fc(x).transpose(-1, -2)
419
+ out = self.post_conv(xt)
420
+ return self.format_out(out)
371
421
 
372
422
 
373
423
  class AudioEncoderAttn(Model):
374
424
  def __init__(
375
425
  self,
376
- channels: int = 80,
426
+ channels: int,
427
+ feat_channels: int = 64,
377
428
  alpha: float = 4.0,
429
+ out_channels: Optional[int] = None,
430
+ out_features: int = 1,
378
431
  interp_mode: Literal[
379
432
  "nearest",
380
433
  "linear",
@@ -388,16 +441,54 @@ class AudioEncoderAttn(Model):
388
441
 
389
442
  self.net = nn.Sequential(
390
443
  nn.Conv1d(
391
- channels, channels, kernel_size=3, stride=2, padding=5, groups=channels
444
+ channels, feat_channels, kernel_size=3, stride=1, padding=1, groups=1
445
+ ),
446
+ nn.LeakyReLU(0.1),
447
+ nn.Conv1d(
448
+ feat_channels,
449
+ feat_channels,
450
+ kernel_size=3,
451
+ stride=2,
452
+ padding=5,
453
+ groups=feat_channels,
392
454
  ),
393
455
  nn.LeakyReLU(0.1),
394
- nn.Conv1d(channels, channels, kernel_size=7, stride=1, padding=1, groups=1),
456
+ nn.Conv1d(
457
+ feat_channels,
458
+ feat_channels,
459
+ kernel_size=3,
460
+ stride=1,
461
+ padding=1,
462
+ groups=feat_channels // 8,
463
+ ),
464
+ nn.LeakyReLU(0.1),
465
+ nn.Conv1d(
466
+ feat_channels, channels, kernel_size=7, stride=1, padding=1, groups=1
467
+ ),
395
468
  )
396
469
  self.fusion = CrossAttentionFusion(channels, channels, 2, d_model=channels)
397
470
  self.channels = channels
398
471
  self.mode = interp_mode
399
472
  self.alpha = alpha
400
473
  self.activation = activation
474
+ self.post_conv = nn.Conv1d(
475
+ channels,
476
+ out_channels,
477
+ kernel_size=1,
478
+ stride=1,
479
+ padding=0,
480
+ dilation=1,
481
+ groups=1,
482
+ bias=True,
483
+ )
484
+ if out_features is not None:
485
+ self.format_out = lambda tensor: F.interpolate(
486
+ tensor,
487
+ size=out_features,
488
+ mode=interp_mode,
489
+ )
490
+ else:
491
+ self.format_out = nn.Identity()
401
492
 
402
493
  def forward(self, mels: Tensor, cr_audio: Tensor):
403
494
  sin = torch.asin(cr_audio)
@@ -408,9 +499,9 @@ class AudioEncoderAttn(Model):
408
499
  )
409
500
  x = self.activation(self.net(mod))
410
501
  x = F.interpolate(x, size=mels.shape[-1], mode=self.mode)
411
-
412
- # Ensure contiguous before transpose
413
502
  x_t = x.transpose(-2, -1).contiguous()
414
503
  mels_t = mels.transpose(-2, -1).contiguous()
415
504
 
416
- return self.fusion(x_t, mels_t).transpose(-2, -1)
505
+ xt = self.fusion(x_t, mels_t).transpose(-2, -1)
506
+ out = self.post_conv(xt)
507
+ return self.format_out(out)
@@ -5,7 +5,9 @@ __all__ = [
5
5
  "ResBlock2D",
6
6
  "ResBlock1DShuffled",
7
7
  "AdaResBlock1D",
8
- "ResBlocks",
8
+ "ResBlocks1D",
9
+ "ResBlock1D2",
10
+ "ShuffleBlock2D",
9
11
  ]
10
12
  import math
11
13
  from lt_utils.common import *
@@ -45,38 +47,8 @@ class ConvNets(Model):
45
47
  m.weight.data.normal_(mean, std)
46
48
 
47
49
 
48
- class ResBlocks(ConvNets):
49
- def __init__(
50
- self,
51
- channels: int,
52
- resblock_kernel_sizes: List[Union[int, List[int]]] = [3, 7, 11],
53
- resblock_dilation_sizes: List[Union[int, List[int]]] = [
54
- [1, 3, 5],
55
- [1, 3, 5],
56
- [1, 3, 5],
57
- ],
58
- activation: nn.Module = nn.LeakyReLU(0.1),
59
- ):
60
- super().__init__()
61
- self.num_kernels = len(resblock_kernel_sizes)
62
- self.rb = nn.ModuleList()
63
- self.activation = activation
64
-
65
- for k, j in zip(resblock_kernel_sizes, resblock_dilation_sizes):
66
- self.rb.append(ResBlock1D(channels, k, j, activation))
67
-
68
- self.rb.apply(self.init_weights)
69
-
70
- def forward(self, x: torch.Tensor):
71
- xs = None
72
- for i, block in enumerate(self.rb):
73
- if i == 0:
74
- xs = block(x)
75
- else:
76
- xs += block(x)
77
- x = xs / self.num_kernels
78
- return x
79
-
50
+ def get_padding(ks, d):
51
+ return int((ks * d - d) / 2)
80
52
 
81
53
 
82
54
  class ResBlock1D(ConvNets):
@@ -92,14 +64,13 @@ class ResBlock1D(ConvNets):
92
64
  self.conv_nets = nn.ModuleList(
93
65
  [
94
66
  self._get_conv_layer(i, channels, kernel_size, 1, dilation, activation)
95
- for i in range(3)
67
+ for i in range(len(dilation))
96
68
  ]
97
69
  )
98
70
  self.conv_nets.apply(self.init_weights)
99
71
  self.last_index = len(self.conv_nets) - 1
100
72
 
101
73
  def _get_conv_layer(self, id, ch, k, stride, d, actv):
102
- get_padding = lambda ks, d: int((ks * d - d) / 2)
103
74
  return nn.Sequential(
104
75
  actv, # 1
105
76
  weight_norm(
@@ -126,16 +97,11 @@ class ResBlock1DShuffled(ConvNets):
126
97
  kernel_size=3,
127
98
  dilation=(1, 3, 5),
128
99
  activation: nn.Module = nn.LeakyReLU(0.1),
129
- add_channel_shuffle: bool = False, # requires pytorch 2.7.0 +
130
100
  channel_shuffle_groups=1,
131
101
  ):
132
102
  super().__init__()
133
103
 
134
- self.channel_shuffle = (
135
- nn.ChannelShuffle(channel_shuffle_groups)
136
- if add_channel_shuffle
137
- else nn.Identity()
138
- )
104
+ self.channel_shuffle = nn.ChannelShuffle(channel_shuffle_groups)
139
105
 
140
106
  self.conv_nets = nn.ModuleList(
141
107
  [
@@ -171,29 +137,67 @@ class ResBlock1DShuffled(ConvNets):
171
137
  class ResBlock2D(Model):
172
138
  def __init__(
173
139
  self,
174
- in_channels,
175
- out_channels,
176
- downsample=False,
140
+ in_channels: int,
141
+ out_channels: Optional[int] = None,
142
+ hidden_dim: int = 32,
143
+ downscale: bool = False,
144
+ activation: nn.Module = nn.LeakyReLU(0.2),
177
145
  ):
178
146
  super().__init__()
179
- stride = 2 if downsample else 1
147
+ stride = 2 if downscale else 1
148
+ if out_channels is None:
149
+ out_channels = in_channels
180
150
 
181
151
  self.block = nn.Sequential(
182
- nn.Conv2d(in_channels, out_channels, 3, stride, 1),
183
- nn.LeakyReLU(0.2),
184
- nn.Conv2d(out_channels, out_channels, 3, 1, 1),
152
+ nn.Conv2d(in_channels, hidden_dim, 3, stride, 1),
153
+ activation,
154
+ nn.Conv2d(hidden_dim, hidden_dim, 7, 1, 3),
155
+ activation,
156
+ nn.Conv2d(hidden_dim, out_channels, 3, 1, 1),
185
157
  )
186
158
 
187
159
  self.skip = nn.Identity()
188
- if downsample or in_channels != out_channels:
160
+ if downscale or in_channels != out_channels:
189
161
  self.skip = spectral_norm_select(
190
162
  nn.Conv2d(in_channels, out_channels, 1, stride)
191
163
  )
192
- # on less to be handled every cicle
164
+ # on less to be handled every cycle
193
165
  self.sqrt_2 = math.sqrt(2)
194
166
 
195
167
  def forward(self, x: Tensor):
196
- return (self.block(x) + self.skip(x)) / self.sqrt_2
168
+ return x + ((self.block(x) + self.skip(x)) / self.sqrt_2)
169
+
170
+
171
+ class ShuffleBlock2D(ConvNets):
172
+ def __init__(
173
+ self,
174
+ channels: int,
175
+ out_channels: Optional[int] = None,
176
+ hidden_dim: int = 32,
177
+ downscale: bool = False,
178
+ activation: nn.Module = nn.LeakyReLU(0.1),
179
+ ):
180
+ super().__init__()
181
+ if out_channels is None:
182
+ out_channels = channels
183
+ self.shuffle = nn.ChannelShuffle(groups=2)
184
+ self.ch_split = lambda tensor: torch.split(tensor, 1, dim=1)
185
+ self.activation = activation
186
+ self.resblock_2d = ResBlock2D(
187
+ channels, out_channels, hidden_dim, downscale, activation
188
+ )
189
+
190
+ def shuffle_channels(self, tensor: torch.Tensor):
191
+ with torch.no_grad():
192
+ x = F.channel_shuffle(tensor.transpose(1, -1), tensor.shape[1]).transpose(
193
+ -1, 1
194
+ )
195
+ return self.ch_split(x)
196
+
197
+ def forward(self, x: torch.Tensor):
198
+ ch1, ch2 = self.shuffle_channels(x)
199
+ ch2 = self.resblock_2d(ch2)
200
+ return torch.cat((ch1, ch2), dim=1)
197
201
 
198
202
 
199
203
  class AdaResBlock1D(ConvNets):
@@ -207,46 +211,111 @@ class AdaResBlock1D(ConvNets):
207
211
  ):
208
212
  super().__init__()
209
213
 
214
+ self.alpha1 = nn.ModuleList()
215
+ self.alpha2 = nn.ModuleList()
210
216
  self.conv_nets = nn.ModuleList(
211
217
  [
212
218
  self._get_conv_layer(
213
- i,
219
+ d,
214
220
  res_block_channels,
215
221
  ada_channel_in,
216
222
  kernel_size,
217
- 1,
218
- dilation,
219
223
  )
220
- for i in range(3)
224
+ for d in dilation
221
225
  ]
222
226
  )
223
227
  self.conv_nets.apply(self.init_weights)
224
228
  self.last_index = len(self.conv_nets) - 1
225
229
  self.activation = activation
226
230
 
227
- def _get_conv_layer(self, id, ch, ada_ch, k, stride, d):
228
- get_padding = lambda ks, d: int((ks * d - d) / 2)
231
+ def _get_conv_layer(self, d, ch, ada_ch, k):
232
+ self.alpha1.append(nn.Parameter(torch.ones(1, ada_ch, 1)))
233
+ self.alpha2.append(nn.Parameter(torch.ones(1, ada_ch, 1)))
229
234
  return nn.ModuleDict(
230
235
  dict(
231
236
  norm1=AdaFusion1D(ada_ch, ch),
232
237
  norm2=AdaFusion1D(ada_ch, ch),
233
- alpha1=nn.Parameter(torch.ones(1, ada_ch, 1)),
234
- alpha2=nn.Parameter(torch.ones(1, ada_ch, 1)),
235
238
  conv1=weight_norm(
236
239
  nn.Conv1d(
237
- ch, ch, k, stride, dilation=d[id], padding=get_padding(k, d[id])
240
+ ch, ch, k, 1, dilation=d, padding=get_padding(k, d)
238
241
  )
239
242
  ), # 2
240
243
  conv2=weight_norm(
241
- nn.Conv1d(ch, ch, k, stride, dilation=1, padding=get_padding(k, 1))
244
+ nn.Conv1d(ch, ch, k, 1, dilation=1, padding=get_padding(k, 1))
242
245
  ), # 4
243
246
  )
244
247
  )
245
248
 
246
249
  def forward(self, x: torch.Tensor, y: torch.Tensor):
247
- for cnn in self.conv_nets:
248
- xt = self.activation(cnn["norm1"](x, y, cnn["alpha1"]))
250
+ for i, cnn in enumerate(self.conv_nets):
251
+ xt = self.activation(cnn["norm1"](x, y, self.alpha1[i]))
249
252
  xt = cnn["conv1"](xt)
250
- xt = self.activation(cnn["norm2"](xt, y, cnn["alpha2"]))
253
+ xt = self.activation(cnn["norm2"](xt, y, self.alpha2[i]))
251
254
  x = cnn["conv2"](xt) + x
252
255
  return x
256
+
257
+
258
+ class ResBlock1D2(ConvNets):
259
+ def __init__(
260
+ self,
261
+ channels,
262
+ kernel_size=3,
263
+ dilation=(1, 3, 5),
264
+ activation: nn.Module = nn.LeakyReLU(0.1),
265
+ ):
266
+ super().__init__()
267
+ self.convs = nn.ModuleList(
268
+ [
269
+ weight_norm(
270
+ nn.Conv1d(
271
+ channels,
272
+ channels,
273
+ kernel_size,
274
+ dilation=d,
275
+ padding=get_padding(kernel_size, d),
276
+ )
277
+ )
278
+ for d in range(dilation)
279
+ ]
280
+ )
281
+ self.convs.apply(self.init_weights)
282
+ self.activation = activation
283
+
284
+ def forward(self, x):
285
+ for c in self.convs:
286
+ xt = c(self.activation(x))
287
+ x = xt + x
288
+ return x
289
+
290
+
291
+ class ResBlocks1D(ConvNets):
292
+ def __init__(
293
+ self,
294
+ channels: int,
295
+ resblock_kernel_sizes: List[Union[int, List[int]]] = [3, 7, 11],
296
+ resblock_dilation_sizes: List[Union[int, List[int]]] = [
297
+ [1, 3, 5],
298
+ [1, 3, 5],
299
+ [1, 3, 5],
300
+ ],
301
+ activation: nn.Module = nn.LeakyReLU(0.1),
302
+ block: Union[ResBlock1D, ResBlock1D2] = ResBlock1D,
303
+ ):
304
+ super().__init__()
305
+ self.num_kernels = len(resblock_kernel_sizes)
306
+ self.rb = nn.ModuleList()
307
+ self.activation = activation
308
+
309
+ for k, j in zip(resblock_kernel_sizes, resblock_dilation_sizes):
310
+ self.rb.append(block(channels, k, j, activation))
311
+
312
+ self.rb.apply(self.init_weights)
313
+
314
+ def forward(self, x: torch.Tensor):
315
+ xs = None
316
+ for i, block in enumerate(self.rb):
317
+ if i == 0:
318
+ xs = block(x)
319
+ else:
320
+ xs += block(x)
321
+ return xs / self.num_kernels
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lt-tensor
3
- Version: 0.0.1a14
3
+ Version: 0.0.1a16
4
4
  Summary: General utilities for PyTorch and others. Built for general use.
5
5
  Home-page: https://github.com/gr1336/lt-tensor/
6
6
  Author: gr1336
@@ -4,29 +4,29 @@ lt_tensor/losses.py,sha256=zvkCOnE5XpF3v6ymivRIdqPTsMM5zc94ZMom7YDi3zM,4946
4
4
  lt_tensor/lr_schedulers.py,sha256=LSZzqrOOLzSthD8k-W4cYPJt0vCjmHkiJkLr5e3yRTE,3659
5
5
  lt_tensor/math_ops.py,sha256=TkD4WQG42KsQ9Fg7FXOjf8f-ixtW0apf2XjaooecVx4,2257
6
6
  lt_tensor/misc_utils.py,sha256=S57M5XuGsIuaOKnEGZJsY3B2dTmggpdhsqQr51CQsYo,28754
7
- lt_tensor/model_base.py,sha256=lxzRXfPlR_t_6LfgRw2dct55evrtmwTiDqZGAe3jLro,20026
7
+ lt_tensor/model_base.py,sha256=qqqIVpYz6nv01MnZuuAj1dxq4_NN-zSivP1GaegA9TI,21597
8
8
  lt_tensor/monotonic_align.py,sha256=LhBd8p1xdBzg6jQrQX1j7b4PNeYGwIqM24zcU-pHOLE,2239
9
9
  lt_tensor/noise_tools.py,sha256=wFeAsHhLhSlEc5XU5LbFKaXoHeVxrWjiMeljjGdIKyM,11363
10
10
  lt_tensor/torch_commons.py,sha256=fntsEU8lhBQo0ebonI1iXBkMbWMN3HpBsG13EWlP5s8,718
11
11
  lt_tensor/transform.py,sha256=dZm8T_ov0blHMQu6nGiehsdG1VSB7bZBUVmTkT-PBdc,13257
12
12
  lt_tensor/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- lt_tensor/datasets/audio.py,sha256=j73oRyXt-AK4tWWYWjH-3c5RYouQBgDSCTuWHmyG8kQ,7450
14
- lt_tensor/model_zoo/__init__.py,sha256=RzG7fltZLyiIU_Za4pgfBPli5uPITiJkq4sTCd4uA_0,319
15
- lt_tensor/model_zoo/basic.py,sha256=_26H_jJk5Ld3DZiNpIhGosGfMxoFDZrI8bpDAYUOYno,10660
16
- lt_tensor/model_zoo/discriminator.py,sha256=dS5UmJZV5MxIFiaBlIXfgGLDdUT3y0Vuv9lDGHsjJE8,5849
17
- lt_tensor/model_zoo/features.py,sha256=CTFMidzza31pqQjwPfp_g0BNVfuQ8Dlo5JnxpYpKgag,13144
13
+ lt_tensor/datasets/audio.py,sha256=5Wvz1BJ7xXkLYpVLLw9RY3X3RgMdPPeGiN0-MmJDQy0,8045
14
+ lt_tensor/model_zoo/__init__.py,sha256=ltVTvmOlbOCfDc5Trvg0-Ta_Ujgkw0UVF9V5rqHx-RI,378
15
+ lt_tensor/model_zoo/basic.py,sha256=pI8HyiHK-cmWcEEaVY_EduUJOjZW6HOtXvJd8Rbhq30,15452
16
+ lt_tensor/model_zoo/features.py,sha256=DO8dlE0kmPKTNC1Xkv9wKegOOYkQa_rkxM4hhcNwJWA,15655
18
17
  lt_tensor/model_zoo/fusion.py,sha256=usC1bcjQRNivDc8xzkIS5T1glm78OLcs2V_tPqfp-eI,5422
19
18
  lt_tensor/model_zoo/pos_encoder.py,sha256=3d1EYLinCU9UAy-WuEWeYMGhMqaGknCiQ5qEmhw_UYM,4487
20
- lt_tensor/model_zoo/residual.py,sha256=3tc2fJaz6SxtKYAsxndahhwIxlN6oLk5tcdIXtUKaQc,7357
19
+ lt_tensor/model_zoo/residual.py,sha256=i5V4ju7DB3WesKBVm6KH_LyPoKGDUOyo2Usfs-PyP58,9394
21
20
  lt_tensor/model_zoo/transformer.py,sha256=HUFoFFh7EQJErxdd9XIxhssdjvNVx2tNGDJOTUfwG2A,4301
22
- lt_tensor/model_zoo/istft/__init__.py,sha256=SV96w9WUWfHMee8Vjgn2MP0igKft7_mLTju9rFVYGHY,102
23
- lt_tensor/model_zoo/istft/generator.py,sha256=wWHUfLFIItN-tB3pWkc1r9aTWpHYBFg7UfvLN4_cD78,3179
24
- lt_tensor/model_zoo/istft/sg.py,sha256=EaEi3otw_uY5QfqDBNIWBWTJSg3KnwzzR4FBr0u09C0,4838
25
- lt_tensor/model_zoo/istft/trainer.py,sha256=KZXsAptOJeLYlr6t-DPX1qxgN526-2EBKoQQlcsHp8Y,21054
21
+ lt_tensor/model_zoo/audio_models/__init__.py,sha256=CLoLqvbA_ltqm3KOg5AH3A0co0HtsLfFPUBsxxLSCgI,39
22
+ lt_tensor/model_zoo/audio_models/diffwave/__init__.py,sha256=aFSmr8PYpmOfbe15lhNoj-ZzP5ChrZcikovKLZKg7nw,140
23
+ lt_tensor/model_zoo/audio_models/diffwave/model.py,sha256=kHo76bxLJtTBn1m0gq5KKrUsjm9ASsCCwf8MvWaB1R8,6901
24
+ lt_tensor/model_zoo/audio_models/hifigan/__init__.py,sha256=BOBZSK2HFOdMcFyjrzwZi_TeAtBGIcpb8pQxiGlwLEE,12302
25
+ lt_tensor/model_zoo/audio_models/istft/__init__.py,sha256=o7Ie1qI22u_g9t1252PX4vl4uF6JHynAJryuz2lAZE0,12920
26
26
  lt_tensor/processors/__init__.py,sha256=4b9MxAJolXiJfSm20ZEspQTDm1tgLazwlPWA_jB1yLM,63
27
27
  lt_tensor/processors/audio.py,sha256=SMqNSl4Den-x1awTCQ8-TcR-0jPiv5lDaUpU93SRRaw,14749
28
- lt_tensor-0.0.1a14.dist-info/licenses/LICENSE,sha256=HUnu_iSPpnDfZS_PINhO3AoVizJD1A2vee8WX7D7uXo,11358
29
- lt_tensor-0.0.1a14.dist-info/METADATA,sha256=mxwJTAo51GfGEEW87lT-Tp1AHtoRvuKCmcPxAyqJxLQ,1033
30
- lt_tensor-0.0.1a14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
- lt_tensor-0.0.1a14.dist-info/top_level.txt,sha256=35FuhFeXnUyvHWdbVHGPh0hS8euofafnJ_GJAVSF4Kk,10
32
- lt_tensor-0.0.1a14.dist-info/RECORD,,
28
+ lt_tensor-0.0.1a16.dist-info/licenses/LICENSE,sha256=HUnu_iSPpnDfZS_PINhO3AoVizJD1A2vee8WX7D7uXo,11358
29
+ lt_tensor-0.0.1a16.dist-info/METADATA,sha256=uxk1cMeQkLniYUIgEjHD2eJ8_JGwAKS2minrCmAJfMo,1033
30
+ lt_tensor-0.0.1a16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
+ lt_tensor-0.0.1a16.dist-info/top_level.txt,sha256=35FuhFeXnUyvHWdbVHGPh0hS8euofafnJ_GJAVSF4Kk,10
32
+ lt_tensor-0.0.1a16.dist-info/RECORD,,