homa 0.3.13__py3-none-any.whl → 0.3.19__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.
@@ -0,0 +1,7 @@
1
+ class TracksTime:
2
+ def __init__(self):
3
+ super().__init__()
4
+ self.t = 0
5
+
6
+ def tick(self):
7
+ self.t += 1
@@ -1 +1,2 @@
1
1
  from .MovesNetworkToDevice import MovesNetworkToDevice
2
+ from .TracksTime import TracksTime
@@ -3,8 +3,8 @@ from ...device import get_device
3
3
 
4
4
 
5
5
  class CalculatesMetricNecessities:
6
- def __init__(self, *args, **kwargs):
7
- super().__init__(*args, **kwargs)
6
+ def __init__(self):
7
+ super().__init__()
8
8
 
9
9
  @torch.no_grad()
10
10
  def metric_necessities(self, dataloader):
@@ -3,8 +3,8 @@ from .ReportsLogits import ReportsLogits
3
3
 
4
4
 
5
5
  class PredictsProbabilities(ReportsLogits):
6
- def __init__(self, *args, **kwargs):
7
- super().__init__(*args, **kwargs)
6
+ def __init__(self):
7
+ super().__init__()
8
8
 
9
9
  def predict(self, x: torch.Tensor) -> torch.Tensor:
10
10
  logits = self.logits(x)
@@ -10,4 +10,5 @@ class ReportsClassificationMetrics(
10
10
  ReportsEnsembleF1,
11
11
  ReportsEnsembleKappa,
12
12
  ):
13
- pass
13
+ def __init__(self):
14
+ super().__init__()
@@ -3,8 +3,8 @@ from torch.utils.data import DataLoader
3
3
 
4
4
 
5
5
  class ReportsEnsembleAccuracy:
6
- def __init__(self, *args, **kwargs):
7
- super().__init__(*args, **kwargs)
6
+ def __init__(self):
7
+ super().__init__()
8
8
 
9
9
  def accuracy(self, dataloader: DataLoader) -> float:
10
10
  predictions, labels = self.metric_necessities(dataloader)
@@ -2,8 +2,8 @@ from sklearn.metrics import f1_score as f1
2
2
 
3
3
 
4
4
  class ReportsEnsembleF1:
5
- def __init__(self, *args, **kwargs):
6
- super().__init__(*args, **kwargs)
5
+ def __init__(self):
6
+ super().__init__()
7
7
 
8
8
  def f1(self) -> float:
9
9
  predictions, labels = self.metric_necessities()
@@ -2,8 +2,8 @@ from sklearn.metrics import cohen_kappa_score as kappa
2
2
 
3
3
 
4
4
  class ReportsEnsembleKappa:
5
- def __init__(self, *args, **kwargs):
6
- super().__init__(*args, **kwargs)
5
+ def __init__(self):
6
+ super().__init__()
7
7
 
8
8
  def accuracy(self) -> float:
9
9
  predictions, labels = self.metric_necessities()
@@ -1,6 +1,6 @@
1
1
  class ReportsEnsembleSize:
2
- def __init__(self, *args, **kwargs):
3
- super().__init__(*args, **kwargs)
2
+ def __init__(self):
3
+ super().__init__()
4
4
 
5
5
  @property
6
6
  def size(self):
@@ -2,11 +2,14 @@ import torch
2
2
 
3
3
 
4
4
  class ReportsLogits:
5
- def __init__(self, *args, **kwargs):
6
- super().__init__(*args, **kwargs)
5
+ def __init__(self):
6
+ super().__init__()
7
7
 
8
- def logits(self, x: torch.Tensor) -> torch.Tensor:
9
- batch_size = x.shape[0]
8
+ def logits_average(self, x: torch.Tensor) -> torch.Tensor:
9
+ return self.logits_sim(x) / len(self.factories)
10
+
11
+ def logits_sum(self, x: torch.Tensor) -> torch.Tensor:
12
+ batch_size = x.size(0)
10
13
  logits = torch.zeros((batch_size, self.num_classes))
11
14
  for factory, weight in zip(self.factories, self.weights):
12
15
  model = factory(num_classes=self.num_classes)
@@ -14,6 +17,22 @@ class ReportsLogits:
14
17
  logits += model(x)
15
18
  return logits
16
19
 
20
+ def check_aggregation_strategy(self, aggregation: str):
21
+ if aggregation not in ["mean", "average", "sum"]:
22
+ raise ValueError(
23
+ f"Ensemble aggregation strategy must be in [mean, average, sum], but found {aggregation}."
24
+ )
25
+
26
+ def logits(self, x: torch.Tensor, aggregation: str = "mean") -> torch.Tensor:
27
+ self.check_aggregation_strategy(aggregation=aggregation)
28
+ logits_handlers = {
29
+ "mean": self.logits_average,
30
+ "average": self.logits_average,
31
+ "sum": self.logits_sum,
32
+ }
33
+ handler = logits_handlers.get(aggregation)
34
+ return handler(x)
35
+
17
36
  @torch.no_grad()
18
37
  def logits_(self, *args, **kwargs):
19
38
  return self.logits(*args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  class SavesEnsembleModels:
2
- def __init__(self, *args, **kwargs):
3
- super().__init__(*args, **kwargs)
2
+ def __init__(self):
3
+ super().__init__()
4
4
 
5
5
  def save(self):
6
6
  self.save_factories()
@@ -5,8 +5,8 @@ from ...vision import Model
5
5
 
6
6
 
7
7
  class StoresModels:
8
- def __init__(self, *args, **kwargs):
9
- super().__init__(*args, **kwargs)
8
+ def __init__(self):
9
+ super().__init__()
10
10
  self.factories: List[Type[torch.nn.Module]] = []
11
11
  self.weights: List[OrderedDict] = []
12
12
 
@@ -1,14 +1,15 @@
1
1
  from .sac import SoftActor, SoftCritic
2
2
  from .buffers import SoftActorCriticBuffer
3
+ from ..core.concerns import TracksTime
3
4
 
4
5
 
5
- class SoftActorCritic:
6
+ class SoftActorCritic(TracksTime):
6
7
  def __init__(
7
8
  self,
8
9
  state_dimension: int,
9
10
  action_dimension: int,
10
11
  hidden_dimension: int = 256,
11
- buffer_capacity: int = 1_000_000,
12
+ buffer_capacity: int = 100_000,
12
13
  batch_size: int = 256,
13
14
  actor_lr: float = 0.0002,
14
15
  critic_lr: float = 0.0003,
@@ -19,10 +20,13 @@ class SoftActorCritic:
19
20
  gamma: float = 0.99,
20
21
  min_std: float = -20,
21
22
  max_std: float = 2,
22
- warmup: int = 10_000,
23
+ warmup: int = 20_000,
23
24
  ):
25
+ super().__init__()
26
+
24
27
  self.batch_size: int = batch_size
25
28
  self.warmup: int = warmup
29
+ self.tau: float = tau
26
30
 
27
31
  self.actor = SoftActor(
28
32
  state_dimension=state_dimension,
@@ -40,7 +44,6 @@ class SoftActorCritic:
40
44
  hidden_dimension=hidden_dimension,
41
45
  lr=critic_lr,
42
46
  weight_decay=critic_decay,
43
- tau=tau,
44
47
  gamma=gamma,
45
48
  alpha=alpha,
46
49
  )
@@ -61,4 +64,4 @@ class SoftActorCritic:
61
64
  actor=self.actor,
62
65
  )
63
66
  self.actor.train(states=data.states, critic_network=self.critic.network)
64
- self.critic.update()
67
+ self.critic.update(tau=self.tau)
@@ -33,6 +33,10 @@ class SoftActorCriticBuffer(Buffer):
33
33
  terminations = numpy.array(terminations)
34
34
  probabilities = numpy.array(probabilities)
35
35
 
36
+ # add one dimension to both rewards and terminations
37
+ rewards = numpy.expand_dims(rewards, axis=-1)
38
+ terminations = numpy.expand_dims(terminations, axis=-1)
39
+
36
40
  if as_tensor:
37
41
  states = torch.from_numpy(states).float()
38
42
  actions = torch.from_numpy(actions).float()
homa/rl/sac/SoftActor.py CHANGED
@@ -29,6 +29,7 @@ class SoftActor:
29
29
  )
30
30
 
31
31
  def train(self, states: torch.Tensor, critic_network: torch.nn.Module):
32
+ self.network.train()
32
33
  self.optimizer.zero_grad()
33
34
  loss = self.loss(states=states, critic_network=critic_network)
34
35
  loss.backward()
@@ -44,7 +45,7 @@ class SoftActor:
44
45
 
45
46
  def process_state(self, state: numpy.ndarray | torch.Tensor) -> torch.Tensor:
46
47
  if isinstance(state, numpy.ndarray):
47
- state = torch.from_numpy(state)
48
+ state = torch.from_numpy(state).float()
48
49
 
49
50
  if state.ndim < 2:
50
51
  state = state.unsqueeze(0)
@@ -64,6 +65,6 @@ class SoftActor:
64
65
  action = torch.tanh(pre_tanh)
65
66
 
66
67
  probabilities = distribution.log_prob(pre_tanh).sum(dim=1, keepdim=True)
67
- correction = torch.log(1 - action.pow(2) + 1e-6).sum(dim=1, keepdim=True)
68
+ probabilities -= torch.log(1 - action.pow(2) + 1e-6).sum(dim=1, keepdim=True)
68
69
 
69
- return action, probabilities - correction
70
+ return action, probabilities
homa/rl/sac/SoftCritic.py CHANGED
@@ -13,11 +13,9 @@ class SoftCritic:
13
13
  action_dimension: int,
14
14
  lr: float,
15
15
  weight_decay: float,
16
- tau: float,
17
16
  gamma: float,
18
17
  alpha: float,
19
18
  ):
20
- self.tau: float = tau
21
19
  self.gamma: float = gamma
22
20
  self.alpha: float = alpha
23
21
 
@@ -48,6 +46,7 @@ class SoftCritic:
48
46
  next_states: torch.Tensor,
49
47
  actor: SoftActor,
50
48
  ):
49
+ self.network.train()
51
50
  self.optimizer.zero_grad()
52
51
  loss = self.loss(
53
52
  states=states,
@@ -93,6 +92,6 @@ class SoftCritic:
93
92
  entropy_q = q - self.alpha * next_probabilities
94
93
  return rewards + self.gamma * termination_mask * entropy_q
95
94
 
96
- def update(self):
97
- soft_update(network=self.network.alpha, target=self.target.alpha)
98
- soft_update(network=self.network.beta, target=self.target.beta)
95
+ def update(self, tau: float):
96
+ soft_update(network=self.network.alpha, target=self.target.alpha, tau=tau)
97
+ soft_update(network=self.network.beta, target=self.target.beta, tau=tau)
homa/rl/utils.py CHANGED
@@ -2,6 +2,6 @@ import torch
2
2
 
3
3
 
4
4
  @torch.no_grad()
5
- def soft_update(self, network: torch.nn.Module, target: torch.nn.Module):
5
+ def soft_update(network: torch.nn.Module, target: torch.nn.Module, tau: float):
6
6
  for s, t in zip(network.parameters(), target.parameters()):
7
- t.data.copy_(self.tau * s.data + (1 - self.tau) * t.data)
7
+ t.data.copy_(tau * s.data + (1 - tau) * t.data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: homa
3
- Version: 0.3.13
3
+ Version: 0.3.19
4
4
  Summary: A curated list of machine learning and deep learning helpers.
5
5
  Author-email: Taha Shieenavaz <tahashieenavaz@gmail.com>
6
6
  Requires-Python: >=3.7
@@ -73,20 +73,21 @@ homa/cli/namespaces/MakeNamespace.py,sha256=5G6LHk3lDkXROz7uq4jYE0DyO_V7JvnhJ33I
73
73
  homa/cli/namespaces/__init__.py,sha256=zAKUGPH4wcacxfH5Qvidp-uOuHdfzhan6kvVI6eMKA8,84
74
74
  homa/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  homa/core/concerns/MovesNetworkToDevice.py,sha256=OPMvO7scsM6NNy_fM0cJdkRdoVc-b2j6l4bz88cBif0,348
76
- homa/core/concerns/__init__.py,sha256=O9OXMIMYrkIgp11lAyEv-OgT3Wq0IvNdDVZr2bOmpQU,55
76
+ homa/core/concerns/TracksTime.py,sha256=atg7iUH5HKqKJd03s9eHsl18iUO_4fzxuYmXgNtqSBQ,129
77
+ homa/core/concerns/__init__.py,sha256=6jL3_kiqmmMs8BV789ZBbwEYNQNAhq1otVOrDJJrSXo,90
77
78
  homa/ensemble/Ensemble.py,sha256=mrqwbEm8OtiBmEgKuO6RzO1V8v80vrQFIJ4WHl8Yqgk,356
78
79
  homa/ensemble/__init__.py,sha256=1pk2W-NbgfDFh9WLKZVLUk2E3PTjVZ5Bap9dQEnrs9o,31
79
80
  homa/ensemble/utils.py,sha256=nn6eAgGW7ZafjjOVJWzGUWE0XYeyJAOMNEHm-lHxd6A,200
80
- homa/ensemble/concerns/CalculatesMetricNecessities.py,sha256=QccROg_FOp_X2T_lZDg8p1DMZhPYdO-7aEdnebRXMsY,825
81
- homa/ensemble/concerns/PredictsProbabilities.py,sha256=7rmI66DzE7-QGoJgZEk-9fu5YQvJW-4ZnMn_dWEEhqU,440
82
- homa/ensemble/concerns/ReportsClassificationMetrics.py,sha256=bg__cdCKp2U1H9qN1aOJH4BoX98oIvt8XaPDGApJhSM,395
83
- homa/ensemble/concerns/ReportsEnsembleAccuracy.py,sha256=AX5X3VGOm7DfdonW0N7FFgUwEr7wnsojRSVEULEii7c,380
84
- homa/ensemble/concerns/ReportsEnsembleF1.py,sha256=hdtdCQrWaFJNUn1KP9cAmi_q_EA4FYnpkBMlYLjzRZg,296
85
- homa/ensemble/concerns/ReportsEnsembleKappa.py,sha256=ZRbtrFCTD84EDql6ZL1xeWtTLFxpO5Y5tQaUlR6_0jw,300
86
- homa/ensemble/concerns/ReportsEnsembleSize.py,sha256=eIweQHpLcfGnNLwiMuTho-9rDgxV0xXGHPTOaEOABzw,240
87
- homa/ensemble/concerns/ReportsLogits.py,sha256=sJZGJwTISZo2DFmJbI5zqhrt7CblNi09iGn1zaEk-ro,593
88
- homa/ensemble/concerns/SavesEnsembleModels.py,sha256=VIXT9wJ8FiCspIvI2-F4WPa6mBBe9SWvMLFyad3TgRg,275
89
- homa/ensemble/concerns/StoresModels.py,sha256=uAYbdUtadZsAJ9-Fj4jJFLWC23qfiXKo1mBm6-PZkN4,963
81
+ homa/ensemble/concerns/CalculatesMetricNecessities.py,sha256=HgrLbz8O9grGZZ0LG82Au5lZwq2D1zixDRjegM4f8Wk,793
82
+ homa/ensemble/concerns/PredictsProbabilities.py,sha256=WWUaNXQxCJQ_NrLgeTdw0OXEsDb5xU7899_2d3Pzaoc,408
83
+ homa/ensemble/concerns/ReportsClassificationMetrics.py,sha256=S9IBH6O7dmHhQ4Mxf5c7JFirOsPokKZUyqfOmED13mM,437
84
+ homa/ensemble/concerns/ReportsEnsembleAccuracy.py,sha256=UuaPQ7v2sCaWuo3xa4PaTZzyjciRhcIluhnt6Zla2Fo,348
85
+ homa/ensemble/concerns/ReportsEnsembleF1.py,sha256=aXKBK2-dTB133Rjg-X2a4Khb1sTdxuffXukcSMZlkzM,264
86
+ homa/ensemble/concerns/ReportsEnsembleKappa.py,sha256=AkWTVGuCeIanDusNdtJOHwTgSEh5RJeWwLTQJJqSEKE,268
87
+ homa/ensemble/concerns/ReportsEnsembleSize.py,sha256=lRyHIrK_zr7pE5RlwuNLIkqXoEMoVhNmT1nYDgCaNVI,208
88
+ homa/ensemble/concerns/ReportsLogits.py,sha256=yZobLvxPL6ep70uMFIEtz5-l4rlfaG7m9mti6jJD1E8,1338
89
+ homa/ensemble/concerns/SavesEnsembleModels.py,sha256=d1DcZnzfJABEfxcnYy5tV9N7YOghzO_ZdCdU80VTcno,243
90
+ homa/ensemble/concerns/StoresModels.py,sha256=dg-xP1C4A9K8DrUTnR4VfqWU9iNAdS_0DlQcRThDka8,931
90
91
  homa/ensemble/concerns/__init__.py,sha256=IF5mHIgzCuCpA2EmpkctbjAr0kYW4P96v7RffK2V_iQ,548
91
92
  homa/graph/GraphAttention.py,sha256=oPXuc1s-3BXwGkHuomEIxnOcZSRBbL8b8fO0432RdDo,478
92
93
  homa/graph/__init__.py,sha256=NCtMUB-awe9UvkwDYqWXxTAZ1RW-AwSW1DD9X_kFkD0,43
@@ -99,13 +100,13 @@ homa/loss/__init__.py,sha256=4mPVzme2_-M64bgBu1cANIfBFAL0voa5I71-ceMr_qk,64
99
100
  homa/rl/DQN.py,sha256=PaNq9Z1K87IQ7Y7mhiJ1CE4TofgV7c7m1py8qT09vE4,20
100
101
  homa/rl/DRQN.py,sha256=zooojji9aeeubOP7cRPSHg31u2Assxk-qjXyGUWIO3A,49
101
102
  homa/rl/DiversityIsAllYouNeed.py,sha256=8yKzlVdLisForGyXqxaXUAWG_dozq7dNY8MBasCvniE,3322
102
- homa/rl/SoftActorCritic.py,sha256=N8EsiYbsLH-dpT2EmqdYFG9KvHNfO3JX8SG2LPTy94s,1962
103
+ homa/rl/SoftActorCritic.py,sha256=3XmEKZ5IEM5Z1-OIpOsGSHZgL_veuYEv6dM_JBCEwwE,2060
103
104
  homa/rl/__init__.py,sha256=EaNDkIzLH1Oy0Wc0aAyyVs4HVMcZS1tdHDh631LKSXs,146
104
- homa/rl/utils.py,sha256=ySNGwWFBgN3Phg7Xn99CIJVHRWw3AmU9KcY-GP4ZQBc,236
105
+ homa/rl/utils.py,sha256=IqbN5aDLwovocpPbxgywuetjz7GQwh9aJ4WFIOtLP3g,232
105
106
  homa/rl/buffers/Buffer.py,sha256=YCESh9tFxgWOLzGQj_IA0zLJoZWDmz6gCNu1iYsGp1s,388
106
107
  homa/rl/buffers/DiversityIsAllYouNeedBuffer.py,sha256=Nwcqs3Q10x6OKZ-zWug4IcBc6RR1TwEIybuFQOtmftA,1612
107
108
  homa/rl/buffers/ImageBuffer.py,sha256=HSmMt82hmkL3ooBYo7c6YUtTsMz9TAA8CvPh3y8z3yg,65
108
- homa/rl/buffers/SoftActorCriticBuffer.py,sha256=JQ9Y6KeeQS5naO_JPONiks-HYXw7hiZZAbqpoWDZlNI,1797
109
+ homa/rl/buffers/SoftActorCriticBuffer.py,sha256=7ZqxG-zwB1U4_id1ad2y86ih2seTjauT5v1oK7wG28I,1977
109
110
  homa/rl/buffers/__init__.py,sha256=h1AkCHs6isXbNtxpaZfLp6YudHj1KlnOvURE64vhRa4,190
110
111
  homa/rl/buffers/concerns/HasRecordAlternatives.py,sha256=D5aVlPZlnGm0GyGtikKb4wZqyO6zpyqR1IOETmAgLx4,362
111
112
  homa/rl/buffers/concerns/ResetsCollection.py,sha256=bZ8q4czYXo1jMtVCnnlG69OgiJ0AqSGY6CiKzJC6xtQ,215
@@ -118,8 +119,8 @@ homa/rl/diayn/modules/ContinuousActorModule.py,sha256=yeC117I5gkXZSidQhjwakjiY7G
118
119
  homa/rl/diayn/modules/CriticModule.py,sha256=OUenwCG0dG4PnK7Iq-jy7oCTv_Cn9s7bXRpro6Pvb40,956
119
120
  homa/rl/diayn/modules/DiscriminatorModule.py,sha256=D58dKBv4f6gtrpqMKLK8XAZpiMqKfS4sG6s3QcF8iGE,891
120
121
  homa/rl/diayn/modules/__init__.py,sha256=1Pgjr4FT5WG-AMh26NPEfbf5pK6I02B1x8HYsgyUCJ4,149
121
- homa/rl/sac/SoftActor.py,sha256=CxR58IFrZ6xlmBj_gq_abZfgdzlVD71c6wA6wQiVL2c,2142
122
- homa/rl/sac/SoftCritic.py,sha256=EOX1vpH7YVwDuy-RdFgEpIKGioE7si0awoAYrHMTv4g,2923
122
+ homa/rl/sac/SoftActor.py,sha256=UfmWDMnMkItta04ERQbs-2XA6DoeTG6gXMZ34mfYgB0,2170
123
+ homa/rl/sac/SoftCritic.py,sha256=WA5o24wkA16rCCVEZ3BRVhmzT5ELGtWlO97adrWaFD8,2932
123
124
  homa/rl/sac/__init__.py,sha256=8EIkOcVvxN94gGzcZoX2XTnvTsHqW6yBaZ2RdFwIveM,68
124
125
  homa/rl/sac/modules/DualSoftCriticModule.py,sha256=Ax28i7U-KnP4QJig-AeeCfpPYNvTT3DfvRMJI-f-TGY,749
125
126
  homa/rl/sac/modules/SoftActorModule.py,sha256=LQ4z7s8mE3wwb1JgxPs0QvnriZULK3_ULdhkt60Ffpw,1152
@@ -143,8 +144,8 @@ homa/vision/concerns/__init__.py,sha256=mrw1YvN-GpQPvMwDF00KxnFkksPKo23RWM4KRioU
143
144
  homa/vision/modules/ResnetModule.py,sha256=eFudBnILD6OmgQtcW_CQQ8aZ62NEa4HyZ15-lobTtt0,712
144
145
  homa/vision/modules/SwinModule.py,sha256=3ZtUcfyJt0NMGmIlGpN35MIJG9QsgcLdFniZH7NxZQo,1227
145
146
  homa/vision/modules/__init__.py,sha256=zVMYB9IAO_xZylC1-N3p8ymHgEkAE2sBbuVz8K5Y1kk,74
146
- homa-0.3.13.dist-info/METADATA,sha256=1oENQJVWWN-hpkF440JOK0IiOI-i-Vbx9zcl7y5_pcs,1760
147
- homa-0.3.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
148
- homa-0.3.13.dist-info/entry_points.txt,sha256=tJZzjs-f2QvFe3ES8Qta8IE5sAbeE8-cyZ_UtbgqG4s,51
149
- homa-0.3.13.dist-info/top_level.txt,sha256=tmOfy2tuaAwc3W5-i6j61_vYJsXgR4ivBWkhJ3ZtJDc,5
150
- homa-0.3.13.dist-info/RECORD,,
147
+ homa-0.3.19.dist-info/METADATA,sha256=svvWLh14x71sFlxH_ApH0yaQ6QdmayDByYiHZUrPrSM,1760
148
+ homa-0.3.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
149
+ homa-0.3.19.dist-info/entry_points.txt,sha256=tJZzjs-f2QvFe3ES8Qta8IE5sAbeE8-cyZ_UtbgqG4s,51
150
+ homa-0.3.19.dist-info/top_level.txt,sha256=tmOfy2tuaAwc3W5-i6j61_vYJsXgR4ivBWkhJ3ZtJDc,5
151
+ homa-0.3.19.dist-info/RECORD,,
File without changes