def METHOD_NAME(self, pp, sk, ct):
    policy = util.createPolicy(ct['Policy'])
    z = util.getCoefficients(policy)
    # workaround to let the charm policy parser successfully parse the non-monotonic attributes
    a_list = util.getAttributeList(policy)
    nS = sk['S'][:]
    for att in a_list:
        if att[0] == '!' and att[1:] not in sk['S']:
            nS.append(att)
    pruned_list = util.prune(policy, nS)
    if (pruned_list == False):
        return group.init(GT,1)
    B = pair(ct['C1'], sk['D1'])
    for i in range(len(pruned_list)):
        x = pruned_list[i].getAttribute( ) #without the underscore
        y = pruned_list[i].getAttributeAndIndex( ) #with the underscore
        a = pair( ct['C_1'][x], sk['D2'])
        if x[0] == '!':
            b = group.init(GT, 1)
            inti = self.exp(int(x[1:]))
            for xj in sk['S']:
                if xj[0] == '!':
                    intj = self.exp(int(xj[1:]))
                else:
                    intj = self.exp(int(xj))
                b *= ( pair( ct['C_2'][x], sk['K2Dot'][str(intj)]) * pair( ct['C_3'][x], sk['K1Dot'][str(intj)]) ) ** (1 / (inti - intj))
        else:
            b = pair( ct['C_2'][x], sk['K2'][x]) * pair( ct['C_3'][x], sk['K1'][x])
        d = - z[y]
        B *= ( a * b )**d
    return ct['C0'] / B