3.1.6. cnfformula.families.pigeonhole module¶
Implementation of the pigeonhole principle formulas
-
class
BPHPCmdHelper
¶ Bases:
object
Command line helper for the Pigeonhole principle CNF
Methods
build_cnf
(args)Build a PHP formula according to the arguments setup_command_line
(parser)Setup the command line options for pigeonhole principle formula -
static
build_cnf
(args)¶ Build a PHP formula according to the arguments
Arguments: - args: command line options
-
description
= 'binary pigeonhole principle'¶
-
name
= 'bphp'¶
-
static
setup_command_line
(parser)¶ Setup the command line options for pigeonhole principle formula
Arguments: - parser: parser to load with options.
-
static
-
BinaryPigeonholePrinciple
(pigeons, holes)¶ Binary Pigeonhole Principle CNF formula
The pigeonhole principle claims that no M pigeons can sit in N pigeonholes without collision if M>N. This formula encodes the principle using binary strings to identify the holes.
Parameters: - pigeon : int
number of pigeons
- holes : int
number of holes
-
class
GPHPCmdHelper
¶ Command line helper for the Pigeonhole principle on graphs
Methods
build_cnf
(args)Build a Graph PHP formula according to the arguments setup_command_line
(parser)Setup the command line options for pigeonhole principle formula over graphs -
static
build_cnf
(args)¶ Build a Graph PHP formula according to the arguments
Arguments: - args: command line options
-
description
= 'graph pigeonhole principle'¶
-
name
= 'gphp'¶
-
static
setup_command_line
(parser)¶ Setup the command line options for pigeonhole principle formula over graphs
Arguments: - parser: parser to load with options.
-
static
-
GraphPigeonholePrinciple
(graph, functional=False, onto=False)¶ Graph Pigeonhole Principle CNF formula
The graph pigeonhole principle CNF formula, defined on a bipartite graph G=(L,R,E), claims that there is a subset E’ of the edges such that every vertex on the left size L has at least one incident edge in E’ and every edge on the right side R has at most one incident edge in E’.
This is possible only if the graph has a matching of size |L|.
There are different variants of this formula, depending on the values of functional and onto argument.
- PHP(G): each left vertex can be incident to multiple edges in E’
- FPHP(G): each left vertex must be incident to exaclty one edge in E’
- onto-PHP: all right vertices must be incident to some vertex
- matching: E’ must be a perfect matching between L and R
Arguments: - graph : bipartite graph - functional: add clauses to enforce at most one edge per left vertex - onto: add clauses to enforce that any right vertex has one incident edge
Remark: the graph vertices must have the ‘bipartite’ attribute set. Left vertices must have it set to 0 and the right ones to 1. A KeyException is raised otherwise.
-
class
PHPCmdHelper
¶ Bases:
object
Command line helper for the Pigeonhole principle CNF
Methods
build_cnf
(args)Build a PHP formula according to the arguments setup_command_line
(parser)Setup the command line options for pigeonhole principle formula -
static
build_cnf
(args)¶ Build a PHP formula according to the arguments
Arguments: - args: command line options
-
description
= 'pigeonhole principle'¶
-
name
= 'php'¶
-
static
setup_command_line
(parser)¶ Setup the command line options for pigeonhole principle formula
Arguments: - parser: parser to load with options.
-
static
-
PigeonholePrinciple
(pigeons, holes, functional=False, onto=False)¶ Pigeonhole Principle CNF formula
The pigeonhole principle claims that no M pigeons can sit in N pigeonholes without collision if M>N. The counterpositive CNF formulation requires such mapping to be satisfied. There are different variants of this formula, depending on the values of functional and onto argument.
- PHP: pigeon can sit in multiple holes
- FPHP: each pigeon sits in exactly one hole
- onto-PHP: pigeon can sit in multiple holes, every hole must be
- covered.
- Matching: one-to-one bijection between pigeons and holes.
Arguments: - pigeon: number of pigeons - hole: number of holes - functional: add clauses to enforce at most one hole per pigeon - onto: add clauses to enforce that any hole must have a pigeon
>>> print(PigeonholePrinciple(4,3).dimacs(export_header=False)) p cnf 12 22 1 2 3 0 4 5 6 0 7 8 9 0 10 11 12 0 -1 -4 0 -1 -7 0 -1 -10 0 -4 -7 0 -4 -10 0 -7 -10 0 -2 -5 0 -2 -8 0 -2 -11 0 -5 -8 0 -5 -11 0 -8 -11 0 -3 -6 0 -3 -9 0 -3 -12 0 -6 -9 0 -6 -12 0 -9 -12 0