Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
3dca288177
|
|||
bd0b375751 | |||
0fabd8f7fb | |||
3ea3d1dc56 | |||
edf0ba6532
|
|||
a487309549 | |||
42829c0327
|
|||
349341b405
|
|||
50dbc4835e
|
|||
0954429e2d
|
|||
4c06b3912c
|
|||
5684af783e
|
|||
f00b29391c
|
|||
492a5e6681
|
|||
e9277c3da7
|
|||
1e2657adad
|
22
CHANGELOG.md
22
CHANGELOG.md
@@ -2,6 +2,28 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
## [0.5.0](https://gitea.deepak.science:2222/physics/deepdog/compare/0.4.0...0.5.0) (2022-04-30)
|
||||||
|
|
||||||
|
|
||||||
|
### ⚠ BREAKING CHANGES
|
||||||
|
|
||||||
|
* simulpairs now uses different rng calculator
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* adds simulpairs run ([e9277c3](https://gitea.deepak.science:2222/physics/deepdog/commit/e9277c3da777359feb352c0b19f3bb029248ba2f))
|
||||||
|
* has better parallelisation ([edf0ba6](https://gitea.deepak.science:2222/physics/deepdog/commit/edf0ba6532c0588fce32341709cdb70e384b83f4))
|
||||||
|
* simulpairs now uses different rng calculator ([50dbc48](https://gitea.deepak.science:2222/physics/deepdog/commit/50dbc4835e60bace9e9b4ba37415f073a3c9e479))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* better parallelisation hopefully ([42829c0](https://gitea.deepak.science:2222/physics/deepdog/commit/42829c0327e080e18be2fb75e746f6ac0d7c2f6d))
|
||||||
|
* Makes altbayessimulpairs available in package ([492a5e6](https://gitea.deepak.science:2222/physics/deepdog/commit/492a5e6681c85f95840e28cfd5d4ce4ca1d54eba))
|
||||||
|
* stronger names ([0954429](https://gitea.deepak.science:2222/physics/deepdog/commit/0954429e2d015a105ff16dfbb9e7a352bf53e5e9))
|
||||||
|
* Uses correct filename arg for passed in rng ([349341b](https://gitea.deepak.science:2222/physics/deepdog/commit/349341b405375a43b933f1fd7db4ee9fc501def3))
|
||||||
|
* uses correct filename for pairs guy ([4c06b39](https://gitea.deepak.science:2222/physics/deepdog/commit/4c06b3912c811c93c310b1d9e4c153f2014c4f8b))
|
||||||
|
|
||||||
## [0.4.0](https://gitea.deepak.science:2222/physics/deepdog/compare/0.3.5...0.4.0) (2022-04-10)
|
## [0.4.0](https://gitea.deepak.science:2222/physics/deepdog/compare/0.3.5...0.4.0) (2022-04-10)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ import logging
|
|||||||
from deepdog.meta import __version__
|
from deepdog.meta import __version__
|
||||||
from deepdog.bayes_run import BayesRun
|
from deepdog.bayes_run import BayesRun
|
||||||
from deepdog.alt_bayes_run import AltBayesRun
|
from deepdog.alt_bayes_run import AltBayesRun
|
||||||
|
from deepdog.alt_bayes_run_simulpairs import AltBayesRunSimulPairs
|
||||||
from deepdog.diagnostic import Diagnostic
|
from deepdog.diagnostic import Diagnostic
|
||||||
|
|
||||||
|
|
||||||
@@ -9,7 +10,13 @@ def get_version():
|
|||||||
return __version__
|
return __version__
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["get_version", "BayesRun", "AltBayesRun", "Diagnostic"]
|
__all__ = [
|
||||||
|
"get_version",
|
||||||
|
"BayesRun",
|
||||||
|
"AltBayesRun",
|
||||||
|
"AltBayesRunSimulPairs",
|
||||||
|
"Diagnostic",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
logging.getLogger(__name__).addHandler(logging.NullHandler())
|
logging.getLogger(__name__).addHandler(logging.NullHandler())
|
||||||
|
@@ -24,47 +24,98 @@ _logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
def get_a_result(input) -> int:
|
def get_a_result(input) -> int:
|
||||||
discretisation, dot_inputs, lows, highs, monte_carlo_count, max_frequency = input
|
discretisation, dot_inputs, lows, highs, monte_carlo_count, max_frequency = input
|
||||||
sample_dipoles = discretisation.get_model().get_n_single_dipoles(monte_carlo_count, max_frequency)
|
sample_dipoles = discretisation.get_model().get_n_single_dipoles(
|
||||||
|
monte_carlo_count, max_frequency
|
||||||
|
)
|
||||||
vals = pdme.util.fast_v_calc.fast_vs_for_dipoles(dot_inputs, sample_dipoles)
|
vals = pdme.util.fast_v_calc.fast_vs_for_dipoles(dot_inputs, sample_dipoles)
|
||||||
return numpy.count_nonzero(pdme.util.fast_v_calc.between(vals, lows, highs))
|
return numpy.count_nonzero(pdme.util.fast_v_calc.between(vals, lows, highs))
|
||||||
|
|
||||||
|
|
||||||
def get_a_result_using_pairs(input) -> int:
|
def get_a_result_using_pairs(input) -> int:
|
||||||
discretisation, dot_inputs, pair_inputs, local_lows, local_highs, nonlocal_lows, nonlocal_highs, monte_carlo_count, max_frequency = input
|
(
|
||||||
sample_dipoles = discretisation.get_model().get_n_single_dipoles(monte_carlo_count, max_frequency)
|
discretisation,
|
||||||
|
dot_inputs,
|
||||||
|
pair_inputs,
|
||||||
|
local_lows,
|
||||||
|
local_highs,
|
||||||
|
nonlocal_lows,
|
||||||
|
nonlocal_highs,
|
||||||
|
monte_carlo_count,
|
||||||
|
max_frequency,
|
||||||
|
) = input
|
||||||
|
sample_dipoles = discretisation.get_model().get_n_single_dipoles(
|
||||||
|
monte_carlo_count, max_frequency
|
||||||
|
)
|
||||||
local_vals = pdme.util.fast_v_calc.fast_vs_for_dipoles(dot_inputs, sample_dipoles)
|
local_vals = pdme.util.fast_v_calc.fast_vs_for_dipoles(dot_inputs, sample_dipoles)
|
||||||
local_matches = pdme.util.fast_v_calc.between(local_vals, local_lows, local_highs)
|
local_matches = pdme.util.fast_v_calc.between(local_vals, local_lows, local_highs)
|
||||||
nonlocal_vals = pdme.util.fast_nonlocal_spectrum.fast_s_nonlocal(pair_inputs, sample_dipoles)
|
nonlocal_vals = pdme.util.fast_nonlocal_spectrum.fast_s_nonlocal(
|
||||||
nonlocal_matches = pdme.util.fast_v_calc.between(nonlocal_vals, nonlocal_lows, nonlocal_highs)
|
pair_inputs, sample_dipoles
|
||||||
|
)
|
||||||
|
nonlocal_matches = pdme.util.fast_v_calc.between(
|
||||||
|
nonlocal_vals, nonlocal_lows, nonlocal_highs
|
||||||
|
)
|
||||||
combined_matches = numpy.logical_and(local_matches, nonlocal_matches)
|
combined_matches = numpy.logical_and(local_matches, nonlocal_matches)
|
||||||
return numpy.count_nonzero(combined_matches)
|
return numpy.count_nonzero(combined_matches)
|
||||||
|
|
||||||
|
|
||||||
class AltBayesRun():
|
class AltBayesRun:
|
||||||
'''
|
"""
|
||||||
A single Bayes run for a given set of dots.
|
A single Bayes run for a given set of dots.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
dot_inputs : Sequence[DotInput]
|
dot_inputs : Sequence[DotInput]
|
||||||
The dot inputs for this bayes run.
|
The dot inputs for this bayes run.
|
||||||
|
|
||||||
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
||||||
The models to evaluate.
|
The models to evaluate.
|
||||||
|
|
||||||
actual_model_discretisation : pdme.model.Discretisation
|
actual_model_discretisation : pdme.model.Discretisation
|
||||||
The discretisation for the model which is actually correct.
|
The discretisation for the model which is actually correct.
|
||||||
|
|
||||||
filename_slug : str
|
filename_slug : str
|
||||||
The filename slug to include.
|
The filename slug to include.
|
||||||
|
|
||||||
run_count: int
|
run_count: int
|
||||||
The number of runs to do.
|
The number of runs to do.
|
||||||
'''
|
"""
|
||||||
def __init__(self, dot_positions: Sequence[numpy.typing.ArrayLike], frequency_range: Sequence[float], discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]], actual_model: pdme.model.Model, filename_slug: str, run_count: int = 100, low_error: float = 0.9, high_error: float = 1.1, pairs_high_error=None, pairs_low_error=None, monte_carlo_count: int = 10000, monte_carlo_cycles: int = 10, target_success: int = 100, max_monte_carlo_cycles_steps: int = 10, max_frequency: float = 20, end_threshold: float = None, chunksize: int = CHUNKSIZE, use_pairs: bool = False) -> None:
|
|
||||||
self.dot_inputs = pdme.inputs.inputs_with_frequency_range(dot_positions, frequency_range)
|
def __init__(
|
||||||
self.dot_inputs_array = pdme.measurement.input_types.dot_inputs_to_array(self.dot_inputs)
|
self,
|
||||||
|
dot_positions: Sequence[numpy.typing.ArrayLike],
|
||||||
|
frequency_range: Sequence[float],
|
||||||
|
discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]],
|
||||||
|
actual_model: pdme.model.Model,
|
||||||
|
filename_slug: str,
|
||||||
|
run_count: int = 100,
|
||||||
|
low_error: float = 0.9,
|
||||||
|
high_error: float = 1.1,
|
||||||
|
pairs_high_error=None,
|
||||||
|
pairs_low_error=None,
|
||||||
|
monte_carlo_count: int = 10000,
|
||||||
|
monte_carlo_cycles: int = 10,
|
||||||
|
target_success: int = 100,
|
||||||
|
max_monte_carlo_cycles_steps: int = 10,
|
||||||
|
max_frequency: float = 20,
|
||||||
|
end_threshold: float = None,
|
||||||
|
chunksize: int = CHUNKSIZE,
|
||||||
|
use_pairs: bool = False,
|
||||||
|
) -> None:
|
||||||
|
self.dot_inputs = pdme.inputs.inputs_with_frequency_range(
|
||||||
|
dot_positions, frequency_range
|
||||||
|
)
|
||||||
|
self.dot_inputs_array = pdme.measurement.input_types.dot_inputs_to_array(
|
||||||
|
self.dot_inputs
|
||||||
|
)
|
||||||
|
|
||||||
self.use_pairs = use_pairs
|
self.use_pairs = use_pairs
|
||||||
|
|
||||||
self.dot_pair_inputs = pdme.inputs.input_pairs_with_frequency_range(dot_positions, frequency_range)
|
self.dot_pair_inputs = pdme.inputs.input_pairs_with_frequency_range(
|
||||||
self.dot_pair_inputs_array = pdme.measurement.input_types.dot_pair_inputs_to_array(self.dot_pair_inputs)
|
dot_positions, frequency_range
|
||||||
|
)
|
||||||
|
self.dot_pair_inputs_array = (
|
||||||
|
pdme.measurement.input_types.dot_pair_inputs_to_array(self.dot_pair_inputs)
|
||||||
|
)
|
||||||
|
|
||||||
self.discretisations = [disc for (_, disc) in discretisations_with_names]
|
self.discretisations = [disc for (_, disc) in discretisations_with_names]
|
||||||
self.model_names = [name for (name, _) in discretisations_with_names]
|
self.model_names = [name for (name, _) in discretisations_with_names]
|
||||||
@@ -106,7 +157,9 @@ class AltBayesRun():
|
|||||||
self.use_end_threshold = True
|
self.use_end_threshold = True
|
||||||
_logger.info(f"Will abort early, at {self.end_threshold}.")
|
_logger.info(f"Will abort early, at {self.end_threshold}.")
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"end_threshold should be between 0 and 1, but is actually {end_threshold}")
|
raise ValueError(
|
||||||
|
f"end_threshold should be between 0 and 1, but is actually {end_threshold}"
|
||||||
|
)
|
||||||
|
|
||||||
def go(self) -> None:
|
def go(self) -> None:
|
||||||
with open(self.filename, "a", newline="") as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
@@ -121,13 +174,31 @@ class AltBayesRun():
|
|||||||
# Generate the actual dipoles
|
# Generate the actual dipoles
|
||||||
actual_dipoles = self.actual_model.get_dipoles(frequency)
|
actual_dipoles = self.actual_model.get_dipoles(frequency)
|
||||||
|
|
||||||
dots = actual_dipoles.get_percent_range_dot_measurements(self.dot_inputs, self.low_error, self.high_error)
|
dots = actual_dipoles.get_percent_range_dot_measurements(
|
||||||
lows, highs = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(dots)
|
self.dot_inputs, self.low_error, self.high_error
|
||||||
|
)
|
||||||
|
(
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
) = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(
|
||||||
|
dots
|
||||||
|
)
|
||||||
|
|
||||||
pair_lows, pair_highs = (None, None)
|
pair_lows, pair_highs = (None, None)
|
||||||
if self.use_pairs:
|
if self.use_pairs:
|
||||||
pair_measurements = actual_dipoles.get_percent_range_dot_pair_measurements(self.dot_pair_inputs, self.pairs_low_error, self.pairs_high_error)
|
pair_measurements = (
|
||||||
pair_lows, pair_highs = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(pair_measurements)
|
actual_dipoles.get_percent_range_dot_pair_measurements(
|
||||||
|
self.dot_pair_inputs,
|
||||||
|
self.pairs_low_error,
|
||||||
|
self.pairs_high_error,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
pair_lows,
|
||||||
|
pair_highs,
|
||||||
|
) = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(
|
||||||
|
pair_measurements
|
||||||
|
)
|
||||||
|
|
||||||
_logger.info(f"Going to work on dipole at {actual_dipoles.dipoles}")
|
_logger.info(f"Going to work on dipole at {actual_dipoles.dipoles}")
|
||||||
|
|
||||||
@@ -139,18 +210,51 @@ class AltBayesRun():
|
|||||||
cycle_count = 0
|
cycle_count = 0
|
||||||
cycle_success = 0
|
cycle_success = 0
|
||||||
cycles = 0
|
cycles = 0
|
||||||
while (cycles < self.max_monte_carlo_cycles_steps) and (cycle_success <= self.target_success):
|
while (cycles < self.max_monte_carlo_cycles_steps) and (
|
||||||
|
cycle_success <= self.target_success
|
||||||
|
):
|
||||||
_logger.debug(f"Starting cycle {cycles}")
|
_logger.debug(f"Starting cycle {cycles}")
|
||||||
cycles += 1
|
cycles += 1
|
||||||
current_success = 0
|
current_success = 0
|
||||||
cycle_count += self.monte_carlo_count * self.monte_carlo_cycles
|
cycle_count += self.monte_carlo_count * self.monte_carlo_cycles
|
||||||
if self.use_pairs:
|
if self.use_pairs:
|
||||||
current_success = sum(
|
current_success = sum(
|
||||||
pool.imap_unordered(get_a_result_using_pairs, [(discretisation, self.dot_inputs_array, self.dot_pair_inputs_array, lows, highs, pair_lows, pair_highs, self.monte_carlo_count, self.max_frequency)] * self.monte_carlo_cycles, self.chunksize)
|
pool.imap_unordered(
|
||||||
|
get_a_result_using_pairs,
|
||||||
|
[
|
||||||
|
(
|
||||||
|
discretisation,
|
||||||
|
self.dot_inputs_array,
|
||||||
|
self.dot_pair_inputs_array,
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
pair_lows,
|
||||||
|
pair_highs,
|
||||||
|
self.monte_carlo_count,
|
||||||
|
self.max_frequency,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
* self.monte_carlo_cycles,
|
||||||
|
self.chunksize,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
current_success = sum(
|
current_success = sum(
|
||||||
pool.imap_unordered(get_a_result, [(discretisation, self.dot_inputs_array, lows, highs, self.monte_carlo_count, self.max_frequency)] * self.monte_carlo_cycles, self.chunksize)
|
pool.imap_unordered(
|
||||||
|
get_a_result,
|
||||||
|
[
|
||||||
|
(
|
||||||
|
discretisation,
|
||||||
|
self.dot_inputs_array,
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
self.monte_carlo_count,
|
||||||
|
self.max_frequency,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
* self.monte_carlo_cycles,
|
||||||
|
self.chunksize,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
cycle_success += current_success
|
cycle_success += current_success
|
||||||
@@ -160,30 +264,44 @@ class AltBayesRun():
|
|||||||
row = {
|
row = {
|
||||||
"dipole_moment": actual_dipoles.dipoles[0].p,
|
"dipole_moment": actual_dipoles.dipoles[0].p,
|
||||||
"dipole_location": actual_dipoles.dipoles[0].s,
|
"dipole_location": actual_dipoles.dipoles[0].s,
|
||||||
"dipole_frequency": actual_dipoles.dipoles[0].w
|
"dipole_frequency": actual_dipoles.dipoles[0].w,
|
||||||
}
|
}
|
||||||
successes: List[float] = []
|
successes: List[float] = []
|
||||||
counts: List[int] = []
|
counts: List[int] = []
|
||||||
for model_index, (name, (count, result)) in enumerate(zip(self.model_names, results)):
|
for model_index, (name, (count, result)) in enumerate(
|
||||||
|
zip(self.model_names, results)
|
||||||
|
):
|
||||||
|
|
||||||
row[f"{name}_success"] = result
|
row[f"{name}_success"] = result
|
||||||
row[f"{name}_count"] = count
|
row[f"{name}_count"] = count
|
||||||
successes.append(max(result, 0.5))
|
successes.append(max(result, 0.5))
|
||||||
counts.append(count)
|
counts.append(count)
|
||||||
|
|
||||||
success_weight = sum([(succ / count) * prob for succ, count, prob in zip(successes, counts, self.probabilities)])
|
success_weight = sum(
|
||||||
new_probabilities = [(succ / count) * old_prob / success_weight for succ, count, old_prob in zip(successes, counts, self.probabilities)]
|
[
|
||||||
|
(succ / count) * prob
|
||||||
|
for succ, count, prob in zip(successes, counts, self.probabilities)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
new_probabilities = [
|
||||||
|
(succ / count) * old_prob / success_weight
|
||||||
|
for succ, count, old_prob in zip(successes, counts, self.probabilities)
|
||||||
|
]
|
||||||
self.probabilities = new_probabilities
|
self.probabilities = new_probabilities
|
||||||
for name, probability in zip(self.model_names, self.probabilities):
|
for name, probability in zip(self.model_names, self.probabilities):
|
||||||
row[f"{name}_prob"] = probability
|
row[f"{name}_prob"] = probability
|
||||||
_logger.info(row)
|
_logger.info(row)
|
||||||
|
|
||||||
with open(self.filename, "a", newline="") as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect="unix")
|
writer = csv.DictWriter(
|
||||||
|
outfile, fieldnames=self.csv_fields, dialect="unix"
|
||||||
|
)
|
||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
|
||||||
if self.use_end_threshold:
|
if self.use_end_threshold:
|
||||||
max_prob = max(self.probabilities)
|
max_prob = max(self.probabilities)
|
||||||
if max_prob > self.end_threshold:
|
if max_prob > self.end_threshold:
|
||||||
_logger.info(f"Aborting early, because {max_prob} is greater than {self.end_threshold}")
|
_logger.info(
|
||||||
|
f"Aborting early, because {max_prob} is greater than {self.end_threshold}"
|
||||||
|
)
|
||||||
break
|
break
|
||||||
|
357
deepdog/alt_bayes_run_simulpairs.py
Normal file
357
deepdog/alt_bayes_run_simulpairs.py
Normal file
@@ -0,0 +1,357 @@
|
|||||||
|
import pdme.inputs
|
||||||
|
import pdme.model
|
||||||
|
import pdme.measurement.input_types
|
||||||
|
import pdme.measurement.oscillating_dipole
|
||||||
|
import pdme.util.fast_v_calc
|
||||||
|
import pdme.util.fast_nonlocal_spectrum
|
||||||
|
from typing import Sequence, Tuple, List
|
||||||
|
import datetime
|
||||||
|
import csv
|
||||||
|
import multiprocessing
|
||||||
|
import logging
|
||||||
|
import numpy
|
||||||
|
import numpy.random
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: remove hardcode
|
||||||
|
CHUNKSIZE = 50
|
||||||
|
|
||||||
|
# TODO: It's garbage to have this here duplicated from pdme.
|
||||||
|
DotInput = Tuple[numpy.typing.ArrayLike, float]
|
||||||
|
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_a_simul_result_using_pairs(input) -> numpy.ndarray:
|
||||||
|
(
|
||||||
|
discretisation,
|
||||||
|
dot_inputs,
|
||||||
|
pair_inputs,
|
||||||
|
local_lows,
|
||||||
|
local_highs,
|
||||||
|
nonlocal_lows,
|
||||||
|
nonlocal_highs,
|
||||||
|
monte_carlo_count,
|
||||||
|
monte_carlo_cycles,
|
||||||
|
max_frequency,
|
||||||
|
seed,
|
||||||
|
) = input
|
||||||
|
|
||||||
|
rng = numpy.random.default_rng(seed)
|
||||||
|
local_total = 0
|
||||||
|
combined_total = 0
|
||||||
|
|
||||||
|
sample_dipoles = discretisation.get_model().get_n_single_dipoles(
|
||||||
|
monte_carlo_count, max_frequency, rng_to_use=rng
|
||||||
|
)
|
||||||
|
local_vals = pdme.util.fast_v_calc.fast_vs_for_dipoles(
|
||||||
|
dot_inputs, sample_dipoles
|
||||||
|
)
|
||||||
|
local_matches = pdme.util.fast_v_calc.between(
|
||||||
|
local_vals, local_lows, local_highs
|
||||||
|
)
|
||||||
|
nonlocal_vals = pdme.util.fast_nonlocal_spectrum.fast_s_nonlocal(
|
||||||
|
pair_inputs, sample_dipoles
|
||||||
|
)
|
||||||
|
nonlocal_matches = pdme.util.fast_v_calc.between(
|
||||||
|
nonlocal_vals, nonlocal_lows, nonlocal_highs
|
||||||
|
)
|
||||||
|
combined_matches = numpy.logical_and(local_matches, nonlocal_matches)
|
||||||
|
|
||||||
|
local_total += numpy.count_nonzero(local_matches)
|
||||||
|
combined_total += numpy.count_nonzero(combined_matches)
|
||||||
|
return numpy.array([local_total, combined_total])
|
||||||
|
|
||||||
|
|
||||||
|
class AltBayesRunSimulPairs:
|
||||||
|
"""
|
||||||
|
A dual pairs-nonpairs Bayes run for a given set of dots.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
dot_inputs : Sequence[DotInput]
|
||||||
|
The dot inputs for this bayes run.
|
||||||
|
|
||||||
|
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
||||||
|
The models to evaluate.
|
||||||
|
|
||||||
|
actual_model_discretisation : pdme.model.Discretisation
|
||||||
|
The discretisation for the model which is actually correct.
|
||||||
|
|
||||||
|
filename_slug : str
|
||||||
|
The filename slug to include.
|
||||||
|
|
||||||
|
run_count: int
|
||||||
|
The number of runs to do.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
dot_positions: Sequence[numpy.typing.ArrayLike],
|
||||||
|
frequency_range: Sequence[float],
|
||||||
|
discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]],
|
||||||
|
actual_model: pdme.model.Model,
|
||||||
|
filename_slug: str,
|
||||||
|
run_count: int = 100,
|
||||||
|
low_error: float = 0.9,
|
||||||
|
high_error: float = 1.1,
|
||||||
|
pairs_high_error=None,
|
||||||
|
pairs_low_error=None,
|
||||||
|
monte_carlo_count: int = 10000,
|
||||||
|
monte_carlo_cycles: int = 10,
|
||||||
|
target_success: int = 100,
|
||||||
|
max_monte_carlo_cycles_steps: int = 10,
|
||||||
|
max_frequency: float = 20,
|
||||||
|
end_threshold: float = None,
|
||||||
|
chunksize: int = CHUNKSIZE,
|
||||||
|
) -> None:
|
||||||
|
self.dot_inputs = pdme.inputs.inputs_with_frequency_range(
|
||||||
|
dot_positions, frequency_range
|
||||||
|
)
|
||||||
|
self.dot_inputs_array = pdme.measurement.input_types.dot_inputs_to_array(
|
||||||
|
self.dot_inputs
|
||||||
|
)
|
||||||
|
|
||||||
|
self.dot_pair_inputs = pdme.inputs.input_pairs_with_frequency_range(
|
||||||
|
dot_positions, frequency_range
|
||||||
|
)
|
||||||
|
self.dot_pair_inputs_array = (
|
||||||
|
pdme.measurement.input_types.dot_pair_inputs_to_array(self.dot_pair_inputs)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.discretisations = [disc for (_, disc) in discretisations_with_names]
|
||||||
|
self.model_names = [name for (name, _) in discretisations_with_names]
|
||||||
|
self.actual_model = actual_model
|
||||||
|
self.model_count = len(self.discretisations)
|
||||||
|
self.monte_carlo_count = monte_carlo_count
|
||||||
|
self.monte_carlo_cycles = monte_carlo_cycles
|
||||||
|
self.target_success = target_success
|
||||||
|
self.max_monte_carlo_cycles_steps = max_monte_carlo_cycles_steps
|
||||||
|
self.run_count = run_count
|
||||||
|
self.low_error = low_error
|
||||||
|
self.high_error = high_error
|
||||||
|
if pairs_low_error is None:
|
||||||
|
self.pairs_low_error = self.low_error
|
||||||
|
else:
|
||||||
|
self.pairs_low_error = pairs_low_error
|
||||||
|
if pairs_high_error is None:
|
||||||
|
self.pairs_high_error = self.high_error
|
||||||
|
else:
|
||||||
|
self.pairs_high_error = pairs_high_error
|
||||||
|
self.csv_fields = ["dipole_moment", "dipole_location", "dipole_frequency"]
|
||||||
|
self.compensate_zeros = True
|
||||||
|
self.chunksize = chunksize
|
||||||
|
for name in self.model_names:
|
||||||
|
self.csv_fields.extend([f"{name}_success", f"{name}_count", f"{name}_prob"])
|
||||||
|
|
||||||
|
self.probabilities_no_pairs = [1 / self.model_count] * self.model_count
|
||||||
|
self.probabilities_pairs = [1 / self.model_count] * self.model_count
|
||||||
|
|
||||||
|
timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||||
|
self.filename_pairs = f"{timestamp}-{filename_slug}.simulpairs.yespairs.csv"
|
||||||
|
self.filename_no_pairs = f"{timestamp}-{filename_slug}.simulpairs.noopairs.csv"
|
||||||
|
|
||||||
|
self.max_frequency = max_frequency
|
||||||
|
|
||||||
|
if end_threshold is not None:
|
||||||
|
if 0 < end_threshold < 1:
|
||||||
|
self.end_threshold: float = end_threshold
|
||||||
|
self.use_end_threshold = True
|
||||||
|
_logger.info(f"Will abort early, at {self.end_threshold}.")
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
f"end_threshold should be between 0 and 1, but is actually {end_threshold}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def go(self) -> None:
|
||||||
|
with open(self.filename_pairs, "a", newline="") as outfile:
|
||||||
|
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect="unix")
|
||||||
|
writer.writeheader()
|
||||||
|
with open(self.filename_no_pairs, "a", newline="") as outfile:
|
||||||
|
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect="unix")
|
||||||
|
writer.writeheader()
|
||||||
|
|
||||||
|
for run in range(1, self.run_count + 1):
|
||||||
|
|
||||||
|
rng = numpy.random.default_rng()
|
||||||
|
frequency = rng.uniform(1, self.max_frequency)
|
||||||
|
|
||||||
|
# Generate the actual dipoles
|
||||||
|
actual_dipoles = self.actual_model.get_dipoles(frequency)
|
||||||
|
|
||||||
|
dots = actual_dipoles.get_percent_range_dot_measurements(
|
||||||
|
self.dot_inputs, self.low_error, self.high_error
|
||||||
|
)
|
||||||
|
(
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
) = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(
|
||||||
|
dots
|
||||||
|
)
|
||||||
|
|
||||||
|
pair_lows, pair_highs = (None, None)
|
||||||
|
pair_measurements = actual_dipoles.get_percent_range_dot_pair_measurements(
|
||||||
|
self.dot_pair_inputs, self.pairs_low_error, self.pairs_high_error
|
||||||
|
)
|
||||||
|
(
|
||||||
|
pair_lows,
|
||||||
|
pair_highs,
|
||||||
|
) = pdme.measurement.input_types.dot_range_measurements_low_high_arrays(
|
||||||
|
pair_measurements
|
||||||
|
)
|
||||||
|
|
||||||
|
_logger.info(f"Going to work on dipole at {actual_dipoles.dipoles}")
|
||||||
|
|
||||||
|
# define a new seed sequence for each run
|
||||||
|
seed_sequence = numpy.random.SeedSequence(run)
|
||||||
|
|
||||||
|
results_pairs = []
|
||||||
|
results_no_pairs = []
|
||||||
|
_logger.debug("Going to iterate over discretisations now")
|
||||||
|
for disc_count, discretisation in enumerate(self.discretisations):
|
||||||
|
_logger.debug(f"Doing discretisation #{disc_count}")
|
||||||
|
|
||||||
|
core_count = multiprocessing.cpu_count() - 1 or 1
|
||||||
|
with multiprocessing.Pool(core_count) as pool:
|
||||||
|
cycle_count = 0
|
||||||
|
cycle_success_pairs = 0
|
||||||
|
cycle_success_no_pairs = 0
|
||||||
|
cycles = 0
|
||||||
|
while (cycles < self.max_monte_carlo_cycles_steps) and (
|
||||||
|
min(cycle_success_pairs, cycle_success_no_pairs)
|
||||||
|
<= self.target_success
|
||||||
|
):
|
||||||
|
_logger.debug(f"Starting cycle {cycles}")
|
||||||
|
_logger.debug(f"(pair, no_pair) successes are {(cycle_success_pairs, cycle_success_no_pairs)}")
|
||||||
|
cycles += 1
|
||||||
|
current_success_pairs = 0
|
||||||
|
current_success_no_pairs = 0
|
||||||
|
cycle_count += self.monte_carlo_count * self.monte_carlo_cycles
|
||||||
|
|
||||||
|
# generate a seed from the sequence for each core.
|
||||||
|
# note this needs to be inside the loop for monte carlo cycle steps!
|
||||||
|
# that way we get more stuff.
|
||||||
|
|
||||||
|
seeds = seed_sequence.spawn(self.monte_carlo_cycles)
|
||||||
|
_logger.debug(f"Creating {self.monte_carlo_cycles} seeds")
|
||||||
|
current_success_both = numpy.array(
|
||||||
|
sum(
|
||||||
|
pool.imap_unordered(
|
||||||
|
get_a_simul_result_using_pairs,
|
||||||
|
[
|
||||||
|
(
|
||||||
|
discretisation,
|
||||||
|
self.dot_inputs_array,
|
||||||
|
self.dot_pair_inputs_array,
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
pair_lows,
|
||||||
|
pair_highs,
|
||||||
|
self.monte_carlo_count,
|
||||||
|
self.monte_carlo_cycles,
|
||||||
|
self.max_frequency,
|
||||||
|
seed,
|
||||||
|
)
|
||||||
|
for seed in seeds
|
||||||
|
],
|
||||||
|
self.chunksize,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
current_success_no_pairs = current_success_both[0]
|
||||||
|
current_success_pairs = current_success_both[1]
|
||||||
|
|
||||||
|
cycle_success_no_pairs += current_success_no_pairs
|
||||||
|
cycle_success_pairs += current_success_pairs
|
||||||
|
results_pairs.append((cycle_count, cycle_success_pairs))
|
||||||
|
results_no_pairs.append((cycle_count, cycle_success_no_pairs))
|
||||||
|
|
||||||
|
_logger.debug("Done, constructing output now")
|
||||||
|
row_pairs = {
|
||||||
|
"dipole_moment": actual_dipoles.dipoles[0].p,
|
||||||
|
"dipole_location": actual_dipoles.dipoles[0].s,
|
||||||
|
"dipole_frequency": actual_dipoles.dipoles[0].w,
|
||||||
|
}
|
||||||
|
row_no_pairs = {
|
||||||
|
"dipole_moment": actual_dipoles.dipoles[0].p,
|
||||||
|
"dipole_location": actual_dipoles.dipoles[0].s,
|
||||||
|
"dipole_frequency": actual_dipoles.dipoles[0].w,
|
||||||
|
}
|
||||||
|
successes_pairs: List[float] = []
|
||||||
|
successes_no_pairs: List[float] = []
|
||||||
|
counts: List[int] = []
|
||||||
|
for model_index, (
|
||||||
|
name,
|
||||||
|
(count_pair, result_pair),
|
||||||
|
(count_no_pair, result_no_pair),
|
||||||
|
) in enumerate(zip(self.model_names, results_pairs, results_no_pairs)):
|
||||||
|
|
||||||
|
row_pairs[f"{name}_success"] = result_pair
|
||||||
|
row_pairs[f"{name}_count"] = count_pair
|
||||||
|
successes_pairs.append(max(result_pair, 0.5))
|
||||||
|
|
||||||
|
row_no_pairs[f"{name}_success"] = result_no_pair
|
||||||
|
row_no_pairs[f"{name}_count"] = count_no_pair
|
||||||
|
successes_no_pairs.append(max(result_no_pair, 0.5))
|
||||||
|
|
||||||
|
counts.append(count_pair)
|
||||||
|
|
||||||
|
success_weight_pair = sum(
|
||||||
|
[
|
||||||
|
(succ / count) * prob
|
||||||
|
for succ, count, prob in zip(
|
||||||
|
successes_pairs, counts, self.probabilities_pairs
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
success_weight_no_pair = sum(
|
||||||
|
[
|
||||||
|
(succ / count) * prob
|
||||||
|
for succ, count, prob in zip(
|
||||||
|
successes_no_pairs, counts, self.probabilities_no_pairs
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
new_probabilities_pair = [
|
||||||
|
(succ / count) * old_prob / success_weight_pair
|
||||||
|
for succ, count, old_prob in zip(
|
||||||
|
successes_pairs, counts, self.probabilities_pairs
|
||||||
|
)
|
||||||
|
]
|
||||||
|
new_probabilities_no_pair = [
|
||||||
|
(succ / count) * old_prob / success_weight_no_pair
|
||||||
|
for succ, count, old_prob in zip(
|
||||||
|
successes_no_pairs, counts, self.probabilities_no_pairs
|
||||||
|
)
|
||||||
|
]
|
||||||
|
self.probabilities_pairs = new_probabilities_pair
|
||||||
|
self.probabilities_no_pairs = new_probabilities_no_pair
|
||||||
|
for name, probability_pair, probability_no_pair in zip(
|
||||||
|
self.model_names, self.probabilities_pairs, self.probabilities_no_pairs
|
||||||
|
):
|
||||||
|
row_pairs[f"{name}_prob"] = probability_pair
|
||||||
|
row_no_pairs[f"{name}_prob"] = probability_no_pair
|
||||||
|
_logger.debug(row_pairs)
|
||||||
|
_logger.debug(row_no_pairs)
|
||||||
|
|
||||||
|
with open(self.filename_pairs, "a", newline="") as outfile:
|
||||||
|
writer = csv.DictWriter(
|
||||||
|
outfile, fieldnames=self.csv_fields, dialect="unix"
|
||||||
|
)
|
||||||
|
writer.writerow(row_pairs)
|
||||||
|
with open(self.filename_no_pairs, "a", newline="") as outfile:
|
||||||
|
writer = csv.DictWriter(
|
||||||
|
outfile, fieldnames=self.csv_fields, dialect="unix"
|
||||||
|
)
|
||||||
|
writer.writerow(row_no_pairs)
|
||||||
|
|
||||||
|
if self.use_end_threshold:
|
||||||
|
max_prob = min(
|
||||||
|
max(self.probabilities_pairs), max(self.probabilities_no_pairs)
|
||||||
|
)
|
||||||
|
if max_prob > self.end_threshold:
|
||||||
|
_logger.info(
|
||||||
|
f"Aborting early, because {max_prob} is greater than {self.end_threshold}"
|
||||||
|
)
|
||||||
|
break
|
@@ -20,28 +20,44 @@ DotInput = Tuple[numpy.typing.ArrayLike, float]
|
|||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def get_a_result(discretisation, dots, index) -> Tuple[Tuple[int, ...], scipy.optimize.OptimizeResult]:
|
def get_a_result(
|
||||||
|
discretisation, dots, index
|
||||||
|
) -> Tuple[Tuple[int, ...], scipy.optimize.OptimizeResult]:
|
||||||
return (index, discretisation.solve_for_index(dots, index))
|
return (index, discretisation.solve_for_index(dots, index))
|
||||||
|
|
||||||
|
|
||||||
class BayesRun():
|
class BayesRun:
|
||||||
'''
|
"""
|
||||||
A single Bayes run for a given set of dots.
|
A single Bayes run for a given set of dots.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
dot_inputs : Sequence[DotInput]
|
dot_inputs : Sequence[DotInput]
|
||||||
The dot inputs for this bayes run.
|
The dot inputs for this bayes run.
|
||||||
|
|
||||||
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
||||||
The models to evaluate.
|
The models to evaluate.
|
||||||
|
|
||||||
actual_model_discretisation : pdme.model.Discretisation
|
actual_model_discretisation : pdme.model.Discretisation
|
||||||
The discretisation for the model which is actually correct.
|
The discretisation for the model which is actually correct.
|
||||||
|
|
||||||
filename_slug : str
|
filename_slug : str
|
||||||
The filename slug to include.
|
The filename slug to include.
|
||||||
|
|
||||||
run_count: int
|
run_count: int
|
||||||
The number of runs to do.
|
The number of runs to do.
|
||||||
'''
|
"""
|
||||||
def __init__(self, dot_inputs: Sequence[DotInput], discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]], actual_model: pdme.model.Model, filename_slug: str, run_count: int, max_frequency: float = None, end_threshold: float = None) -> None:
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
dot_inputs: Sequence[DotInput],
|
||||||
|
discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]],
|
||||||
|
actual_model: pdme.model.Model,
|
||||||
|
filename_slug: str,
|
||||||
|
run_count: int,
|
||||||
|
max_frequency: float = None,
|
||||||
|
end_threshold: float = None,
|
||||||
|
) -> None:
|
||||||
self.dot_inputs = dot_inputs
|
self.dot_inputs = dot_inputs
|
||||||
self.discretisations = [disc for (_, disc) in discretisations_with_names]
|
self.discretisations = [disc for (_, disc) in discretisations_with_names]
|
||||||
self.model_names = [name for (name, _) in discretisations_with_names]
|
self.model_names = [name for (name, _) in discretisations_with_names]
|
||||||
@@ -65,7 +81,9 @@ class BayesRun():
|
|||||||
self.use_end_threshold = True
|
self.use_end_threshold = True
|
||||||
_logger.info(f"Will abort early, at {self.end_threshold}.")
|
_logger.info(f"Will abort early, at {self.end_threshold}.")
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"end_threshold should be between 0 and 1, but is actually {end_threshold}")
|
raise ValueError(
|
||||||
|
f"end_threshold should be between 0 and 1, but is actually {end_threshold}"
|
||||||
|
)
|
||||||
|
|
||||||
def go(self) -> None:
|
def go(self) -> None:
|
||||||
with open(self.filename, "a", newline="") as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
@@ -87,17 +105,28 @@ class BayesRun():
|
|||||||
for disc_count, discretisation in enumerate(self.discretisations):
|
for disc_count, discretisation in enumerate(self.discretisations):
|
||||||
_logger.debug(f"Doing discretisation #{disc_count}")
|
_logger.debug(f"Doing discretisation #{disc_count}")
|
||||||
with multiprocessing.Pool(multiprocessing.cpu_count() - 1 or 1) as pool:
|
with multiprocessing.Pool(multiprocessing.cpu_count() - 1 or 1) as pool:
|
||||||
results.append(pool.starmap(get_a_result, zip(itertools.repeat(discretisation), itertools.repeat(dots), discretisation.all_indices())))
|
results.append(
|
||||||
|
pool.starmap(
|
||||||
|
get_a_result,
|
||||||
|
zip(
|
||||||
|
itertools.repeat(discretisation),
|
||||||
|
itertools.repeat(dots),
|
||||||
|
discretisation.all_indices(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
_logger.debug("Done, constructing output now")
|
_logger.debug("Done, constructing output now")
|
||||||
row = {
|
row = {
|
||||||
"dipole_moment": dipoles.dipoles[0].p,
|
"dipole_moment": dipoles.dipoles[0].p,
|
||||||
"dipole_location": dipoles.dipoles[0].s,
|
"dipole_location": dipoles.dipoles[0].s,
|
||||||
"dipole_frequency": dipoles.dipoles[0].w
|
"dipole_frequency": dipoles.dipoles[0].w,
|
||||||
}
|
}
|
||||||
successes: List[float] = []
|
successes: List[float] = []
|
||||||
counts: List[int] = []
|
counts: List[int] = []
|
||||||
for model_index, (name, result) in enumerate(zip(self.model_names, results)):
|
for model_index, (name, result) in enumerate(
|
||||||
|
zip(self.model_names, results)
|
||||||
|
):
|
||||||
count = 0
|
count = 0
|
||||||
success = 0
|
success = 0
|
||||||
for idx, val in result:
|
for idx, val in result:
|
||||||
@@ -110,19 +139,31 @@ class BayesRun():
|
|||||||
successes.append(max(success, 0.5))
|
successes.append(max(success, 0.5))
|
||||||
counts.append(count)
|
counts.append(count)
|
||||||
|
|
||||||
success_weight = sum([(succ / count) * prob for succ, count, prob in zip(successes, counts, self.probabilities)])
|
success_weight = sum(
|
||||||
new_probabilities = [(succ / count) * old_prob / success_weight for succ, count, old_prob in zip(successes, counts, self.probabilities)]
|
[
|
||||||
|
(succ / count) * prob
|
||||||
|
for succ, count, prob in zip(successes, counts, self.probabilities)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
new_probabilities = [
|
||||||
|
(succ / count) * old_prob / success_weight
|
||||||
|
for succ, count, old_prob in zip(successes, counts, self.probabilities)
|
||||||
|
]
|
||||||
self.probabilities = new_probabilities
|
self.probabilities = new_probabilities
|
||||||
for name, probability in zip(self.model_names, self.probabilities):
|
for name, probability in zip(self.model_names, self.probabilities):
|
||||||
row[f"{name}_prob"] = probability
|
row[f"{name}_prob"] = probability
|
||||||
_logger.info(row)
|
_logger.info(row)
|
||||||
|
|
||||||
with open(self.filename, "a", newline="") as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect="unix")
|
writer = csv.DictWriter(
|
||||||
|
outfile, fieldnames=self.csv_fields, dialect="unix"
|
||||||
|
)
|
||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
|
||||||
if self.use_end_threshold:
|
if self.use_end_threshold:
|
||||||
max_prob = max(self.probabilities)
|
max_prob = max(self.probabilities)
|
||||||
if max_prob > self.end_threshold:
|
if max_prob > self.end_threshold:
|
||||||
_logger.info(f"Aborting early, because {max_prob} is greater than {self.end_threshold}")
|
_logger.info(
|
||||||
|
f"Aborting early, because {max_prob} is greater than {self.end_threshold}"
|
||||||
|
)
|
||||||
break
|
break
|
||||||
|
@@ -18,7 +18,7 @@ def get_a_result(discretisation, dots, index):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SingleDipoleDiagnostic():
|
class SingleDipoleDiagnostic:
|
||||||
model: str
|
model: str
|
||||||
index: Tuple
|
index: Tuple
|
||||||
bounds: Tuple
|
bounds: Tuple
|
||||||
@@ -43,31 +43,71 @@ class SingleDipoleDiagnostic():
|
|||||||
self.w_result = self.result_dipole.w
|
self.w_result = self.result_dipole.w
|
||||||
|
|
||||||
|
|
||||||
class Diagnostic():
|
class Diagnostic:
|
||||||
'''
|
"""
|
||||||
Represents a diagnostic for a single dipole moment given a set of discretisations.
|
Represents a diagnostic for a single dipole moment given a set of discretisations.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
dot_inputs : Sequence[DotInput]
|
dot_inputs : Sequence[DotInput]
|
||||||
The dot inputs for this diagnostic.
|
The dot inputs for this diagnostic.
|
||||||
|
|
||||||
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
discretisations_with_names : Sequence[Tuple(str, pdme.model.Model)]
|
||||||
The models to evaluate.
|
The models to evaluate.
|
||||||
|
|
||||||
actual_model_discretisation : pdme.model.Discretisation
|
actual_model_discretisation : pdme.model.Discretisation
|
||||||
The discretisation for the model which is actually correct.
|
The discretisation for the model which is actually correct.
|
||||||
|
|
||||||
filename_slug : str
|
filename_slug : str
|
||||||
The filename slug to include.
|
The filename slug to include.
|
||||||
|
|
||||||
run_count: int
|
run_count: int
|
||||||
The number of runs to do.
|
The number of runs to do.
|
||||||
'''
|
"""
|
||||||
def __init__(self, actual_dipole_moment: numpy.ndarray, actual_dipole_position: numpy.ndarray, actual_dipole_frequency: float, dot_inputs: Sequence[DotInput], discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]], filename_slug: str) -> None:
|
|
||||||
self.dipoles = OscillatingDipoleArrangement([OscillatingDipole(actual_dipole_moment, actual_dipole_position, actual_dipole_frequency)])
|
def __init__(
|
||||||
|
self,
|
||||||
|
actual_dipole_moment: numpy.ndarray,
|
||||||
|
actual_dipole_position: numpy.ndarray,
|
||||||
|
actual_dipole_frequency: float,
|
||||||
|
dot_inputs: Sequence[DotInput],
|
||||||
|
discretisations_with_names: Sequence[Tuple[str, pdme.model.Discretisation]],
|
||||||
|
filename_slug: str,
|
||||||
|
) -> None:
|
||||||
|
self.dipoles = OscillatingDipoleArrangement(
|
||||||
|
[
|
||||||
|
OscillatingDipole(
|
||||||
|
actual_dipole_moment,
|
||||||
|
actual_dipole_position,
|
||||||
|
actual_dipole_frequency,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
self.dots = self.dipoles.get_dot_measurements(dot_inputs)
|
self.dots = self.dipoles.get_dot_measurements(dot_inputs)
|
||||||
|
|
||||||
self.discretisations_with_names = discretisations_with_names
|
self.discretisations_with_names = discretisations_with_names
|
||||||
self.model_count = len(self.discretisations_with_names)
|
self.model_count = len(self.discretisations_with_names)
|
||||||
|
|
||||||
self.csv_fields = ["model", "index", "bounds", "p_actual_x", "p_actual_y", "p_actual_z", "s_actual_x", "s_actual_y", "s_actual_z", "w_actual", "success", "p_result_x", "p_result_y", "p_result_z", "s_result_x", "s_result_y", "s_result_z", "w_result"]
|
self.csv_fields = [
|
||||||
|
"model",
|
||||||
|
"index",
|
||||||
|
"bounds",
|
||||||
|
"p_actual_x",
|
||||||
|
"p_actual_y",
|
||||||
|
"p_actual_z",
|
||||||
|
"s_actual_x",
|
||||||
|
"s_actual_y",
|
||||||
|
"s_actual_z",
|
||||||
|
"w_actual",
|
||||||
|
"success",
|
||||||
|
"p_result_x",
|
||||||
|
"p_result_y",
|
||||||
|
"p_result_z",
|
||||||
|
"s_result_x",
|
||||||
|
"s_result_y",
|
||||||
|
"s_result_z",
|
||||||
|
"w_result",
|
||||||
|
]
|
||||||
|
|
||||||
timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
|
timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||||
self.filename = f"{timestamp}-{filename_slug}.diag.csv"
|
self.filename = f"{timestamp}-{filename_slug}.diag.csv"
|
||||||
@@ -75,7 +115,7 @@ class Diagnostic():
|
|||||||
def go(self):
|
def go(self):
|
||||||
with open(self.filename, "a", newline="") as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
# csv fields
|
# csv fields
|
||||||
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect='unix')
|
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect="unix")
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
|
|
||||||
for (name, discretisation) in self.discretisations_with_names:
|
for (name, discretisation) in self.discretisations_with_names:
|
||||||
@@ -83,17 +123,38 @@ class Diagnostic():
|
|||||||
|
|
||||||
results = []
|
results = []
|
||||||
with multiprocessing.Pool(multiprocessing.cpu_count() - 1 or 1) as pool:
|
with multiprocessing.Pool(multiprocessing.cpu_count() - 1 or 1) as pool:
|
||||||
results = pool.starmap(get_a_result, zip(itertools.repeat(discretisation), itertools.repeat(self.dots), discretisation.all_indices()))
|
results = pool.starmap(
|
||||||
|
get_a_result,
|
||||||
|
zip(
|
||||||
|
itertools.repeat(discretisation),
|
||||||
|
itertools.repeat(self.dots),
|
||||||
|
discretisation.all_indices(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
with open(self.filename, "a", newline='') as outfile:
|
with open(self.filename, "a", newline="") as outfile:
|
||||||
writer = csv.DictWriter(outfile, fieldnames=self.csv_fields, dialect='unix', extrasaction="ignore")
|
writer = csv.DictWriter(
|
||||||
|
outfile,
|
||||||
|
fieldnames=self.csv_fields,
|
||||||
|
dialect="unix",
|
||||||
|
extrasaction="ignore",
|
||||||
|
)
|
||||||
|
|
||||||
for idx, result in results:
|
for idx, result in results:
|
||||||
|
|
||||||
bounds = discretisation.bounds(idx)
|
bounds = discretisation.bounds(idx)
|
||||||
|
|
||||||
actual_success = result.success and result.cost <= 1e-10
|
actual_success = result.success and result.cost <= 1e-10
|
||||||
diag_row = SingleDipoleDiagnostic(name, idx, bounds, self.dipoles.dipoles[0], discretisation.model.solution_as_dipoles(result.normalised_x)[0], actual_success)
|
diag_row = SingleDipoleDiagnostic(
|
||||||
|
name,
|
||||||
|
idx,
|
||||||
|
bounds,
|
||||||
|
self.dipoles.dipoles[0],
|
||||||
|
discretisation.model.solution_as_dipoles(result.normalised_x)[
|
||||||
|
0
|
||||||
|
],
|
||||||
|
actual_success,
|
||||||
|
)
|
||||||
row = vars(diag_row)
|
row = vars(diag_row)
|
||||||
_logger.debug(f"Writing result {row}")
|
_logger.debug(f"Writing result {row}")
|
||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
from importlib.metadata import version
|
from importlib.metadata import version
|
||||||
|
|
||||||
__version__ = version('deepdog')
|
__version__ = version("deepdog")
|
||||||
|
5
do.sh
5
do.sh
@@ -16,6 +16,11 @@ test() {
|
|||||||
poetry run pytest
|
poetry run pytest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt() {
|
||||||
|
poetry run black .
|
||||||
|
find . -type f -name "*.py" -exec sed -i -e 's/ /\t/g' {} \;
|
||||||
|
}
|
||||||
|
|
||||||
release() {
|
release() {
|
||||||
./scripts/release.sh
|
./scripts/release.sh
|
||||||
}
|
}
|
||||||
|
179
poetry.lock
generated
179
poetry.lock
generated
@@ -20,6 +20,28 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
|||||||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
||||||
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
|
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "black"
|
||||||
|
version = "22.3.0"
|
||||||
|
description = "The uncompromising code formatter."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6.2"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
click = ">=8.0.0"
|
||||||
|
mypy-extensions = ">=0.4.3"
|
||||||
|
pathspec = ">=0.9.0"
|
||||||
|
platformdirs = ">=2"
|
||||||
|
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
||||||
|
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
colorama = ["colorama (>=0.4.3)"]
|
||||||
|
d = ["aiohttp (>=3.7.4)"]
|
||||||
|
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||||
|
uvloop = ["uvloop (>=0.15.2)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bleach"
|
name = "bleach"
|
||||||
version = "4.1.0"
|
version = "4.1.0"
|
||||||
@@ -260,7 +282,7 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mypy"
|
name = "mypy"
|
||||||
version = "0.942"
|
version = "0.950"
|
||||||
description = "Optional static typing for Python"
|
description = "Optional static typing for Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -268,7 +290,7 @@ python-versions = ">=3.6"
|
|||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
mypy-extensions = ">=0.4.3"
|
mypy-extensions = ">=0.4.3"
|
||||||
tomli = ">=1.1.0"
|
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
||||||
typing-extensions = ">=3.10"
|
typing-extensions = ">=3.10"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
@@ -286,7 +308,7 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "numpy"
|
name = "numpy"
|
||||||
version = "1.22.1"
|
version = "1.22.3"
|
||||||
description = "NumPy is the fundamental package for array computing with Python."
|
description = "NumPy is the fundamental package for array computing with Python."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@@ -303,16 +325,24 @@ python-versions = ">=3.6"
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathspec"
|
||||||
|
version = "0.9.0"
|
||||||
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pdme"
|
name = "pdme"
|
||||||
version = "0.6.1"
|
version = "0.6.2"
|
||||||
description = "Python dipole model evaluator"
|
description = "Python dipole model evaluator"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8,<3.10"
|
python-versions = ">=3.8,<3.10"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
numpy = ">=1.21.1,<2.0.0"
|
numpy = ">=1.22.3,<2.0.0"
|
||||||
scipy = ">=1.8,<1.9"
|
scipy = ">=1.8,<1.9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -326,6 +356,18 @@ python-versions = "*"
|
|||||||
[package.extras]
|
[package.extras]
|
||||||
testing = ["coverage", "nose"]
|
testing = ["coverage", "nose"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "platformdirs"
|
||||||
|
version = "2.5.1"
|
||||||
|
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
|
||||||
|
test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pluggy"
|
name = "pluggy"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -698,7 +740,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.8,<3.10"
|
python-versions = "^3.8,<3.10"
|
||||||
content-hash = "2911e2f292dbc9f6a87bfbb0b534695e2f0ae1e1a260aecca10955e685d6f846"
|
content-hash = "98877f53c0ca996cd6eaa2c3b7391e391d29c7a4d3f1e08159fc999a3e4ad296"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
atomicwrites = [
|
atomicwrites = [
|
||||||
@@ -709,6 +751,31 @@ attrs = [
|
|||||||
{file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
|
{file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
|
||||||
{file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
|
{file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
|
||||||
]
|
]
|
||||||
|
black = [
|
||||||
|
{file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
|
||||||
|
{file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
|
||||||
|
{file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"},
|
||||||
|
{file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"},
|
||||||
|
{file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"},
|
||||||
|
{file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"},
|
||||||
|
{file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"},
|
||||||
|
{file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"},
|
||||||
|
{file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"},
|
||||||
|
{file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"},
|
||||||
|
{file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"},
|
||||||
|
{file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"},
|
||||||
|
{file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"},
|
||||||
|
{file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"},
|
||||||
|
{file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"},
|
||||||
|
{file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"},
|
||||||
|
{file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"},
|
||||||
|
{file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"},
|
||||||
|
{file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"},
|
||||||
|
{file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"},
|
||||||
|
{file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"},
|
||||||
|
{file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
|
||||||
|
{file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
|
||||||
|
]
|
||||||
bleach = [
|
bleach = [
|
||||||
{file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
|
{file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
|
||||||
{file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"},
|
{file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"},
|
||||||
@@ -899,70 +966,76 @@ mccabe = [
|
|||||||
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
||||||
]
|
]
|
||||||
mypy = [
|
mypy = [
|
||||||
{file = "mypy-0.942-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d"},
|
{file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"},
|
||||||
{file = "mypy-0.942-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46"},
|
{file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"},
|
||||||
{file = "mypy-0.942-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0"},
|
{file = "mypy-0.950-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22"},
|
||||||
{file = "mypy-0.942-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"},
|
{file = "mypy-0.950-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb"},
|
||||||
{file = "mypy-0.942-cp310-cp310-win_amd64.whl", hash = "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17"},
|
{file = "mypy-0.950-cp310-cp310-win_amd64.whl", hash = "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334"},
|
||||||
{file = "mypy-0.942-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904"},
|
{file = "mypy-0.950-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f"},
|
||||||
{file = "mypy-0.942-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5"},
|
{file = "mypy-0.950-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc"},
|
||||||
{file = "mypy-0.942-cp36-cp36m-win_amd64.whl", hash = "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c"},
|
{file = "mypy-0.950-cp36-cp36m-win_amd64.whl", hash = "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2"},
|
||||||
{file = "mypy-0.942-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58"},
|
{file = "mypy-0.950-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed"},
|
||||||
{file = "mypy-0.942-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6"},
|
{file = "mypy-0.950-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075"},
|
||||||
{file = "mypy-0.942-cp37-cp37m-win_amd64.whl", hash = "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e"},
|
{file = "mypy-0.950-cp37-cp37m-win_amd64.whl", hash = "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"},
|
||||||
{file = "mypy-0.942-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67"},
|
{file = "mypy-0.950-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d"},
|
||||||
{file = "mypy-0.942-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c"},
|
{file = "mypy-0.950-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a"},
|
||||||
{file = "mypy-0.942-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b"},
|
{file = "mypy-0.950-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605"},
|
||||||
{file = "mypy-0.942-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3"},
|
{file = "mypy-0.950-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2"},
|
||||||
{file = "mypy-0.942-cp38-cp38-win_amd64.whl", hash = "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8"},
|
{file = "mypy-0.950-cp38-cp38-win_amd64.whl", hash = "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff"},
|
||||||
{file = "mypy-0.942-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca"},
|
{file = "mypy-0.950-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8"},
|
||||||
{file = "mypy-0.942-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16"},
|
{file = "mypy-0.950-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038"},
|
||||||
{file = "mypy-0.942-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6"},
|
{file = "mypy-0.950-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2"},
|
||||||
{file = "mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322"},
|
{file = "mypy-0.950-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519"},
|
||||||
{file = "mypy-0.942-cp39-cp39-win_amd64.whl", hash = "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534"},
|
{file = "mypy-0.950-cp39-cp39-win_amd64.whl", hash = "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef"},
|
||||||
{file = "mypy-0.942-py3-none-any.whl", hash = "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db"},
|
{file = "mypy-0.950-py3-none-any.whl", hash = "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb"},
|
||||||
{file = "mypy-0.942.tar.gz", hash = "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2"},
|
{file = "mypy-0.950.tar.gz", hash = "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de"},
|
||||||
]
|
]
|
||||||
mypy-extensions = [
|
mypy-extensions = [
|
||||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
||||||
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
||||||
]
|
]
|
||||||
numpy = [
|
numpy = [
|
||||||
{file = "numpy-1.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d62d6b0870b53799204515145935608cdeb4cebb95a26800b6750e48884cc5b"},
|
{file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"},
|
||||||
{file = "numpy-1.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:831f2df87bd3afdfc77829bc94bd997a7c212663889d56518359c827d7113b1f"},
|
{file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"},
|
||||||
{file = "numpy-1.22.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d1563060e77096367952fb44fca595f2b2f477156de389ce7c0ade3aef29e21"},
|
{file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"},
|
||||||
{file = "numpy-1.22.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69958735d5e01f7b38226a6c6e7187d72b7e4d42b6b496aca5860b611ca0c193"},
|
{file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"},
|
||||||
{file = "numpy-1.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45a7dfbf9ed8d68fd39763940591db7637cf8817c5bce1a44f7b56c97cbe211e"},
|
{file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"},
|
||||||
{file = "numpy-1.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:7e957ca8112c689b728037cea9c9567c27cf912741fabda9efc2c7d33d29dfa1"},
|
{file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:800dfeaffb2219d49377da1371d710d7952c9533b57f3d51b15e61c4269a1b5b"},
|
{file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:65f5e257987601fdfc63f1d02fca4d1c44a2b85b802f03bd6abc2b0b14648dd2"},
|
{file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:632e062569b0fe05654b15ef0e91a53c0a95d08ffe698b66f6ba0f927ad267c2"},
|
{file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d245a2bf79188d3f361137608c3cd12ed79076badd743dc660750a9f3074f7c"},
|
{file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b4018a19d2ad9606ce9089f3d52206a41b23de5dfe8dc947d2ec49ce45d015"},
|
{file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-win32.whl", hash = "sha256:f8ad59e6e341f38266f1549c7c2ec70ea0e3d1effb62a44e5c3dba41c55f0187"},
|
{file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"},
|
||||||
{file = "numpy-1.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:60f19c61b589d44fbbab8ff126640ae712e163299c2dd422bfe4edc7ec51aa9b"},
|
{file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2db01d9838a497ba2aa9a87515aeaf458f42351d72d4e7f3b8ddbd1eba9479f2"},
|
{file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bcd19dab43b852b03868796f533b5f5561e6c0e3048415e675bec8d2e9d286c1"},
|
{file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78bfbdf809fc236490e7e65715bbd98377b122f329457fffde206299e163e7f3"},
|
{file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c51124df17f012c3b757380782ae46eee85213a3215e51477e559739f57d9bf6"},
|
{file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d54b7b516f0ca38a69590557814de2dd638d7d4ed04864826acaac5ebb8f01"},
|
{file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-win32.whl", hash = "sha256:b5ec9a5eaf391761c61fd873363ef3560a3614e9b4ead17347e4deda4358bca4"},
|
{file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"},
|
||||||
{file = "numpy-1.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:4ac4d7c9f8ea2a79d721ebfcce81705fc3cd61a10b731354f1049eb8c99521e8"},
|
{file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"},
|
||||||
{file = "numpy-1.22.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e60ef82c358ded965fdd3132b5738eade055f48067ac8a5a8ac75acc00cad31f"},
|
|
||||||
{file = "numpy-1.22.1.zip", hash = "sha256:e348ccf5bc5235fc405ab19d53bec215bb373300e5523c7b476cc0da8a5e9973"},
|
|
||||||
]
|
]
|
||||||
packaging = [
|
packaging = [
|
||||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
||||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
||||||
]
|
]
|
||||||
|
pathspec = [
|
||||||
|
{file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
|
||||||
|
{file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
|
||||||
|
]
|
||||||
pdme = [
|
pdme = [
|
||||||
{file = "pdme-0.6.1-py3-none-any.whl", hash = "sha256:c73edeeab13a5518a016f5ac1fdf576f328030530a49991ec822f0ca0c311ff3"},
|
{file = "pdme-0.6.2-py3-none-any.whl", hash = "sha256:7e81081be243006f86c31d3590a77a529764204b3831b83a939a87025d463e26"},
|
||||||
{file = "pdme-0.6.1.tar.gz", hash = "sha256:c857a905d5fbc03ac24777d8fd652e1c5531d0817088748ce443ad1b378124f9"},
|
{file = "pdme-0.6.2.tar.gz", hash = "sha256:59c2a3249338317f22cf268c55c90d06b563d42a9278e2826753f6d491379f67"},
|
||||||
]
|
]
|
||||||
pkginfo = [
|
pkginfo = [
|
||||||
{file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"},
|
{file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"},
|
||||||
{file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"},
|
{file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"},
|
||||||
]
|
]
|
||||||
|
platformdirs = [
|
||||||
|
{file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"},
|
||||||
|
{file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"},
|
||||||
|
]
|
||||||
pluggy = [
|
pluggy = [
|
||||||
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
||||||
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
||||||
|
@@ -1,19 +1,20 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "deepdog"
|
name = "deepdog"
|
||||||
version = "0.4.0"
|
version = "0.5.0"
|
||||||
description = ""
|
description = ""
|
||||||
authors = ["Deepak Mallubhotla <dmallubhotla+github@gmail.com>"]
|
authors = ["Deepak Mallubhotla <dmallubhotla+github@gmail.com>"]
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.8,<3.10"
|
python = "^3.8,<3.10"
|
||||||
pdme = "^0.6.1"
|
pdme = "0.6.2"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = ">=6"
|
pytest = ">=6"
|
||||||
flake8 = "^4.0.1"
|
flake8 = "^4.0.1"
|
||||||
pytest-cov = "^3.0.0"
|
pytest-cov = "^3.0.0"
|
||||||
mypy = "^0.942"
|
mypy = "^0.950"
|
||||||
python-semantic-release = "^7.24.0"
|
python-semantic-release = "^7.24.0"
|
||||||
|
black = "^22.3.0"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
Reference in New Issue
Block a user