def compute_cohomology(self): cohomology = ModVectorSpace([]) ##### Tweak to check dimension before working if not self.get_cohomology_dim(): self.cohomology = cohomology self.cohomology_flag = True return ##### index_list = self.get_kernel().get_basis()[:] basis_list = [] for ker_element in index_list: if not self.in_cohomology_subspace(basis_list, ker_element): basis_list.append(ker_element) cohomology.add_basis_element(basis_list) self.cohomology = cohomology if (self.get_B().col_count - self.get_B().get_rank() - self.get_A().get_rank() != len(cohomology.get_basis())): print "A" print self.get_A() print "B" print self.get_B() print "rank A" print self.get_A().get_rank() print "nullity B" print self.get_B().col_count - self.get_B().get_rank() print "basis for cohomology" for thing in cohomology.get_basis(): print thing raise TypeError("cohomology basis computation incorrect!") self.cohomology_flag = True
def compute_image(self): image = ModVectorSpace([]) for row in self.get_A().get_rref(): if not row.is_zero(): index = row.get_leading_index() image.add_basis_element([ self.get_A().get_column(index) ]) self.image = image self.image_flag = True
def __init__(self, B, A): self.B = B self.A = A self.kernel = None self.kernel_flag = False self.image = None self.image_flag = False self.cohomology = None self.cohomology_flag = False self.product = ModVectorSpace([]) # if self.A.rows == []: # self.A = ModMatrix.null(self.B.get_size()[1], 1) # elif self.B.rows == []: # raise TypeError if self.B.get_size()[1] != self.A.get_size()[0]: raise TypeError("wrong sizes B: " + str(self.B) + "A: " + str(self.A)) self.extended_ker_basis = None self.extended_ker_basis_flag = False
def get_kernel(self): if not self.get_kernel_flag(): self.kernel = ModVectorSpace(self.get_B().get_kernel_vout()) self.kernel_flag = True return self.kernel