Exemple #1
0
class Core:
    _DIC_FUNC = {
        'd2': Dissimilarity.get_D2,
        'Ch': Dissimilarity.get_Ch,
        'Eu': Dissimilarity.get_Eu,
        'Ma': Dissimilarity.get_Ma,
        'd2S': Dissimilarity.get_D2S,
        'd2Star': Dissimilarity.get_D2Star,
        'Hao': Dissimilarity.get_Hao
    }

    def __init__(self,
                 k_list: List[int],
                 seq_file_list: List[str],
                 dissimilirary_list: List[str],
                 save_dir: str,
                 markov_list: List[int] = None):
        self._k_list = k_list
        self._seq_list = [
            SequenceData(seq_file_list[i], i)
            for i in range(len(seq_file_list))
        ]
        self._dissimilarity = [
            self._DIC_FUNC[name] for name in dissimilirary_list
        ]
        self._markov_list = markov_list
        self._dissimilarity_names = dissimilirary_list
        self._result = Result(len(seq_file_list))
        self._save_dir = save_dir

    def n_to_n(self):
        names = [seq.name for seq in self._seq_list]
        for i in tqdm(range(len(self._seq_list) - 1)):  # type: int
            self.one_to_n(self._seq_list[i], self._seq_list[i + 1:])
            self._seq_list[i] = None
        self._result.save_to_file(self._save_dir, names)

    def one_to_n(self, one: SequenceData, others: List[SequenceData]):
        for seq in others:
            Core._one_to_one(one, seq, self._k_list, self._dissimilarity,
                             self._result, self._markov_list)

    @staticmethod
    def _one_to_one(seq_x: SequenceData, seq_y: SequenceData,
                    k_list: List[int], func_list: List[Callable],
                    result: Result, markov_list: List[int]):
        for k in k_list:
            [func(seq_x, seq_y, k, result, markov_list) for func in func_list]

    def _clear(self, k: int, r: int = None):
        if 'd2S' in self._dissimilarity_names or 'd2Star' in self._dissimilarity_names:
            if k in self._markov_list:
                return
        if 'Hao' in self._dissimilarity_names:
            k -= 3
        for seq in self._seq_list:
            seq.clear(k)

    @staticmethod
    def star(k_list: List[int],
             seq_dir: str,
             dissimilirary_list: List[str],
             save_dir: str,
             markov_list: List[int] = None):
        dirs = Core.recurrence_load(seq_dir)
        for dir_ in dirs:
            name = os.path.split(dir_)[-1]
            print('{} start.................'.format(name))
            seq_file_list = Core.get_file_path(dir_)
            save = os.path.join(save_dir, name)
            os.makedirs(save) if not os.path.exists(save) else None
            Core(k_list, seq_file_list, dissimilirary_list, save,
                 markov_list).n_to_n()

    @staticmethod
    def recurrence_load(dir_path: str):
        dirs = []

        def _rec_load(path: str):
            tmps = os.listdir(path)
            p = os.path.join(path, tmps[0])
            if os.path.isfile(p):
                dirs.append(path)
            elif os.path.isdir(p):
                [_rec_load(os.path.join(path, sub_path)) for sub_path in tmps]
            else:
                return

        _rec_load(dir_path)
        return dirs

    @staticmethod
    def get_file_path(dir_path: str) -> List[str]:
        tmps = os.listdir(dir_path)
        return [os.path.join(dir_path, sub_path) for sub_path in tmps]