Source code for wepy.reporter.revo.dashboard
# Standard Library
import itertools as it
import logging
logger = logging.getLogger(__name__)
# Standard Library
import os.path as osp
from collections import defaultdict
# Third Party Library
import numpy as np
import pandas as pd
# First Party Library
from wepy.reporter.dashboard import ResamplerDashboardSection
from wepy.resampling.decisions.clone_merge import MultiCloneMergeDecision
[docs]
class REVODashboardSection(ResamplerDashboardSection):
RESAMPLER_SECTION_TEMPLATE = """
Resampling Algorithm: {{ name }}
Distance Exponent: {{ dist_exponent }}
Characteristic Distance: {{ char_dist }}
Merge Distance: {{ merge_dist }}
** Resampling
Cycle index: {{ cycle_idx }}
The percentage of cloned walkers: {{ percentage_cloned_walkers }} %
The percentage of merged walkers: {{ percentage_merged_walkers }} %
** Statistics
Average All to All Distance: {{ avg_distance }}
Minimum All to All Distance: {{ min_distance }}
Maximum All to All Distance: {{ max_distance }}
Variation value = {{ variation }}
"""
def __init__(
self,
resampler=None,
dist_exponent=None,
merge_dist=None,
lpmin=None,
char_dist=None,
seed=None,
decision=None,
**kwargs
):
if "name" not in kwargs:
kwargs["name"] = "REVOResampler"
super().__init__(
resampler=resampler,
dist_exponent=dist_exponent,
merge_dist=merge_dist,
lpmin=lpmin,
char_dist=char_dist,
seed=seed,
decision=decision,
)
if resampler is not None:
self.dist_exponent = resampler.dist_exponent
self.merge_dist = resampler.merge_dist
self.lpmin = resampler.lpmin
self.char_dist = resampler.char_dist
self.seed = resampler.seed
self.decision = resampler.DECISION
else:
assert (
dist_exponent is not None
), "if no resampler given must give parameters: dist_exponent"
assert (
merge_dist is not None
), "if no resampler given must give parameters: merge_dist"
assert (
lpmin is not None
), "if no resampler given must give parameters: lpmin"
assert (
char_dist is not None
), "if no resampler given must give parameters: char_dist"
assert seed is not None, "if no resampler given must give parameters: seed"
assert (
decision is not None
), "if no resampler given must give parameters: decision"
self.dist_exponent = dist_exponent
self.merge_dist = merge_dist
self.lpmin = lpmin
self.char_dist = char_dist
self.seed = seed
self.decision = decision
# updatables
self.percentage_cloned_walkers = 0
self.percentage_merged_walkers = 0
# REVO
self.avg_distance = None
self.min_distance = None
self.max_distance = None
self.variation_values = None
[docs]
def update_values(self, **kwargs):
num_clones = 0
num_merges = 0
num_walkers = len(kwargs["resampling_data"])
for walker_record in kwargs["resampling_data"]:
if walker_record["decision_id"][0] == self.decision.ENUM.CLONE.value:
num_clones += 1
elif walker_record["decision_id"][0] == self.decision.ENUM.KEEP_MERGE.value:
num_merges += 1
self.percentage_cloned_walkers = (num_clones / num_walkers) * 100
self.percentage_merged_walkers = (num_merges / num_walkers) * 100
# Get the statistics
for resampler_record in kwargs["resampler_data"]:
self.variation_value = resampler_record["variation"][0]
distance_matrix = resampler_record["distance_matrix"]
# get the upper triangle values of the distance_matrix
distance_matrix = np.triu(distance_matrix)
distance_values = distance_matrix[np.where(distance_matrix > 0)]
self.avg_distance = np.average(distance_values)
self.min_distance = np.min(distance_values)
self.max_distance = np.max(distance_values)
self.cycle_idx = kwargs["cycle_idx"]
[docs]
def gen_fields(self, **kwargs):
fields = super().gen_fields(**kwargs)
new_fields = {
"dist_exponent": self.dist_exponent,
"char_dist": self.char_dist,
"merge_dist": self.merge_dist,
"cycle_idx": self.cycle_idx,
"percentage_cloned_walkers": self.percentage_cloned_walkers,
"percentage_merged_walkers": self.percentage_merged_walkers,
"avg_distance": self.avg_distance,
"min_distance": self.min_distance,
"max_distance": self.max_distance,
"variation": self.variation_value,
}
fields.update(new_fields)
return fields