X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Fnew%2Fjumpavg%2FBitCountingGroupList.py;fp=resources%2Ftools%2Fpresentation%2Fnew%2Fjumpavg%2FBitCountingGroupList.py;h=7da065678276ee0b69898ff36e292537834b6c22;hb=beeb2acb9ac153eaa54983bea46a76d596168965;hp=0000000000000000000000000000000000000000;hpb=3dcef45002a1b82c4503ec590d680950930fa193;p=csit.git diff --git a/resources/tools/presentation/new/jumpavg/BitCountingGroupList.py b/resources/tools/presentation/new/jumpavg/BitCountingGroupList.py new file mode 100644 index 0000000000..7da0656782 --- /dev/null +++ b/resources/tools/presentation/new/jumpavg/BitCountingGroupList.py @@ -0,0 +1,82 @@ +# Copyright (c) 2018 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from BitCountingGroup import BitCountingGroup +from BitCountingMetadataFactory import BitCountingMetadataFactory + + +class BitCountingGroupList(object): + + def __init__(self, group_list=[], bits=None): + """Create a group list from given list of groups. + + :param group_list: List of groups to compose this group. + :param bits: Bit count if known, else None. + :type group_list: list of BitCountingGroup + :type bits: float or None + """ + self.group_list = group_list + if bits is not None: + self.bits = bits + return + bits = 0.0 + for group in group_list: + bits += group.metadata.bits + self.bits = bits + + def __getitem__(self, index): + """Return group at the index. This makes self iterable. + + :param index: The position in the array of groups. + :type index: int + :returns: Group at the position. + :rtype: BitCountingGroup + """ + return self.group_list[index] + + def with_group_appended(self, group): + """Create and return new group list with given group more than self. + + The group argument object is updated with derivative metadata. + + :param group: Next group to be appended to the group list. + :type group: BitCountingGroup + :returns: New group list with added group. + :rtype: BitCountingGroupList + """ + group_list = list(self.group_list) + if group_list: + last_group = group_list[-1] + factory = BitCountingMetadataFactory( + last_group.metadata_factory.max_value, last_group.metadata.avg) + group.metadata_factory = factory + group.metadata = factory.from_data(group.values) + group_list.append(group) + bits = self.bits + group.metadata.bits + return BitCountingGroupList(group_list, bits) + + def with_value_added_to_last_group(self, value): + """Create and return new group list with value added to last group. + + :param value: The run value to add to the last group. + :type value: float or od AvgStdevMetadata + :returns: New group list with the last group updated. + :rtype: BitCountingGroupList + """ + last_group = self.group_list[-1] + bits_before = last_group.metadata.bits + last_group = last_group.with_run_added(value) + group_list = list(self.group_list) + group_list[-1] = last_group + bits = self.bits - bits_before + last_group.metadata.bits + return BitCountingGroupList(group_list, bits)