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.
- homa/core/concerns/TracksTime.py +7 -0
- homa/core/concerns/__init__.py +1 -0
- homa/ensemble/concerns/CalculatesMetricNecessities.py +2 -2
- homa/ensemble/concerns/PredictsProbabilities.py +2 -2
- homa/ensemble/concerns/ReportsClassificationMetrics.py +2 -1
- homa/ensemble/concerns/ReportsEnsembleAccuracy.py +2 -2
- homa/ensemble/concerns/ReportsEnsembleF1.py +2 -2
- homa/ensemble/concerns/ReportsEnsembleKappa.py +2 -2
- homa/ensemble/concerns/ReportsEnsembleSize.py +2 -2
- homa/ensemble/concerns/ReportsLogits.py +23 -4
- homa/ensemble/concerns/SavesEnsembleModels.py +2 -2
- homa/ensemble/concerns/StoresModels.py +2 -2
- homa/rl/SoftActorCritic.py +8 -5
- homa/rl/buffers/SoftActorCriticBuffer.py +4 -0
- homa/rl/sac/SoftActor.py +4 -3
- homa/rl/sac/SoftCritic.py +4 -5
- homa/rl/utils.py +2 -2
- {homa-0.3.13.dist-info → homa-0.3.19.dist-info}/METADATA +1 -1
- {homa-0.3.13.dist-info → homa-0.3.19.dist-info}/RECORD +22 -21
- {homa-0.3.13.dist-info → homa-0.3.19.dist-info}/WHEEL +0 -0
- {homa-0.3.13.dist-info → homa-0.3.19.dist-info}/entry_points.txt +0 -0
- {homa-0.3.13.dist-info → homa-0.3.19.dist-info}/top_level.txt +0 -0
homa/core/concerns/__init__.py
CHANGED
|
@@ -3,8 +3,8 @@ from .ReportsLogits import ReportsLogits
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class PredictsProbabilities(ReportsLogits):
|
|
6
|
-
def __init__(self
|
|
7
|
-
super().__init__(
|
|
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)
|
|
@@ -3,8 +3,8 @@ from torch.utils.data import DataLoader
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class ReportsEnsembleAccuracy:
|
|
6
|
-
def __init__(self
|
|
7
|
-
super().__init__(
|
|
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
|
|
6
|
-
super().__init__(
|
|
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
|
|
6
|
-
super().__init__(
|
|
5
|
+
def __init__(self):
|
|
6
|
+
super().__init__()
|
|
7
7
|
|
|
8
8
|
def accuracy(self) -> float:
|
|
9
9
|
predictions, labels = self.metric_necessities()
|
|
@@ -2,11 +2,14 @@ import torch
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class ReportsLogits:
|
|
5
|
-
def __init__(self
|
|
6
|
-
super().__init__(
|
|
5
|
+
def __init__(self):
|
|
6
|
+
super().__init__()
|
|
7
7
|
|
|
8
|
-
def
|
|
9
|
-
|
|
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)
|
|
@@ -5,8 +5,8 @@ from ...vision import Model
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class StoresModels:
|
|
8
|
-
def __init__(self
|
|
9
|
-
super().__init__(
|
|
8
|
+
def __init__(self):
|
|
9
|
+
super().__init__()
|
|
10
10
|
self.factories: List[Type[torch.nn.Module]] = []
|
|
11
11
|
self.weights: List[OrderedDict] = []
|
|
12
12
|
|
homa/rl/SoftActorCritic.py
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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
|
-
|
|
68
|
+
probabilities -= torch.log(1 - action.pow(2) + 1e-6).sum(dim=1, keepdim=True)
|
|
68
69
|
|
|
69
|
-
return action, probabilities
|
|
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(
|
|
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_(
|
|
7
|
+
t.data.copy_(tau * s.data + (1 - tau) * t.data)
|
|
@@ -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/
|
|
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=
|
|
81
|
-
homa/ensemble/concerns/PredictsProbabilities.py,sha256=
|
|
82
|
-
homa/ensemble/concerns/ReportsClassificationMetrics.py,sha256=
|
|
83
|
-
homa/ensemble/concerns/ReportsEnsembleAccuracy.py,sha256=
|
|
84
|
-
homa/ensemble/concerns/ReportsEnsembleF1.py,sha256=
|
|
85
|
-
homa/ensemble/concerns/ReportsEnsembleKappa.py,sha256=
|
|
86
|
-
homa/ensemble/concerns/ReportsEnsembleSize.py,sha256=
|
|
87
|
-
homa/ensemble/concerns/ReportsLogits.py,sha256=
|
|
88
|
-
homa/ensemble/concerns/SavesEnsembleModels.py,sha256=
|
|
89
|
-
homa/ensemble/concerns/StoresModels.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
122
|
-
homa/rl/sac/SoftCritic.py,sha256=
|
|
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.
|
|
147
|
-
homa-0.3.
|
|
148
|
-
homa-0.3.
|
|
149
|
-
homa-0.3.
|
|
150
|
-
homa-0.3.
|
|
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
|
|
File without changes
|
|
File without changes
|