if need_logs: print("Decode DNA to bits.") bit_segments = np.zeros((len(dna_sequences), payload), dtype=np.uint8) dubious = collections.defaultdict(list) monitor = Monitor() for i, sequence in enumerate(dna_sequences): dna_sequence = sequence[:-vt_length] if vt_length > 0 else sequence vt_check = sequence[-vt_length:] if vt_length > 0 else None try: result = dsw.decode(dna_sequence, index_binary_length + payload, coding_accessor, start_index, is_faster=True if 3 not in out_degree_counter and 4 not in out_degree_counter else False, vt_check=vt_check) index_bits, payload_bits = result[:index_binary_length], result[index_binary_length:] index = int(''.join(str(bit) for bit in index_bits), 2) bit_segments[index] = payload_bits except ValueError: # decode失败,尝试修复 candidates = self.repair_dna(dna_sequence, coding_accessor, start_index, vt_check) if len(candidates) == 0: raise ValueError("Candidates len should never be zero!") for candidate in candidates: result = dsw.decode(candidate, index_binary_length + payload, coding_accessor, start_index, is_faster=True if 3 not in out_degree_counter and 4 not in out_degree_counter else False, vt_check=None) index_bits, payload_bits = result[:index_binary_length], result[index_binary_length:] index = int(''.join(str(bit) for bit in index_bits), 2) if len(candidates) == 1: bit_segments[index] = payload_bits else: dubious[index].append(payload_bits) if need_logs: monitor(i + 1, len(dna_sequences))
时间: 2024-02-14 08:30:35 浏览: 128
在这段代码中,首先根据需要打印日志信息,显示正在进行DNA解码为位的操作。
然后,创建一个大小为`(len(dna_sequences), payload)`的全零数组`bit_segments`,用于存储解码后的位段。
接着,创建了一个默认值为列表的字典`dubious`,用于存储解码失败的位段备选方案。
然后,创建一个监视器对象`monitor`,用于跟踪进度。
接下来,使用`enumerate()`函数遍历`dna_sequences`列表,其中`i`表示索引,`sequence`表示每个DNA序列。
在循环中,首先根据是否有可变长度(`vt_length`)来截取DNA序列和可变长度校验位(`vt_check`)。
然后,尝试调用`dsw.decode()`函数对DNA序列进行解码,根据给定的参数和编码图(`coding_accessor`)、起始顶点索引(`start_index`)、是否使用快速模式(`is_faster`)以及可变长度校验位(`vt_check`)等。
解码结果被分割为索引位(index_bits)和有效负载位(payload_bits),将索引位转换为整数类型,并将有效负载位存储在对应索引的`bit_segments`数组中。
如果解码失败,会尝试修复并获取多个备选方案(candidates),然后再次进行解码。
解码成功后,根据备选方案的数量和是否只有一个备选方案,将解码结果存储在`bit_segments`数组中或者存储在`dubious`字典中。
最后,根据需要打印日志信息,显示解码的进度。
请注意,以上只是对代码的简要解释,并不包括完整的代码功能和细节。如果您需要更详细的解释或有其他问题,请随时提问。
阅读全文