예제 #1
0
    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)
예제 #2
0
    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
예제 #3
0
    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()