def add_assumption(self, lincomb, bound): """Assumption of the form [(perm, coef), ..., (perm, coef)] \geq bound.""" # switch on 'assumptions mode' if self.assumptions is False: self.assumptions = True assumption_densities = [-Rational(bound) for x in range(len(self.admissible_perms))] for densperm, coeff in lincomb: densperm = PermFlag(densperm) if self.N < densperm.N: # if too big to fit, then skip continue combs = Combinations(range(self.N), densperm.N) numcombs = combs.cardinality() # for each admissible permutation, compute the density of densperm in it for i in range(len(self.admissible_perms)): admissibleperm = self.admissible_perms[i] counter = 0 # number of copies of densperm in admissible perm for c in combs: admissible_subperm = normalize([admissibleperm.perm[x] for x in c], densperm.N) admissible_subflag = PermFlag(admissible_subperm) if admissible_subflag == densperm: counter += 1 assumption_densities[i] += coeff*Integer(counter)/numcombs #sys.stdout.write("assumption_densities[i] = %s\n" % str(assumption_densities[i])) self.assumption_densities.append(assumption_densities)
def _compute_densities(self): densities = [0 for x in range(len(self.admissible_perms))] for densperm, coeff in self.density_pattern: if self.N < densperm.N: # too big to fit, then skip continue combs = Combinations(range(self.N), densperm.N) numcombs = combs.cardinality() # for each admissible permutation, compute the density of densperm in it for i in range(len(self.admissible_perms)): admissibleperm = self.admissible_perms[i] counter = 0 # number of copies of densperm in admissibleperm for c in combs: admissible_subperm = normalize([admissibleperm.perm[x] for x in c], densperm.N) admissible_subflag = PermFlag(admissible_subperm) if admissible_subflag == densperm: counter += 1 densities[i] += coeff*Integer(counter)/numcombs return densities
def subperm_density(self, perm): """ Return density of perm in self. INPUT: - perm: permutation of type PermFlag EXAMPLE: sage: P = PermFlag("1234765") sage: P.subperm_density(PermFlag("123")) 22/35 """ combs = Combinations(self.N, perm.N) counter = 0 for c in combs: if self._induced_subpattern(c) == perm.perm: counter += 1 return Integer(counter) / combs.cardinality()